aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend')
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend66
1 files changed, 66 insertions, 0 deletions
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
new file mode 100644
index 00000000..4db5f940
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
@@ -0,0 +1,66 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation
2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain
4import com.google.common.reflect.ClassPath
5import ecore.Ecore
6import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns
7import java.util.ArrayList
8import org.eclipse.emf.ecore.EObject
9import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification
10
11class ViolationCheck {
12 /**
13 * Return the total number of violations
14 */
15 def static int calculateViolationCounts(EObject root, Domain d){
16 var packageName = '';
17 if(d == Domain.Yakindumm){
18 packageName = 'constraints.yakindumm';
19 }else if (d == Domain.Ecore){
20 packageName = 'constraints.ecore';
21 }else if (d == Domain.Github){
22 return -1;
23 }
24
25 var constriants = loadConstraints(packageName);
26 var collections = new ConstraintCollection(constriants, Ecore.instance);
27 collections.addModel(root);
28 var results = collections.calculateViolations();
29 if(results.size > 0){
30 return results.get(0);
31 }else{
32 throw new IllegalArgumentException("Calculate Violation Failed");
33 }
34 }
35
36 /**
37 * return a map contain the count for each type of violation
38 */
39 def static violationMaps(EObject root){
40 var constriants = loadConstraints('hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu');
41 var collections = new ConstraintCollection(constriants, Patterns.instance);
42 collections.addModel(root);
43 var results = collections.calculateViolationMaps();
44 if(results.size > 0){
45 return results.get(0);
46 }else{
47 throw new IllegalArgumentException("Calculate Violation Failed");
48 }
49 }
50
51 def static loadConstraints(String packageName){
52 val constraints = new ArrayList<IConstraintSpecification>();
53
54 val classPath = ClassPath.from(ClassLoader.systemClassLoader);
55 val classInfos = classPath.getTopLevelClasses(packageName);
56 for(info : classInfos){
57 if(info.load.interfaces.contains(IConstraintSpecification)){
58 //IConstraintSpecification only has one constructor with empty argument list
59 var constructor = info.load.constructors.get(0);
60 var instance = constructor.newInstance();
61 constraints.add(instance as IConstraintSpecification);
62 }
63 }
64 return constraints
65 }
66}