diff options
Diffstat (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution')
7 files changed, 454 insertions, 0 deletions
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/Context.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/Context.xtend new file mode 100644 index 00000000..8f72caed --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/Context.xtend | |||
@@ -0,0 +1,18 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution | ||
2 | |||
3 | import java.io.OutputStream | ||
4 | import java.util.LinkedList | ||
5 | import java.util.List | ||
6 | import java.io.FileWriter | ||
7 | import org.eclipse.xtend.lib.annotations.Accessors | ||
8 | |||
9 | class Context { | ||
10 | @Accessors(PUBLIC_GETTER,PUBLIC_SETTER) | ||
11 | var boolean printToConsole = true | ||
12 | |||
13 | def writeError(Object object) { | ||
14 | if(printToConsole) { | ||
15 | println(object) | ||
16 | } | ||
17 | } | ||
18 | } \ No newline at end of file | ||
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ExecuteScript.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ExecuteScript.xtend new file mode 100644 index 00000000..403d00d8 --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ExecuteScript.xtend | |||
@@ -0,0 +1,25 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution | ||
2 | |||
3 | import org.apache.log4j.Logger | ||
4 | import org.apache.log4j.LogManager | ||
5 | import org.apache.log4j.Level | ||
6 | import java.io.PrintStream | ||
7 | import java.io.OutputStream | ||
8 | import java.io.BufferedWriter | ||
9 | import java.io.Writer | ||
10 | |||
11 | class ExecuteScript { | ||
12 | def static void main(String[] args) { | ||
13 | val Logger logger = LogManager.getLogger(ExecuteScript); | ||
14 | logger.level = Level::DEBUG | ||
15 | |||
16 | println() | ||
17 | System.out.println("asd") | ||
18 | |||
19 | logger.debug("debug") | ||
20 | logger.info("info") | ||
21 | logger.warn("warning") | ||
22 | logger.error("error") | ||
23 | logger.fatal("fatal") | ||
24 | } | ||
25 | } \ No newline at end of file | ||
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/Executor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/Executor.xtend new file mode 100644 index 00000000..4d887423 --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/Executor.xtend | |||
@@ -0,0 +1,95 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript | ||
4 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.Task | ||
5 | import java.util.HashMap | ||
6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.GenerationTask | ||
7 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.Metamodel | ||
8 | import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace | ||
9 | import java.util.List | ||
10 | import org.eclipse.emf.ecore.EClass | ||
11 | import org.eclipse.emf.ecore.EEnumLiteral | ||
12 | import org.eclipse.emf.ecore.EReference | ||
13 | import org.eclipse.emf.ecore.EEnum | ||
14 | import org.eclipse.emf.ecore.EAttribute | ||
15 | import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor | ||
16 | import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace | ||
17 | import org.eclipse.emf.ecore.EObject | ||
18 | import java.util.LinkedHashMap | ||
19 | import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor | ||
20 | import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic | ||
21 | import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic | ||
22 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic | ||
23 | import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration | ||
24 | import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration | ||
25 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration | ||
26 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeInferenceMethod | ||
27 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.StateCoderStrategy | ||
28 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner | ||
29 | import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult | ||
30 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | ||
31 | import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult | ||
32 | import org.eclipse.emf.ecore.resource.Resource | ||
33 | import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl | ||
34 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml | ||
35 | import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolverConfiguration | ||
36 | import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolver | ||
37 | import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore | ||
38 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner | ||
39 | import java.util.LinkedList | ||
40 | import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualisation | ||
41 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicStructureBuilder | ||
42 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder | ||
43 | import org.eclipse.emf.ecore.util.EcoreUtil | ||
44 | import org.eclipse.xtext.EcoreUtil2 | ||
45 | import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl | ||
46 | import org.eclipse.emf.ecore.resource.ResourceSet | ||
47 | import org.eclipse.emf.common.util.URI | ||
48 | import org.eclipse.emf.ecore.EPackage | ||
49 | |||
50 | class Executor { | ||
51 | public def void execute(ConfigurationScript configurationScript) { | ||
52 | val tasks = configurationScript.commands.filter(Task) | ||
53 | val numberOfModels = tasks.map[it.calculateTaskSteps].reduce[p1, p2|p1+p2] | ||
54 | } | ||
55 | |||
56 | def private dispatch calculateTaskSteps(Task task) { | ||
57 | throw new UnsupportedOperationException() | ||
58 | } | ||
59 | def private dispatch calculateTaskSteps(GenerationTask task) { | ||
60 | return task.number * task.runs | ||
61 | } | ||
62 | |||
63 | def private dispatch executeTask(Task task) { | ||
64 | throw new UnsupportedOperationException() | ||
65 | } | ||
66 | def private dispatch executeTask(GenerationTask generationTask) { | ||
67 | val metamodel = generationTask.metamodel | ||
68 | if(metamodel != null) { | ||
69 | |||
70 | } | ||
71 | } | ||
72 | |||
73 | def protected loadPackage(ResourceSet rs, String path) { | ||
74 | var EObject content = null | ||
75 | |||
76 | try { | ||
77 | val resource = rs.getResource(URI.createURI(path),true) | ||
78 | content = resource.contents.get(0) | ||
79 | } catch(IllegalArgumentException e) { | ||
80 | return null | ||
81 | } catch(RuntimeException e) { | ||
82 | return null | ||
83 | } | ||
84 | |||
85 | if(content instanceof EPackage) { | ||
86 | |||
87 | } else return null | ||
88 | } | ||
89 | |||
90 | def loadPatternModel(ResourceSet rs, String path) { | ||
91 | var model = null | ||
92 | |||
93 | |||
94 | } | ||
95 | } | ||
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/MetamodelLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/MetamodelLoader.xtend new file mode 100644 index 00000000..126dbb7d --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/MetamodelLoader.xtend | |||
@@ -0,0 +1,178 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ClassElement | ||
4 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.FeatureElement | ||
5 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelEntry | ||
6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelSpecification | ||
7 | import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor | ||
8 | import java.util.ArrayList | ||
9 | import java.util.HashMap | ||
10 | import java.util.LinkedList | ||
11 | import java.util.List | ||
12 | import java.util.Map | ||
13 | import java.util.Set | ||
14 | import org.eclipse.emf.common.util.URI | ||
15 | import org.eclipse.emf.ecore.EAttribute | ||
16 | import org.eclipse.emf.ecore.EClass | ||
17 | import org.eclipse.emf.ecore.EDataType | ||
18 | import org.eclipse.emf.ecore.EEnum | ||
19 | import org.eclipse.emf.ecore.EEnumLiteral | ||
20 | import org.eclipse.emf.ecore.ENamedElement | ||
21 | import org.eclipse.emf.ecore.EPackage | ||
22 | import org.eclipse.emf.ecore.EReference | ||
23 | import org.eclipse.emf.ecore.EcorePackage | ||
24 | import org.eclipse.emf.ecore.resource.Resource | ||
25 | import org.eclipse.emf.ecore.resource.ResourceSet | ||
26 | import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl | ||
27 | import org.eclipse.xtend.lib.annotations.Data | ||
28 | |||
29 | @Data | ||
30 | class Metamodel { | ||
31 | List<EPackage> packages | ||
32 | EcoreMetamodelDescriptor descriptor | ||
33 | } | ||
34 | |||
35 | class MetamodelLoader { | ||
36 | |||
37 | def private static init() { | ||
38 | EcorePackage.eINSTANCE.EClass | ||
39 | Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("ecore",new XMIResourceFactoryImpl) | ||
40 | } | ||
41 | |||
42 | public new() { init } | ||
43 | |||
44 | def loadMetamodel(List<String> specification, ResourceSet rs, Context context) { | ||
45 | |||
46 | } | ||
47 | |||
48 | def loadMetamodel(MetamodelSpecification specification, ResourceSet rs, Context context) { | ||
49 | val Map<MetamodelEntry,List<EPackage>> entry2Packages = new HashMap | ||
50 | |||
51 | for(entry : specification.entries) { | ||
52 | val packagesInEntry = entry.path.path.loadPackageFromPath(rs,context) | ||
53 | entry2Packages.put(entry,packagesInEntry) | ||
54 | } | ||
55 | |||
56 | return entry2Packages | ||
57 | } | ||
58 | |||
59 | public def pruneMetamodel(Map<MetamodelEntry,List<EPackage>> specification, ResourceSet rs, Context context) { | ||
60 | val List<EClass> classes = new LinkedList | ||
61 | val List<EEnum> enums = new LinkedList | ||
62 | val List<EEnumLiteral> literals = new LinkedList | ||
63 | val List<EReference> references = new LinkedList | ||
64 | val List<EAttribute> attributes = new LinkedList | ||
65 | |||
66 | |||
67 | /** Add all included types */ | ||
68 | for(entry : specification.entrySet) { | ||
69 | val metamodelEntry = entry.key | ||
70 | val packages = entry.value | ||
71 | |||
72 | /** Excluted types */ | ||
73 | val excludedTypeNames = metamodelEntry.excluding.filter(ClassElement).map[name].toSet | ||
74 | /** Excluded features */ | ||
75 | val excludedFeatureNames = metamodelEntry.excluding.filter(FeatureElement).map[it.container.name -> it.name].toSet | ||
76 | |||
77 | /** Load the types */ | ||
78 | for(package : packages) { | ||
79 | for(class : package.EClassifiers.filter(EClass)) { | ||
80 | classes.addIfNotExcluded(class,excludedTypeNames) | ||
81 | } | ||
82 | for(enum : package.EClassifiers.filter(EEnum)) { | ||
83 | val added = enums.addIfNotExcluded(enum,excludedTypeNames) | ||
84 | if(added) { | ||
85 | for(literal : enum.ELiterals) { | ||
86 | literals.addIfNotExcluded(literal,enum,excludedFeatureNames) | ||
87 | } | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | } | ||
92 | |||
93 | /** Add all included references and attributes*/ | ||
94 | for(entry : specification.entrySet) { | ||
95 | val metamodelEntry = entry.key | ||
96 | val packages = entry.value | ||
97 | |||
98 | /** Excluded features */ | ||
99 | val excludedFeatureNames = metamodelEntry.excluding.filter(FeatureElement).map[it.container.name -> it.name].toSet | ||
100 | |||
101 | /** See if type is included */ | ||
102 | for(package : packages) { | ||
103 | for(class : package.EClassifiers.filter(EClass)) { | ||
104 | if(classes.contains(class)) { | ||
105 | for(reference : class.EReferences) { | ||
106 | if(classes.contains(reference.EType)) { | ||
107 | references.addIfNotExcluded(reference,class,excludedFeatureNames) | ||
108 | } | ||
109 | } | ||
110 | for(attribute : class.EAttributes) { | ||
111 | val type = attribute.EType | ||
112 | if(type instanceof EEnum) { | ||
113 | if(enums.contains(type)) { | ||
114 | attributes.addIfNotExcluded(attribute,class,excludedFeatureNames) | ||
115 | } else if(type == EcorePackage.Literals) { | ||
116 | if(enums.contains(type)) { | ||
117 | attributes.addIfNotExcluded(attribute,class,excludedFeatureNames) | ||
118 | } | ||
119 | } | ||
120 | } else if(supportedEDataType(type as EDataType)) { | ||
121 | attributes.addIfNotExcluded(attribute,class,excludedFeatureNames) | ||
122 | } | ||
123 | } | ||
124 | } | ||
125 | } | ||
126 | } | ||
127 | } | ||
128 | } | ||
129 | |||
130 | private def supportedEDataType(EDataType dataType) { | ||
131 | val extension l = EcorePackage.eINSTANCE | ||
132 | return #[EInt, EBoolean, EString, EDouble, EFloat].contains(dataType) | ||
133 | } | ||
134 | |||
135 | private def <T extends ENamedElement> addIfNotExcluded( | ||
136 | List<T> target, | ||
137 | T element, | ||
138 | Set<String> excluded) | ||
139 | { | ||
140 | if(excluded.contains(element.name)) { | ||
141 | target += element | ||
142 | return true | ||
143 | } else { | ||
144 | return false | ||
145 | } | ||
146 | } | ||
147 | private def <T1 extends ENamedElement> addIfNotExcluded( | ||
148 | List<T1> target, | ||
149 | T1 element, | ||
150 | ENamedElement container, | ||
151 | Set<Pair<String,String>> excluded) | ||
152 | { | ||
153 | val pair = (container.name) -> (element.name) | ||
154 | |||
155 | if(excluded.contains(pair)) { | ||
156 | target += element | ||
157 | } | ||
158 | } | ||
159 | |||
160 | private def List<EPackage> loadPackageFromPath(String path, ResourceSet rs, Context context) throws RuntimeException { | ||
161 | var Resource resource; | ||
162 | try{ | ||
163 | resource = rs.getResource(URI.createURI(path),true) | ||
164 | } catch(RuntimeException e) { | ||
165 | context.writeError('''Unable to load EPackage: Error in path "«path»"!''') | ||
166 | return #[] | ||
167 | } | ||
168 | val res = new ArrayList<EPackage>(resource.contents.size) | ||
169 | for(content: resource.contents) { | ||
170 | if(content instanceof EPackage) { | ||
171 | res += content | ||
172 | } else { | ||
173 | context.writeError('''Unable to load EPackage: The content of "«path»" is not an EPackage, but "«content.eClass.name»"!''') | ||
174 | } | ||
175 | } | ||
176 | return res | ||
177 | } | ||
178 | } \ No newline at end of file | ||
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ModelLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ModelLoader.xtend new file mode 100644 index 00000000..1de7ee22 --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ModelLoader.xtend | |||
@@ -0,0 +1,11 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution | ||
2 | |||
3 | class ModelLoader { | ||
4 | //def loadMetamodels()7 | ||
5 | // val List<EClass> classes = new LinkedList | ||
6 | // val List<EReference> references = new LinkedList | ||
7 | // val List<EAttribute> attributes = new LinkedList | ||
8 | // val List<EEnum> enums = new LinkedList | ||
9 | // val List<EEnumLiteral> literals = new LinkedList | ||
10 | // | ||
11 | } \ No newline at end of file | ||
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend new file mode 100644 index 00000000..8c064cd3 --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend | |||
@@ -0,0 +1,28 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternSpecification | ||
4 | import hu.bme.mit.inf.dslreasoner.application.execution.util.VQLParser | ||
5 | import java.util.LinkedHashMap | ||
6 | import org.eclipse.emf.ecore.resource.ResourceSet | ||
7 | |||
8 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
9 | |||
10 | class QueryLoader { | ||
11 | val parser = new VQLParser | ||
12 | |||
13 | def loadQueries(PatternSpecification specification, ResourceSet rs, Context context) { | ||
14 | val uris = specification.entries.map[path].toList | ||
15 | val models = parser.parse(uris,rs,context) | ||
16 | |||
17 | val res = new LinkedHashMap | ||
18 | for(entry : specification.entries) { | ||
19 | res.put(entry,entry.path.lookup(models)) | ||
20 | } | ||
21 | |||
22 | return res | ||
23 | } | ||
24 | |||
25 | def pruneQueries(PatternSpecification specification, ResourceSet rs, Context context) { | ||
26 | |||
27 | } | ||
28 | } \ No newline at end of file | ||
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/VQLParser.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/VQLParser.xtend new file mode 100644 index 00000000..9b5c538f --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/VQLParser.xtend | |||
@@ -0,0 +1,99 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution.util | ||
2 | |||
3 | import com.google.inject.Guice | ||
4 | import com.google.inject.Injector | ||
5 | import com.google.inject.Module | ||
6 | import java.util.LinkedHashMap | ||
7 | import org.eclipse.emf.common.util.URI | ||
8 | import org.eclipse.emf.ecore.resource.Resource | ||
9 | import org.eclipse.emf.ecore.resource.ResourceSet | ||
10 | import org.eclipse.emf.ecore.util.EcoreUtil | ||
11 | import org.eclipse.viatra.query.patternlanguage.PatternLanguageStandaloneSetup | ||
12 | import org.eclipse.viatra.query.patternlanguage.annotations.ExtensionBasedAnnotationValidatorLoader | ||
13 | import org.eclipse.viatra.query.patternlanguage.annotations.IAnnotationValidatorLoader | ||
14 | import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageRuntimeModule | ||
15 | import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup | ||
16 | import org.eclipse.viatra.query.patternlanguage.emf.GenmodelExtensionLoader | ||
17 | import org.eclipse.viatra.query.patternlanguage.emf.IGenmodelMappingLoader | ||
18 | import org.eclipse.viatra.query.patternlanguage.emf.eMFPatternLanguage.PatternModel | ||
19 | import org.eclipse.viatra.query.patternlanguage.emf.specification.SpecificationBuilder | ||
20 | import org.eclipse.xtext.resource.XtextResourceSet | ||
21 | import hu.bme.mit.inf.dslreasoner.application.execution.Context | ||
22 | import java.util.List | ||
23 | import java.util.HashMap | ||
24 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification | ||
25 | |||
26 | class MyModule extends EMFPatternLanguageRuntimeModule implements Module { | ||
27 | def public Class<? extends IAnnotationValidatorLoader> bindAnnotationValidatorLoader() { | ||
28 | return typeof(ExtensionBasedAnnotationValidatorLoader); | ||
29 | } | ||
30 | def public Class<? extends IGenmodelMappingLoader> bindGenmodelMappingLoader() { | ||
31 | return typeof(GenmodelExtensionLoader); | ||
32 | } | ||
33 | } | ||
34 | |||
35 | class VQLParser { | ||
36 | val Injector injector; | ||
37 | val SpecificationBuilder builder = new SpecificationBuilder | ||
38 | |||
39 | new() { | ||
40 | PatternLanguageStandaloneSetup.doSetup | ||
41 | EMFPatternLanguageStandaloneSetup.doSetup; | ||
42 | |||
43 | injector = internalCreateInjector | ||
44 | } | ||
45 | |||
46 | def protected Injector internalCreateInjector() { | ||
47 | new EMFPatternLanguageStandaloneSetup().createInjectorAndDoEMFRegistration(); | ||
48 | val Module module = new MyModule | ||
49 | val newInjector = Guice.createInjector(module) | ||
50 | return newInjector; | ||
51 | } | ||
52 | |||
53 | public def createResourceSet() { | ||
54 | injector.getInstance(XtextResourceSet); | ||
55 | } | ||
56 | |||
57 | /** | ||
58 | * Load patterns in two steps: first, the pattern models are are loaded to a resource set, then | ||
59 | * the linked patterns are loaded validated and translated to a {@link IQuerySpecification} object. | ||
60 | * @returns uri -> (name -> pattern) | ||
61 | */ | ||
62 | public def parse(List<String> uris, ResourceSet resourceSet, Context context) { | ||
63 | val res = new LinkedHashMap | ||
64 | val uri2resource = new LinkedHashMap | ||
65 | |||
66 | for(uri : uris) { | ||
67 | var Resource resource | ||
68 | var PatternModel patternModel | ||
69 | try { | ||
70 | resource = resourceSet.getResource(URI.createURI(uri),true); | ||
71 | patternModel = resource.getContents().get(0) as PatternModel; | ||
72 | uri2resource.put(uri,patternModel) | ||
73 | } catch(RuntimeException e) { | ||
74 | context.writeError('''Unable to load patterns from "«uri»"!''') | ||
75 | } | ||
76 | } | ||
77 | |||
78 | for(entry : uri2resource.entrySet) { | ||
79 | val uri = entry.key | ||
80 | val model = entry.value | ||
81 | EcoreUtil.resolveAll(model.eResource) | ||
82 | model.eResource.validate(uri, context) | ||
83 | |||
84 | val map = new LinkedHashMap | ||
85 | for(pattern : model.patterns) { | ||
86 | val IQuerySpecification<?> querySpecification = (this.builder as SpecificationBuilder).getOrCreateSpecification(pattern) | ||
87 | map.put(querySpecification.fullyQualifiedName.split('.').last,querySpecification) | ||
88 | } | ||
89 | res.put(uri,map) | ||
90 | } | ||
91 | |||
92 | return res | ||
93 | } | ||
94 | |||
95 | def private validate(Resource resource, String URI, Context context) { | ||
96 | val errors = resource.errors | ||
97 | errors.forEach[context.writeError('''Error in loading pattern "«URI»": «it»''')] | ||
98 | } | ||
99 | } \ No newline at end of file | ||