1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app
import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph
import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter
import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader
import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation.ViolationCheck
import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl
import java.io.File
import java.util.ArrayList
import org.eclipse.emf.ecore.EPackage
import org.eclipse.emf.ecore.EcorePackage
import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine
import org.eclipse.emf.ecore.impl.EcorePackageImpl
import org.eclipse.emf.ecore.EReference
//import yakindumm2.impl.Yakindumm2PackageImpl
class Main {
var static Domain d = Domain.Yakindumm;
val static String suffix = '.xmi'
val static String OUTPUT_FOLDER = "Inputs/yakindumm/human/humanInput100/";
val static String INPUT_FOLDER = "outputs/Human/";
val static int NUM_RUNS = 100;
static class RWInformation{
public var String inputFolder;
public var String outputFolder;
public var int numRuns;
new(String inputFolder, String outputFolder, int numRuns){
this.inputFolder = inputFolder;
this.outputFolder = outputFolder;
this.numRuns = numRuns;
}
}
def static void main(String[] args){
//init model
var EPackage metamodel;
//init viatra engine for the violation checker
ReteEngine.getClass();
if(d == Domain.Yakindumm){
YakindummPackageImpl.eINSTANCE.eClass;
metamodel = YakindummPackageImpl.eINSTANCE;
}else if (d == Domain.Ecore){
EcorePackage.eINSTANCE.eClass;
metamodel = EcorePackageImpl.eINSTANCE;
}else if (d == Domain.Github){
//TODO: Initialize Github Package
}
println("Start Reading Models...");
var reader = new GraphReader(metamodel, suffix);
val models = new RWInformation(OUTPUT_FOLDER, INPUT_FOLDER, NUM_RUNS);
calculateAllModels(models.inputFolder, models.outputFolder,models.numRuns, reader);
println("finished");
}
static def calculateAllModels(String inputFolder, String outputFolder, int numRuns, GraphReader reader){
(new File(outputFolder)).mkdir();
for(var i = 1; i <= numRuns; i++){
val models = new ArrayList<EMFGraph>();
models.addAll(reader.readModels(inputFolder + "run" + i));
for(model : models){
calculateAndOutputMetrics(model, YakindummPackageImpl.eNAME, outputFolder+model.name+"_run_"+i+".csv");
}
}
println("output results Ended for: " + outputFolder);
}
static def calculateAndOutputMetrics(EMFGraph model, String metaModel, String fileName){
//println("evaluating for " + model.name);
model.metaModel = metaModel;
//remove eGenericType for Ecore domain
if(d == Domain.Ecore){
var refsToRemove = EcorePackageImpl.eINSTANCE.eAllContents.filter(EReference).filter[
it.name.equals('eGenericType') || it.name.equals('eGenericSuperTypes') || it.name.equals('eFactoryInstance')||
it.name.equals('eGenericExceptions') || it.name.equals('references') || it.name.equals('contents');
];
refsToRemove.forEach[model.removeReference(it)];
}
var outputs = model.evaluateAllMetrics();
var violations = ViolationCheck.calculateViolationCounts(model.root, d);
println(violations);
var violationsOutput = newArrayList('violations', violations+'');
outputs.add(violationsOutput);
CsvFileWriter.write(outputs, fileName);
}
}
|