diff options
Diffstat (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit')
21 files changed, 714 insertions, 687 deletions
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext index 6af31723..537989f7 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext | |||
@@ -5,177 +5,314 @@ import "http://www.eclipse.org/viatra/query/patternlanguage/emf/PatternLanguage" | |||
5 | generate applicationConfiguration "http://www.bme.hu/mit/inf/dslreasoner/application/ApplicationConfiguration" | 5 | generate applicationConfiguration "http://www.bme.hu/mit/inf/dslreasoner/application/ApplicationConfiguration" |
6 | 6 | ||
7 | ConfigurationScript: | 7 | ConfigurationScript: |
8 | (imports += Import)* | 8 | (imports+=Import)* |
9 | (commands += Command)* | 9 | (commands+=Command)*; |
10 | ; | ||
11 | 10 | ||
12 | Command : | 11 | Command: |
13 | Declaration | Task | 12 | Declaration | Task; |
14 | ; | ||
15 | 13 | ||
16 | QualifiedName returns ecore::EString: | 14 | QualifiedName returns ecore::EString: |
17 | ID ('.' ID)*; | 15 | ID ('.' ID)*; |
18 | REALLiteral returns ecore::EBigDecimal: '-'? INT '.' INT; | 16 | |
19 | INTLiteral returns ecore::EInt: '-'? INT; | 17 | REALLiteral returns ecore::EBigDecimal: |
18 | '-'? INT '.' INT; | ||
19 | |||
20 | INTLiteral returns ecore::EInt: | ||
21 | '-'? INT; | ||
20 | 22 | ||
21 | /////////////////////////////////////////////////// | 23 | /////////////////////////////////////////////////// |
22 | // Imports | 24 | // Imports |
23 | /////////////////////////////////////////////////// | 25 | /////////////////////////////////////////////////// |
26 | Import: | ||
27 | EPackageImport | ViatraImport; | ||
24 | 28 | ||
25 | Import: EPackageImport | ViatraImport; | 29 | EPackageImport: |
30 | "import" "epackage" importedPackage=[ecore::EPackage|STRING]; | ||
26 | 31 | ||
27 | EPackageImport: "import" "epackage" importedPackage=[ecore::EPackage|STRING]; | 32 | ViatraImport: |
28 | ViatraImport: "import" "viatra" importedViatra=[viatra::PatternModel|STRING]; | 33 | "import" "viatra" importedViatra=[viatra::PatternModel|STRING]; |
29 | 34 | ||
30 | /////////////////////////////////////////////////// | 35 | /////////////////////////////////////////////////// |
31 | // Declaration | 36 | // Declaration |
32 | /////////////////////////////////////////////////// | 37 | /////////////////////////////////////////////////// |
33 | 38 | Declaration: | |
34 | Declaration : | ||
35 | FileDeclaration | 39 | FileDeclaration |
36 | | MetamodelDeclaration | 40 | | MetamodelDeclaration |
37 | | PartialModelDeclaration | 41 | | PartialModelDeclaration |
38 | | GraphPatternDeclaration | 42 | | GraphPatternDeclaration |
39 | | ConfigDeclaration | 43 | | ConfigDeclaration |
40 | | ScopeDeclaration | 44 | | ScopeDeclaration |
41 | ; | 45 | | ObjectiveDeclaration; |
42 | 46 | ||
43 | /////////////////////////////////////////////////// | 47 | /////////////////////////////////////////////////// |
44 | // Files and Folders | 48 | // Files and Folders |
45 | /////////////////////////////////////////////////// | 49 | /////////////////////////////////////////////////// |
50 | FileSpecification: | ||
51 | path=STRING; | ||
52 | |||
53 | FileDeclaration: | ||
54 | 'file' name=ID '=' specification=FileSpecification; | ||
46 | 55 | ||
47 | FileSpecification: path = STRING; | 56 | FileReference: |
48 | FileDeclaration: 'file' name = ID '=' specification = FileSpecification; | 57 | referred=[FileDeclaration]; |
49 | FileReference: referred = [FileDeclaration]; | 58 | |
50 | File: FileSpecification | FileReference; | 59 | File: |
60 | FileSpecification | FileReference; | ||
51 | 61 | ||
52 | /////////////////////////////////////////////////// | 62 | /////////////////////////////////////////////////// |
53 | // Metamodel | 63 | // Metamodel |
54 | /////////////////////////////////////////////////// | 64 | /////////////////////////////////////////////////// |
65 | MetamodelSpecification: | ||
66 | '{' (entries+=MetamodelEntry) (',' entries+=MetamodelEntry)* '}'; | ||
67 | |||
68 | MetamodelEntry: | ||
69 | MetamodelElement | AllPackageEntry; | ||
70 | |||
71 | AllPackageEntry: | ||
72 | "package" package=[ecore::EPackage|QualifiedName] ("excluding" '{' exclusion+=MetamodelElement (',' | ||
73 | exclusion+=MetamodelElement)* '}')?; | ||
74 | |||
75 | MetamodelElement: | ||
76 | (package=[ecore::EPackage|QualifiedName] '::')? classifier=[ecore::EClassifier] ('.' | ||
77 | feature=[ecore::ENamedElement])?; | ||
55 | 78 | ||
56 | MetamodelSpecification: '{' (entries += MetamodelEntry) (',' entries += MetamodelEntry)* '}'; | 79 | MetamodelDeclaration: |
57 | MetamodelEntry: MetamodelElement | AllPackageEntry; | 80 | 'metamodel' name=ID specification=MetamodelSpecification; |
58 | AllPackageEntry: "package" package=[ecore::EPackage|QualifiedName] ("excluding" '{'exclusion +=MetamodelElement (',' exclusion +=MetamodelElement)*'}')?; | ||
59 | MetamodelElement: (package=[ecore::EPackage|QualifiedName] '::')? classifier = [ecore::EClassifier] ('.' feature= [ecore::ENamedElement])?; | ||
60 | 81 | ||
61 | MetamodelDeclaration: 'metamodel' name = ID specification = MetamodelSpecification; | 82 | MetamodelReference: |
62 | MetamodelReference: referred = [MetamodelDeclaration]; | 83 | referred=[MetamodelDeclaration]; |
63 | Metamodel: MetamodelReference | MetamodelSpecification; | 84 | |
85 | Metamodel: | ||
86 | MetamodelReference | MetamodelSpecification; | ||
64 | 87 | ||
65 | /////////////////////////////////////////////////// | 88 | /////////////////////////////////////////////////// |
66 | // Partial Model | 89 | // Partial Model |
67 | /////////////////////////////////////////////////// | 90 | /////////////////////////////////////////////////// |
91 | PartialModelSpecification: | ||
92 | '{' entry+=PartialModelEntry (',' entry+=PartialModelEntry)? '}'; | ||
93 | |||
94 | PartialModelEntry: | ||
95 | ModelEntry | FolderEntry; | ||
96 | |||
97 | ModelEntry: | ||
98 | path=File; | ||
99 | |||
100 | FolderEntry: | ||
101 | "folder" path=File ("excluding" "{" exclusion+=ModelEntry ("," exclusion+=ModelEntry)* "}")?; | ||
102 | |||
103 | PartialModelDeclaration: | ||
104 | 'models' name=ID specification=PartialModelSpecification; | ||
68 | 105 | ||
69 | PartialModelSpecification: '{' entry += PartialModelEntry (',' entry += PartialModelEntry)? '}'; | 106 | PartialModelReference: |
70 | PartialModelEntry: ModelEntry | FolderEntry; | 107 | referred=[PartialModelDeclaration]; |
71 | ModelEntry: path = File; | ||
72 | FolderEntry: "folder" path = File ("excluding" "{" exclusion += ModelEntry ("," exclusion += ModelEntry)* "}")?; | ||
73 | 108 | ||
74 | PartialModelDeclaration: 'models' name = ID specification = PartialModelSpecification; | 109 | PartialModel: |
75 | PartialModelReference : referred = [PartialModelDeclaration]; | 110 | PartialModelSpecification | PartialModelReference; |
76 | PartialModel: PartialModelSpecification | PartialModelReference; | ||
77 | 111 | ||
78 | /////////////////////////////////////////////////// | 112 | /////////////////////////////////////////////////// |
79 | // Patterns | 113 | // Patterns |
80 | /////////////////////////////////////////////////// | 114 | /////////////////////////////////////////////////// |
115 | PatternSpecification: | ||
116 | '{' entries+=PatternEntry (',' entries+=PatternEntry)* '}'; | ||
117 | |||
118 | PatternEntry: | ||
119 | PatternElement | AllPatternEntry; | ||
120 | |||
121 | AllPatternEntry: | ||
122 | 'package' package=[viatra::PatternModel|QualifiedName] ('excluding' '{' exclusuion+=PatternElement (',' | ||
123 | exclusuion+=PatternElement)* '}')?; | ||
124 | |||
125 | PatternElement: | ||
126 | (package=[viatra::PatternModel|QualifiedName] '::')? pattern=[viatra::Pattern]; | ||
127 | |||
128 | GraphPatternDeclaration: | ||
129 | 'constraints' name=ID specification=PatternSpecification; | ||
130 | |||
131 | GraphPatternReference: | ||
132 | referred=[GraphPatternDeclaration]; | ||
133 | |||
134 | GraphPattern: | ||
135 | GraphPatternReference | PatternSpecification; | ||
136 | |||
137 | /////////////////////////////////////////////////// | ||
138 | // Objectives | ||
139 | /////////////////////////////////////////////////// | ||
140 | ObjectiveSpecification: | ||
141 | '{' entries+=ObjectiveEntry (',' entries+=ObjectiveEntry)* '}'; | ||
142 | |||
143 | ObjectiveEntry: | ||
144 | OptimizationEntry | ThresholdEntry; | ||
145 | |||
146 | enum OptimizationDirection: | ||
147 | MINIMIZE='minimize' | MAXIMIZE='maximize'; | ||
148 | |||
149 | OptimizationEntry: | ||
150 | direction=OptimizationDirection function=ObjectiveFunction; | ||
151 | |||
152 | enum ComparisonOperator: | ||
153 | LESS='<' | GREATER='>' | LESS_EQUALS='<=' | GREATER_EQUALS='>='; | ||
81 | 154 | ||
82 | PatternSpecification: '{' entries += PatternEntry (',' entries += PatternEntry)* '}'; | 155 | ThresholdEntry: |
83 | PatternEntry: PatternElement | AllPatternEntry; | 156 | function=ObjectiveFunction operator=ComparisonOperator threshold=REALLiteral; |
84 | AllPatternEntry: 'package' package = [viatra::PatternModel|QualifiedName] ('excluding' '{' exclusuion += PatternElement (',' exclusuion += PatternElement)* '}')?; | ||
85 | PatternElement: (package =[viatra::PatternModel|QualifiedName] '::')? pattern = [viatra::Pattern]; | ||
86 | 157 | ||
87 | GraphPatternDeclaration: 'constraints' name = ID specification = PatternSpecification; | 158 | ObjectiveFunction: |
88 | GraphPatternReference: referred = [GraphPatternDeclaration]; | 159 | CostObjectiveFunction; |
89 | GraphPattern: GraphPatternReference|PatternSpecification; | 160 | |
161 | CostObjectiveFunction: | ||
162 | 'cost' '{' entries+=CostEntry (',' entries+=CostEntry)* '}'; | ||
163 | |||
164 | CostEntry: | ||
165 | patternElement=PatternElement '=' weight=INTLiteral; | ||
166 | |||
167 | ObjectiveDeclaration: | ||
168 | 'objectives' name=ID specification=ObjectiveSpecification; | ||
169 | |||
170 | ObjectiveReference: | ||
171 | referred=[ObjectiveDeclaration]; | ||
172 | |||
173 | Objective: | ||
174 | ObjectiveReference | ObjectiveSpecification; | ||
90 | 175 | ||
91 | /////////////////////////////////////////////////// | 176 | /////////////////////////////////////////////////// |
92 | // SolverConfig | 177 | // SolverConfig |
93 | /////////////////////////////////////////////////// | 178 | /////////////////////////////////////////////////// |
179 | ConfigSpecification: | ||
180 | {ConfigSpecification} '{' | ||
181 | (entries+=ConfigEntry ("," entries+=ConfigEntry)*)? | ||
182 | '}'; | ||
183 | |||
184 | ConfigDeclaration: | ||
185 | 'config' name=ID specification=ConfigSpecification; | ||
186 | |||
187 | ConfigEntry: | ||
188 | DocumentationEntry | RuntimeEntry | MemoryEntry | CustomEntry; | ||
189 | |||
190 | DocumentationEntry: | ||
191 | "log-level" '=' level=DocumentLevelSpecification; | ||
94 | 192 | ||
95 | ConfigSpecification: {ConfigSpecification}'{' | 193 | enum DocumentLevelSpecification: |
96 | (entries += ConfigEntry ("," entries += ConfigEntry)*)? | 194 | none | normal | full; |
195 | |||
196 | RuntimeEntry: | ||
197 | "runtime" "=" millisecLimit=INT; | ||
198 | |||
199 | MemoryEntry: | ||
200 | "memory" "=" megabyteLimit=INT; | ||
201 | |||
202 | CustomEntry: | ||
203 | key=STRING "=" value=STRING; | ||
204 | |||
205 | ConfigReference: | ||
206 | config=[ConfigDeclaration]; | ||
207 | |||
208 | Config: | ||
209 | ConfigSpecification | ConfigReference; | ||
210 | |||
211 | enum Solver: | ||
212 | SMTSolver | AlloySolver | ViatraSolver; | ||
213 | |||
214 | ScopeSpecification: | ||
215 | {ScopeSpecification} '{' | ||
216 | (scopes+=TypeScope (',' scopes+=TypeScope)*)? | ||
97 | '}'; | 217 | '}'; |
98 | ConfigDeclaration : | 218 | |
99 | 'config' name = ID specification = ConfigSpecification | 219 | TypeScope: |
100 | ; | 220 | ClassTypeScope | ObjectTypeScope | IntegerTypeScope | RealTypeScope | StringTypeScope; |
101 | ConfigEntry: DocumentationEntry | RuntimeEntry | MemoryEntry | CustomEntry; | 221 | |
102 | DocumentationEntry: "log-level" '=' level = DocumentLevelSpecification; enum DocumentLevelSpecification: none | normal | full; | 222 | ClassTypeScope: |
103 | RuntimeEntry: "runtime" "=" millisecLimit = INT; | 223 | '#' type=ClassReference |
104 | MemoryEntry: "memory" "=" megabyteLimit = INT; | 224 | (setsNew?='+=' | setsSum?='=') |
105 | CustomEntry: key = STRING "=" value = STRING; | 225 | (number=ExactNumber | number=IntervallNumber); |
106 | 226 | ||
107 | ConfigReference: config = [ConfigDeclaration]; | 227 | ObjectTypeScope: |
108 | Config: ConfigSpecification | ConfigReference; | 228 | '#' type=ObjectReference |
109 | 229 | (setsNew?='+=' | setsSum?='=') | |
110 | enum Solver: SMTSolver | AlloySolver | ViatraSolver; | 230 | (number=ExactNumber | number=IntervallNumber); |
111 | 231 | ||
112 | ScopeSpecification: {ScopeSpecification} '{' | 232 | IntegerTypeScope: |
113 | (scopes += TypeScope (',' scopes += TypeScope)*)? | 233 | '#' type=IntegerReference |
114 | '}'; | 234 | (setsNew?='+=' | setsSum?='=') |
115 | TypeScope: ClassTypeScope | ObjectTypeScope | IntegerTypeScope | RealTypeScope | StringTypeScope; | 235 | (number=ExactNumber | number=IntervallNumber | number=IntEnumberation); |
116 | ClassTypeScope: '#' type = ClassReference | 236 | |
117 | (setsNew ?='+=' | setsSum ?= '=') | 237 | RealTypeScope: |
118 | (number = ExactNumber | number = IntervallNumber) | 238 | '#' type=RealReference |
119 | ; | 239 | (setsNew?='+=' | setsSum?='=') |
120 | ObjectTypeScope: '#' type = ObjectReference | 240 | (number=ExactNumber | number=IntervallNumber | number=RealEnumeration); |
121 | (setsNew ?='+=' | setsSum ?= '=') | 241 | |
122 | (number = ExactNumber | number = IntervallNumber) | 242 | StringTypeScope: |
123 | ; | 243 | '#' type=StringReference |
124 | IntegerTypeScope: '#' type = IntegerReference | 244 | (setsNew?='+=' | setsSum?='=') |
125 | (setsNew ?='+=' | setsSum ?= '=') | 245 | (number=ExactNumber | number=IntervallNumber | number=StringEnumeration); |
126 | (number = ExactNumber | number = IntervallNumber | number = IntEnumberation) | 246 | |
127 | ; | 247 | TypeReference: |
128 | RealTypeScope: '#' type = RealReference | 248 | ClassReference | ObjectReference | IntegerReference | RealReference | StringReference; |
129 | (setsNew ?='+=' | setsSum ?= '=') | 249 | |
130 | (number = ExactNumber | number = IntervallNumber | number = RealEnumeration) | 250 | ClassReference: |
131 | ; | 251 | '<' element=MetamodelElement '>'; |
132 | StringTypeScope: '#' type = StringReference | 252 | |
133 | (setsNew ?='+=' | setsSum ?= '=') | 253 | ObjectReference: |
134 | (number = ExactNumber | number = IntervallNumber | number = StringEnumeration) | 254 | {ObjectReference} 'node'; |
135 | ; | 255 | |
136 | 256 | IntegerReference: | |
137 | TypeReference: ClassReference | ObjectReference | IntegerReference | RealReference | StringReference; | 257 | {IntegerScope} 'int'; |
138 | ClassReference: '<' element = MetamodelElement '>'; | 258 | |
139 | ObjectReference: {ObjectReference} 'node'; | 259 | RealReference: |
140 | IntegerReference: {IntegerScope} 'int'; | 260 | {RealScope} 'real'; |
141 | RealReference: {RealScope} 'real'; | 261 | |
142 | StringReference: {StringScope} 'string'; | 262 | StringReference: |
143 | 263 | {StringScope} 'string'; | |
144 | NumberSpecification: ExactNumber | IntervallNumber | IntEnumberation | RealEnumeration | StringEnumeration; | 264 | |
145 | ExactNumber: exactNumber = INT | exactUnlimited ?= '*'; | 265 | NumberSpecification: |
146 | IntervallNumber: min = INT '..' (maxNumber = INT | maxUnlimited ?= '*'); | 266 | ExactNumber | IntervallNumber | IntEnumberation | RealEnumeration | StringEnumeration; |
147 | IntEnumberation: {IntEnumberation} '{' (entry += INTLiteral (',' entry += INTLiteral)*)?'}'; | 267 | |
148 | RealEnumeration: {RealEnumeration} '{' (entry += REALLiteral (',' entry += REALLiteral)*)?'}'; | 268 | ExactNumber: |
149 | StringEnumeration: {StringEnumeration} '{' (entry += STRING (',' entry += STRING)*)?'}'; | 269 | exactNumber=INT | exactUnlimited?='*'; |
150 | 270 | ||
151 | ScopeDeclaration: 'scope' name = ID specification = ScopeSpecification; | 271 | IntervallNumber: |
152 | ScopeReference: referred = [ScopeDeclaration]; | 272 | min=INT '..' (maxNumber=INT | maxUnlimited?='*'); |
153 | Scope: ScopeSpecification | ScopeReference; | 273 | |
154 | 274 | IntEnumberation: | |
155 | Task: GenerationTask /*| CoverageCalculation | ValidationTask*/; | 275 | {IntEnumberation} '{' (entry+=INTLiteral (',' entry+=INTLiteral)*)? '}'; |
156 | 276 | ||
157 | GenerationTask: 'generate' {GenerationTask} '{'( | 277 | RealEnumeration: |
158 | 278 | {RealEnumeration} '{' (entry+=REALLiteral (',' entry+=REALLiteral)*)? '}'; | |
159 | // domain | 279 | |
160 | ('metamodel' '=' metamodel = Metamodel)? & | 280 | StringEnumeration: |
161 | ('partial-model' '=' partialModel = PartialModel)? & | 281 | {StringEnumeration} '{' (entry+=STRING (',' entry+=STRING)*)? '}'; |
162 | ('constraints' '=' patterns = GraphPattern)? & | 282 | |
163 | 283 | ScopeDeclaration: | |
164 | // model set | 284 | 'scope' name=ID specification=ScopeSpecification; |
165 | ('scope' '=' scope = Scope)? & | 285 | |
166 | (numberSpecified ?= 'number' '=' number= INT)? & | 286 | ScopeReference: |
167 | (runSpecified ?= 'runs' '=' runs = INT)? & | 287 | referred=[ScopeDeclaration]; |
168 | // Solver | 288 | |
169 | ('solver' '=' solver = Solver)? & | 289 | Scope: |
170 | ('config' '=' config = Config)? & | 290 | ScopeSpecification | ScopeReference; |
171 | 291 | ||
172 | // output texts | 292 | Task: |
173 | ('debug' '=' debugFolder = File)? & | 293 | GenerationTask /*| CoverageCalculation | ValidationTask*/; |
174 | ('log' '=' targetLogFile = File)? & | 294 | |
175 | ('statistics' '=' targetStatisticsFile = File)? & | 295 | GenerationTask: |
176 | 296 | 'generate' {GenerationTask} '{' ( | |
177 | // output models | 297 | |
178 | ('output' '=' tagetFolder = File)? | 298 | // domain |
179 | 299 | ('metamodel' '=' metamodel=Metamodel)? & | |
180 | )'}' | 300 | ('partial-model' '=' partialModel=PartialModel)? & |
181 | ; \ No newline at end of file | 301 | ('constraints' '=' patterns=GraphPattern)? & |
302 | ('objectives' '=' objectives=Objective)? & | ||
303 | |||
304 | // model set | ||
305 | ('scope' '=' scope=Scope)? & | ||
306 | (numberSpecified?='number' '=' number=INT)? & | ||
307 | (runSpecified?='runs' '=' runs=INT)? & | ||
308 | // Solver | ||
309 | ('solver' '=' solver=Solver)? & | ||
310 | ('config' '=' config=Config)? & | ||
311 | |||
312 | // output texts | ||
313 | ('debug' '=' debugFolder=File)? & | ||
314 | ('log' '=' targetLogFile=File)? & | ||
315 | ('statistics' '=' targetStatisticsFile=File)? & | ||
316 | |||
317 | // output models | ||
318 | ('output' '=' tagetFolder=File)?) '}'; \ No newline at end of file | ||
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfigurationStandaloneRuntimeModule.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfigurationStandaloneRuntimeModule.xtend index 2738dfff..55e01a4f 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfigurationStandaloneRuntimeModule.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfigurationStandaloneRuntimeModule.xtend | |||
@@ -50,4 +50,4 @@ class ApplicationConfigurationStandaloneRuntimeModule extends AbstractApplicatio | |||
50 | // def Class<? extends ITargetPlatformMetamodelLoader> bindITargetPlatformMetamodelLoader() { | 50 | // def Class<? extends ITargetPlatformMetamodelLoader> bindITargetPlatformMetamodelLoader() { |
51 | // TargetPlatformMetamodelsIndex | 51 | // TargetPlatformMetamodelsIndex |
52 | // } | 52 | // } |
53 | } \ No newline at end of file | 53 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/EclipseBasedProgressMonitor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/EclipseBasedProgressMonitor.xtend index be35b64a..df25151c 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/EclipseBasedProgressMonitor.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/EclipseBasedProgressMonitor.xtend | |||
@@ -24,4 +24,4 @@ class EclipseBasedProgressMonitor extends SolverProgressMonitor{ | |||
24 | super.isCancelled() || internalMonitor.isCanceled | 24 | super.isCancelled() || internalMonitor.isCanceled |
25 | } | 25 | } |
26 | 26 | ||
27 | } \ No newline at end of file | 27 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend index c9d38c7d..1ee69827 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend | |||
@@ -41,6 +41,7 @@ class GenerationTaskExecutor { | |||
41 | def executeGenerationTask( | 41 | def executeGenerationTask( |
42 | GenerationTask task, | 42 | GenerationTask task, |
43 | ScriptExecutor scriptExecutor, | 43 | ScriptExecutor scriptExecutor, |
44 | ScriptConsole.Factory scriptConsoleFactory, | ||
44 | IProgressMonitor monitor) | 45 | IProgressMonitor monitor) |
45 | { | 46 | { |
46 | monitor.subTask('''Collecting all resources''') | 47 | monitor.subTask('''Collecting all resources''') |
@@ -62,7 +63,7 @@ class GenerationTaskExecutor { | |||
62 | val memoryLimit = scriptExecutor.getMemoryLimit(configSpecification) | 63 | val memoryLimit = scriptExecutor.getMemoryLimit(configSpecification) |
63 | 64 | ||
64 | // 2. create console | 65 | // 2. create console |
65 | val console = new ScriptConsole(true,false, | 66 | val console = scriptConsoleFactory.createScriptConsole(false, |
66 | if(messageFile!==null) URI.createURI(messageFile.path) else null, | 67 | if(messageFile!==null) URI.createURI(messageFile.path) else null, |
67 | if(debugFolder!==null) URI.createURI('''«debugFolder.path»/errors.txt''') else null, | 68 | if(debugFolder!==null) URI.createURI('''«debugFolder.path»/errors.txt''') else null, |
68 | if(statisticsFile!==null) URI.createURI(statisticsFile.path) else null | 69 | if(statisticsFile!==null) URI.createURI(statisticsFile.path) else null |
@@ -132,12 +133,14 @@ class GenerationTaskExecutor { | |||
132 | // 5. create a solver and a configuration | 133 | // 5. create a solver and a configuration |
133 | // 5.1 initialize | 134 | // 5.1 initialize |
134 | val solver = solverLoader.loadSolver(task.solver,configurationMap) | 135 | val solver = solverLoader.loadSolver(task.solver,configurationMap) |
135 | val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,console) | 136 | val objectiveSpecification = scriptExecutor.getObjectiveSpecification(task.objectives) |
137 | val objectiveEntries = objectiveSpecification?.entries ?: emptyList | ||
138 | val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,objectiveEntries,console) | ||
136 | 139 | ||
137 | 140 | ||
138 | // 5.2 set values that defined directly | 141 | // 5.2 set values that defined directly |
139 | solverConfig.solutionScope = new SolutionScope => [ | 142 | solverConfig.solutionScope = new SolutionScope => [ |
140 | it.numberOfRequiredSolution = if(task.numberSpecified) { | 143 | it.numberOfRequiredSolutions = if(task.numberSpecified) { |
141 | task.number | 144 | task.number |
142 | } else { | 145 | } else { |
143 | 1 | 146 | 1 |
@@ -290,7 +293,7 @@ class GenerationTaskExecutor { | |||
290 | statistics.put("Domain to logic transformation time",domain2LogicTransformationTime/1000000) | 293 | statistics.put("Domain to logic transformation time",domain2LogicTransformationTime/1000000) |
291 | statistics.put("Logic to solver transformation time",solution.statistics.transformationTime) | 294 | statistics.put("Logic to solver transformation time",solution.statistics.transformationTime) |
292 | statistics.put("Solver time",solution.statistics.solverTime) | 295 | statistics.put("Solver time",solution.statistics.solverTime) |
293 | statistics.put("Postprocessing time",solutionVisualisationTime) | 296 | statistics.put("Postprocessing time",solutionVisualisationTime/1000000) |
294 | for(entry: solution.statistics.entries) { | 297 | for(entry: solution.statistics.entries) { |
295 | statistics.put(entry.name,statisticsUtil.readValue(entry)) | 298 | statistics.put(entry.name,statisticsUtil.readValue(entry)) |
296 | } | 299 | } |
@@ -301,7 +304,7 @@ class GenerationTaskExecutor { | |||
301 | console.flushStatistics | 304 | console.flushStatistics |
302 | console.writeMessage("Model generation finished") | 305 | console.writeMessage("Model generation finished") |
303 | } catch(Exception e) { | 306 | } catch(Exception e) { |
304 | console.writeError(''' | 307 | console.writeError(''' |
305 | Error occured («e.class.simpleName»): «e.message» | 308 | Error occured («e.class.simpleName»): «e.message» |
306 | «FOR s : e.stackTrace SEPARATOR "\n"» «s»«ENDFOR»''') | 309 | «FOR s : e.stackTrace SEPARATOR "\n"» «s»«ENDFOR»''') |
307 | } | 310 | } |
@@ -347,4 +350,4 @@ class GenerationTaskExecutor { | |||
347 | return false | 350 | return false |
348 | } | 351 | } |
349 | } | 352 | } |
350 | } \ No newline at end of file | 353 | } |
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 index 5e7f84f0..626329dc 100644 --- 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 | |||
@@ -120,4 +120,4 @@ class MetamodelLoader { | |||
120 | // } | 120 | // } |
121 | // return res | 121 | // return res |
122 | // } | 122 | // } |
123 | } \ No newline at end of file | 123 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend index 05081581..5e656e8f 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend | |||
@@ -59,4 +59,4 @@ class NullWorkspace extends ReasonerWorkspace{ | |||
59 | throw new UnsupportedOperationException(message) | 59 | throw new UnsupportedOperationException(message) |
60 | } | 60 | } |
61 | override refreshFile(String name) { } | 61 | override refreshFile(String name) { } |
62 | } \ No newline at end of file | 62 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend index 1269ec1f..3e598dd6 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend | |||
@@ -43,4 +43,4 @@ class PatternLanguageWithRSModule extends EMFPatternLanguageRuntimeModule{ | |||
43 | override Class<? extends ITypeInferrer> bindITypeInferrer() { | 43 | override Class<? extends ITypeInferrer> bindITypeInferrer() { |
44 | return EMFTypeInferrer; | 44 | return EMFTypeInferrer; |
45 | } | 45 | } |
46 | } \ No newline at end of file | 46 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend index dd5af673..c209cde5 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend | |||
@@ -12,4 +12,4 @@ class PatternLanguageWithRSSetup extends EMFPatternLanguageStandaloneSetup{ | |||
12 | override Injector createInjector() { | 12 | override Injector createInjector() { |
13 | return Guice::createInjector(new PatternLanguageWithRSModule()); | 13 | return Guice::createInjector(new PatternLanguageWithRSModule()); |
14 | } | 14 | } |
15 | } \ No newline at end of file | 15 | } |
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 index cfc91143..5a73845d 100644 --- 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 | |||
@@ -144,4 +144,4 @@ class QueryLoader { | |||
144 | } | 144 | } |
145 | return res | 145 | return res |
146 | } | 146 | } |
147 | } \ No newline at end of file | 147 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend index dcaf74cd..6d6ad85e 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend | |||
@@ -220,4 +220,4 @@ class ScopeLoader { | |||
220 | else return specification.exactNumber | 220 | else return specification.exactNumber |
221 | } | 221 | } |
222 | 222 | ||
223 | } \ No newline at end of file | 223 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend index 91d3d286..2ce86a78 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend | |||
@@ -9,128 +9,108 @@ import java.util.LinkedHashSet | |||
9 | import java.util.LinkedList | 9 | import java.util.LinkedList |
10 | import java.util.List | 10 | import java.util.List |
11 | import java.util.Map | 11 | import java.util.Map |
12 | import java.util.concurrent.CompletableFuture | ||
13 | import javax.swing.text.BadLocationException | ||
14 | import org.eclipse.emf.common.util.URI | 12 | import org.eclipse.emf.common.util.URI |
15 | import org.eclipse.jface.text.DocumentEvent | ||
16 | import org.eclipse.jface.text.IDocumentListener | ||
17 | import org.eclipse.swt.graphics.Color | ||
18 | import org.eclipse.ui.console.ConsolePlugin | ||
19 | import org.eclipse.ui.console.MessageConsole | ||
20 | import org.eclipse.ui.console.MessageConsoleStream | ||
21 | import org.eclipse.xtend.lib.annotations.Data | 13 | import org.eclipse.xtend.lib.annotations.Data |
22 | 14 | ||
23 | //import org.eclipse.ui.console.MessageConsole | 15 | abstract class ScriptConsole { |
24 | |||
25 | class ScriptConsole { | ||
26 | /** | ||
27 | * Console is identified with the name of this class. | ||
28 | */ | ||
29 | val final consoleID = ScriptConsole.name | ||
30 | val boolean printToConsole | 16 | val boolean printToConsole |
31 | val MessageConsole runtimeConsole; | ||
32 | val ReasonerWorkspace messageWorkspace; | 17 | val ReasonerWorkspace messageWorkspace; |
33 | val String messageFileName; | 18 | val String messageFileName; |
34 | val ReasonerWorkspace errorWorkspace; | 19 | val ReasonerWorkspace errorWorkspace; |
35 | val String errorFileName; | 20 | val String errorFileName; |
36 | val ReasonerWorkspace statisticsWorkspace; | 21 | val ReasonerWorkspace statisticsWorkspace; |
37 | val String statisticsFileName; | 22 | val String statisticsFileName; |
38 | 23 | val List<String> errorMessagesDuringInitialisation = new LinkedList; | |
24 | |||
39 | val statisticsHeaderBuffer = new LinkedHashSet<String> | 25 | val statisticsHeaderBuffer = new LinkedHashSet<String> |
40 | val statisticsDataBuffer = new LinkedList<Map<String,? extends Object>> | 26 | val statisticsDataBuffer = new LinkedList<Map<String, ? extends Object>> |
41 | 27 | ||
42 | static val delimier = ';' | 28 | static val delimier = ';' |
43 | static val empty = "" | 29 | static val empty = "" |
44 | 30 | ||
45 | public new( | 31 | new(boolean printToConsole, boolean cleanFiles, URI messageConsoleURI, URI errorConsoleURI, |
46 | boolean printToRuntimeConsole, | 32 | URI statisticsConsoleURI) { |
47 | boolean cleanFiles, | 33 | this.messageWorkspace = prepareWorkspace(messageConsoleURI, errorMessagesDuringInitialisation) |
48 | URI messageConsoleURI, | ||
49 | URI errorConsoleURI, | ||
50 | URI statisticsConsoleURI) | ||
51 | { | ||
52 | val List<String> errorMessagesDuringInitialisation = new LinkedList | ||
53 | |||
54 | this.messageWorkspace = prepareWorkspace(messageConsoleURI,errorMessagesDuringInitialisation) | ||
55 | this.messageFileName = prepareFileName(messageConsoleURI) | 34 | this.messageFileName = prepareFileName(messageConsoleURI) |
56 | this.errorWorkspace = prepareWorkspace(errorConsoleURI,errorMessagesDuringInitialisation) | 35 | this.errorWorkspace = prepareWorkspace(errorConsoleURI, errorMessagesDuringInitialisation) |
57 | this.errorFileName = prepareFileName(errorConsoleURI) | 36 | this.errorFileName = prepareFileName(errorConsoleURI) |
58 | this.statisticsWorkspace = prepareWorkspace(statisticsConsoleURI,errorMessagesDuringInitialisation) | 37 | this.statisticsWorkspace = prepareWorkspace(statisticsConsoleURI, errorMessagesDuringInitialisation) |
59 | this.statisticsFileName = prepareFileName(statisticsConsoleURI) | 38 | this.statisticsFileName = prepareFileName(statisticsConsoleURI) |
60 | 39 | ||
61 | this.printToConsole = (ConsolePlugin.getDefault() === null) | 40 | this.printToConsole = printToConsole |
62 | this.runtimeConsole = if(printToRuntimeConsole) { prepareRuntimeConsole } else { null } | 41 | } |
63 | 42 | ||
64 | errorMessagesDuringInitialisation.forEach[ | 43 | /** |
44 | * Writes any error messages that occurred during console initialization. | ||
45 | * | ||
46 | * Should be called by implementations at the end of their constructors. | ||
47 | */ | ||
48 | protected final def writeErrorMessagesDuringInitialisation() { | ||
49 | errorMessagesDuringInitialisation.forEach [ | ||
65 | this.writeError('''Error during console initialisation: "«it»"''') | 50 | this.writeError('''Error during console initialisation: "«it»"''') |
66 | ] | 51 | ] |
52 | errorMessagesDuringInitialisation.clear | ||
67 | } | 53 | } |
68 | 54 | ||
69 | public def writeMessage(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { | 55 | def void writeMessage(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { |
70 | val resolvedText = this.resolveToText(message, separator, decorators) | 56 | val resolvedText = this.resolveToText(message, separator, decorators) |
71 | if(messageWorkspace!==null) { | 57 | if (messageWorkspace !== null) { |
72 | messageWorkspace.writeText(messageFileName,resolvedText); | 58 | messageWorkspace.writeText(messageFileName, resolvedText); |
73 | } | 59 | } |
74 | if(printToConsole) { | 60 | if (printToConsole) { |
75 | println(resolvedText) | 61 | println(resolvedText) |
76 | } | 62 | } |
77 | if(runtimeConsole!==null) { | ||
78 | writeToRuntimeConsole(message, separator, decorators) | ||
79 | } | ||
80 | } | 63 | } |
81 | public def writeMessage(String message) { | 64 | |
82 | if(messageWorkspace!==null) { | 65 | def void writeMessage(String message) { |
83 | messageWorkspace.writeText(messageFileName,message); | 66 | if (messageWorkspace !== null) { |
67 | messageWorkspace.writeText(messageFileName, message); | ||
84 | } | 68 | } |
85 | if(printToConsole) { | 69 | if (printToConsole) { |
86 | println(message) | 70 | println(message) |
87 | } | 71 | } |
88 | if(runtimeConsole!==null) { | ||
89 | writeToRuntimeConsole(message) | ||
90 | } | ||
91 | } | 72 | } |
92 | public def writeError(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { | 73 | |
74 | def void writeError(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { | ||
93 | val resolvedText = this.resolveToText(message, separator, decorators) | 75 | val resolvedText = this.resolveToText(message, separator, decorators) |
94 | if(errorWorkspace!==null) { | 76 | if (errorWorkspace !== null) { |
95 | errorWorkspace.writeText(errorFileName,resolvedText); | 77 | errorWorkspace.writeText(errorFileName, resolvedText); |
96 | } | 78 | } |
97 | println(message) | 79 | println(message) |
98 | if(runtimeConsole!==null) { | ||
99 | writeToRuntimeConsole(message, separator, decorators) | ||
100 | } | ||
101 | } | 80 | } |
102 | public def writeError(String message) { | 81 | |
103 | if(errorWorkspace!==null) { | 82 | def void writeError(String message) { |
104 | errorWorkspace.writeText(errorFileName,message); | 83 | if (errorWorkspace !== null) { |
84 | errorWorkspace.writeText(errorFileName, message); | ||
105 | } | 85 | } |
106 | println(message) | 86 | println(message) |
107 | if(runtimeConsole!==null) { | ||
108 | writeToRuntimeConsole(message) | ||
109 | } | ||
110 | } | 87 | } |
111 | public def writeStatistics(LinkedHashMap<String,? extends Object> statistics) { | 88 | |
112 | if(statisticsWorkspace!==null) { | 89 | def writeStatistics(LinkedHashMap<String, ? extends Object> statistics) { |
113 | val message = ''' | 90 | if (statisticsWorkspace !== null) { |
91 | val message = ''' | ||
114 | «FOR key : statistics.keySet SEPARATOR delimier»«key»«ENDFOR» | 92 | «FOR key : statistics.keySet SEPARATOR delimier»«key»«ENDFOR» |
115 | «FOR value : statistics.values SEPARATOR delimier»«value»«ENDFOR»''' | 93 | «FOR value : statistics.values SEPARATOR delimier»«value»«ENDFOR»''' |
116 | statisticsWorkspace.writeText(statisticsFileName,message); | 94 | statisticsWorkspace.writeText(statisticsFileName, message); |
117 | } | 95 | } |
118 | } | 96 | } |
119 | public def addStatistics(LinkedHashMap<String,? extends Object> statistics) { | 97 | |
120 | for(key : statistics.keySet) { | 98 | def addStatistics(LinkedHashMap<String, ? extends Object> statistics) { |
99 | for (key : statistics.keySet) { | ||
121 | this.statisticsHeaderBuffer.add(key); | 100 | this.statisticsHeaderBuffer.add(key); |
122 | } | 101 | } |
123 | this.statisticsDataBuffer.add(statistics) | 102 | this.statisticsDataBuffer.add(statistics) |
124 | } | 103 | } |
125 | public def flushStatistics() { | 104 | |
126 | if(statisticsWorkspace!==null) { | 105 | def flushStatistics() { |
127 | val message = ''' | 106 | if (statisticsWorkspace !== null) { |
128 | «FOR key : statisticsHeaderBuffer SEPARATOR delimier»«key»«ENDFOR» | 107 | val message = ''' |
129 | «FOR line : statisticsDataBuffer» | 108 | «FOR key : statisticsHeaderBuffer SEPARATOR delimier»«key»«ENDFOR» |
130 | «FOR key : statisticsHeaderBuffer SEPARATOR delimier»«IF line.containsKey(key)»«line.get(key)»«ELSE»«empty»«ENDIF»«ENDFOR» | 109 | «FOR line : statisticsDataBuffer» |
131 | «ENDFOR» | 110 | «FOR key : statisticsHeaderBuffer SEPARATOR delimier»«IF line.containsKey(key)»«line.get(key)»«ELSE»«empty»«ENDIF»«ENDFOR» |
111 | «ENDFOR» | ||
132 | ''' | 112 | ''' |
133 | statisticsWorkspace.writeText(statisticsFileName,message); | 113 | statisticsWorkspace.writeText(statisticsFileName, message); |
134 | statisticsHeaderBuffer.clear | 114 | statisticsHeaderBuffer.clear |
135 | statisticsDataBuffer.clear | 115 | statisticsDataBuffer.clear |
136 | } | 116 | } |
@@ -140,143 +120,66 @@ class ScriptConsole { | |||
140 | if (uri === null) { | 120 | if (uri === null) { |
141 | return null | 121 | return null |
142 | } else { | 122 | } else { |
143 | try{ | 123 | try { |
144 | val folderURI = uri.trimSegments(1) | 124 | val folderURI = uri.trimSegments(1) |
145 | if(folderURI.isFile) { | 125 | if (folderURI.isFile) { |
146 | return new FileSystemWorkspace(folderURI.toString,"")=>[init] | 126 | return new FileSystemWorkspace(folderURI.toString, "") => [init] |
147 | } else if(folderURI.isPlatformResource) { | 127 | } else if (folderURI.isPlatformResource) { |
148 | return new ProjectWorkspace(folderURI.toString,"")=>[init] | 128 | return new ProjectWorkspace(folderURI.toString, "") => [init] |
149 | } else { | 129 | } else { |
150 | throw new UnsupportedOperationException('''Unsupported file usi: "«uri»"!''') | 130 | throw new UnsupportedOperationException('''Unsupported file usi: "«uri»"!''') |
151 | } | 131 | } |
152 | } catch(Exception e) { | 132 | } catch (Exception e) { |
153 | errors += e.message | 133 | errors += e.message |
154 | return null | 134 | return null |
155 | } | 135 | } |
156 | } | 136 | } |
157 | } | 137 | } |
138 | |||
158 | private def prepareFileName(URI uri) { | 139 | private def prepareFileName(URI uri) { |
159 | if(uri!==null) { | 140 | if (uri !== null) { |
160 | return uri.lastSegment | 141 | return uri.lastSegment |
161 | } else { | 142 | } else { |
162 | null | 143 | null |
163 | } | 144 | } |
164 | } | 145 | } |
165 | 146 | ||
166 | private def MessageConsole prepareRuntimeConsole() { | ||
167 | val plugin = ConsolePlugin.getDefault(); | ||
168 | if(plugin === null) { | ||
169 | return null | ||
170 | } else { | ||
171 | val conMan = plugin.getConsoleManager(); | ||
172 | val existingConsoles = conMan.getConsoles(); | ||
173 | val existingConsolesWithID = existingConsoles.filter[it.name.equals(consoleID)] | ||
174 | if(existingConsolesWithID.empty) { | ||
175 | val MessageConsole res = new MessageConsole(consoleID,null) | ||
176 | conMan.addConsoles(#[res]); | ||
177 | |||
178 | return res | ||
179 | } else { | ||
180 | return existingConsolesWithID.head as MessageConsole | ||
181 | } | ||
182 | } | ||
183 | } | ||
184 | private def resolveToText(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { | 147 | private def resolveToText(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { |
185 | val messageString = message.toString | 148 | val messageString = message.toString |
186 | // 0. split the message | 149 | // 0. split the message |
187 | val separatedMessage = if(messageString.startsWith(separator,-1)) { | 150 | val separatedMessage = if (messageString.startsWith(separator, -1)) { |
188 | #[""]+messageString.split(separator,-1) | 151 | #[""] + messageString.split(separator, -1) |
189 | } else { | 152 | } else { |
190 | messageString.split(separator,-1).toList | 153 | messageString.split(separator, -1).toList |
191 | } | 154 | } |
192 | if(separatedMessage.size-1 !== decorators.size) { | 155 | if (separatedMessage.size - 1 !== decorators.size) { |
193 | throw new IllegalArgumentException | 156 | throw new IllegalArgumentException |
194 | } | 157 | } |
195 | 158 | ||
196 | return '''«FOR i : 0..<decorators.size»«separatedMessage.get(i)»[«decorators.get(i).text»]«ENDFOR»«separatedMessage.last»''' | 159 | return '''«FOR i : 0..<decorators.size»«separatedMessage.get(i)»[«decorators.get(i).text»]«ENDFOR»«separatedMessage.last»''' |
197 | } | 160 | } |
198 | private def writeToRuntimeConsole(CharSequence message) { | 161 | |
199 | // 1. reveal the console view | 162 | @FunctionalInterface |
200 | ConsolePlugin.getDefault().getConsoleManager().showConsoleView(this.runtimeConsole); | 163 | interface Factory { |
201 | val stream = this.runtimeConsole.newMessageStream | 164 | def ScriptConsole createScriptConsole(boolean cleanFiles, URI messageConsoleURI, URI errorConsoleURI, |
202 | stream.println(message.toString) | 165 | URI statisticsConsoleURI) |
203 | stream.close | ||
204 | } | 166 | } |
205 | private def writeToRuntimeConsole(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { | 167 | } |
206 | val messageString = message.toString | 168 | |
207 | // 0. split the message | 169 | class StandardOutputBasedScriptConsole extends ScriptConsole { |
208 | val separatedMessage = if(messageString.startsWith(separator)) { | 170 | new(boolean cleanFiles, URI messageConsoleURI, URI errorConsoleURI, URI statisticsConsoleURI) { |
209 | #[""]+messageString.split(separator,-1) | 171 | super(true, cleanFiles, messageConsoleURI, errorConsoleURI, statisticsConsoleURI) |
210 | } else { | 172 | writeErrorMessagesDuringInitialisation() |
211 | messageString.split(separator,-1).toList | ||
212 | } | ||
213 | if(separatedMessage.size-1 !== decorators.size) { | ||
214 | throw new IllegalArgumentException | ||
215 | } | ||
216 | |||
217 | // 1. reveal the console view | ||
218 | ConsolePlugin.getDefault().getConsoleManager().showConsoleView(this.runtimeConsole); | ||
219 | val stream = this.runtimeConsole.newMessageStream | ||
220 | |||
221 | // 2. print the segments of the view | ||
222 | for(i : 0..<decorators.size) { | ||
223 | stream.print(separatedMessage.get(i)) | ||
224 | writeDecoratedTextToRuntimeConsole(decorators.get(i),stream) | ||
225 | |||
226 | } | ||
227 | // 2.1 write the last segment of | ||
228 | stream.println(separatedMessage.last) | ||
229 | |||
230 | //stream.println(message.toString) | ||
231 | stream.close | ||
232 | } | 173 | } |
233 | private def writeDecoratedTextToRuntimeConsole(ScriptConsoleDecorator message, MessageConsoleStream stream) { | 174 | |
234 | val originalBackgroundColor = this.runtimeConsole.background | 175 | public static val FACTORY = new ScriptConsole.Factory { |
235 | var Color newColor = null; | 176 | override createScriptConsole(boolean cleanFiles, URI messageConsoleURI, URI errorConsoleURI, |
236 | 177 | URI statisticsConsoleURI) { | |
237 | val text = '''[«message.text»]''' | 178 | new StandardOutputBasedScriptConsole(cleanFiles, messageConsoleURI, errorConsoleURI, statisticsConsoleURI) |
238 | if(message.red >= 0 && message.green >= 0 && message.blue >= 0) { | ||
239 | newColor = new Color(originalBackgroundColor.device,message.red,message.green,message.blue) | ||
240 | this.runtimeConsole.setBackground(newColor) | ||
241 | } | ||
242 | stream.flush | ||
243 | val CompletableFuture<Boolean> finished = new CompletableFuture<Boolean> | ||
244 | val listener = new IDocumentListener() { | ||
245 | override documentAboutToBeChanged(DocumentEvent event) { } | ||
246 | override documentChanged(DocumentEvent event) { | ||
247 | //println('''ftext="«event.fText»", message="«message.text»" endswith=«event.fText.endsWith(message.text)»''') | ||
248 | if(event.fText.endsWith(text)) { | ||
249 | val from = event.fDocument.length-text.length+1 | ||
250 | val length = message.text.length | ||
251 | //println('''from: «from» length «length»''') | ||
252 | try{ | ||
253 | runtimeConsole.addHyperlink( | ||
254 | new ScriptConsoleFileHiperlink(message.hyperlink), | ||
255 | from, | ||
256 | length | ||
257 | ) | ||
258 | //println("link added") | ||
259 | } catch(BadLocationException e) { | ||
260 | |||
261 | } finally { | ||
262 | runtimeConsole.document.removeDocumentListener(this) | ||
263 | finished.complete(true) | ||
264 | } | ||
265 | } | ||
266 | |||
267 | } | ||
268 | } | ||
269 | runtimeConsole.document.addDocumentListener(listener) | ||
270 | stream.print(text) | ||
271 | stream.flush | ||
272 | finished.get | ||
273 | //stream.console.new | ||
274 | if(message.red >= 0 && message.green >= 0 && message.blue >= 0) { | ||
275 | newColor.dispose | ||
276 | this.runtimeConsole.setBackground(originalBackgroundColor) | ||
277 | } | 179 | } |
278 | } | 180 | } |
279 | } | 181 | } |
182 | |||
280 | @Data | 183 | @Data |
281 | class ScriptConsoleDecorator { | 184 | class ScriptConsoleDecorator { |
282 | String text | 185 | String text |
@@ -284,33 +187,36 @@ class ScriptConsoleDecorator { | |||
284 | int Red | 187 | int Red |
285 | int Green | 188 | int Green |
286 | int Blue | 189 | int Blue |
287 | 190 | ||
288 | public new(String text) { | 191 | new(String text) { |
289 | this.text = text | 192 | this.text = text |
290 | this.hyperlink = null | 193 | this.hyperlink = null |
291 | this.Red = -1 | 194 | this.Red = -1 |
292 | this.Green = -1 | 195 | this.Green = -1 |
293 | this.Blue = -1 | 196 | this.Blue = -1 |
294 | } | 197 | } |
295 | public new(String text, File hyperlink) { | 198 | |
199 | new(String text, File hyperlink) { | ||
296 | this.text = text | 200 | this.text = text |
297 | this.hyperlink = hyperlink | 201 | this.hyperlink = hyperlink |
298 | this.Red = -1 | 202 | this.Red = -1 |
299 | this.Green = -1 | 203 | this.Green = -1 |
300 | this.Blue = -1 | 204 | this.Blue = -1 |
301 | } | 205 | } |
302 | public new(String text, int red, int green, int blue) { | 206 | |
207 | new(String text, int red, int green, int blue) { | ||
303 | this.text = text | 208 | this.text = text |
304 | this.hyperlink = null | 209 | this.hyperlink = null |
305 | this.Red = red | 210 | this.Red = red |
306 | this.Green = green | 211 | this.Green = green |
307 | this.Blue = blue | 212 | this.Blue = blue |
308 | } | 213 | } |
309 | public new(String text, File hyperlink, int red, int green, int blue) { | 214 | |
215 | new(String text, File hyperlink, int red, int green, int blue) { | ||
310 | this.text = text | 216 | this.text = text |
311 | this.hyperlink = hyperlink | 217 | this.hyperlink = hyperlink |
312 | this.Red = red | 218 | this.Red = red |
313 | this.Green = green | 219 | this.Green = green |
314 | this.Blue = blue | 220 | this.Blue = blue |
315 | } | 221 | } |
316 | } \ No newline at end of file | 222 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsoleFileHiperlink.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsoleFileHiperlink.xtend deleted file mode 100644 index 25e49c80..00000000 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsoleFileHiperlink.xtend +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution | ||
2 | |||
3 | import org.eclipse.ui.console.IHyperlink | ||
4 | import org.eclipse.ui.ide.IDE | ||
5 | import org.eclipse.ui.PlatformUI | ||
6 | import org.eclipse.core.filesystem.EFS | ||
7 | import java.io.File | ||
8 | import java.net.URI | ||
9 | |||
10 | class ScriptConsoleFileHiperlink implements IHyperlink { | ||
11 | |||
12 | private val URI path; | ||
13 | |||
14 | new(File file) { | ||
15 | this.path = file.toURI() | ||
16 | } | ||
17 | |||
18 | override linkActivated() { | ||
19 | //println("open path: "+path.toString) | ||
20 | val page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); | ||
21 | val fileStore = EFS.getStore(path) | ||
22 | IDE.openEditorOnFileStore(page,fileStore) | ||
23 | } | ||
24 | |||
25 | override linkEntered() { } | ||
26 | |||
27 | override linkExited() { } | ||
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/ScriptExecutor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend index c9ec68bb..3941179a 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend | |||
@@ -4,6 +4,7 @@ import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigRef | |||
4 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigSpecification | 4 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigSpecification |
5 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript | 5 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript |
6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.CustomEntry | 6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.CustomEntry |
7 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.DocumentLevelSpecification | ||
7 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.DocumentationEntry | 8 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.DocumentationEntry |
8 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport | 9 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport |
9 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.FileReference | 10 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.FileReference |
@@ -24,19 +25,24 @@ import hu.bme.mit.inf.dslreasoner.application.execution.util.ApplicationConfigur | |||
24 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel | 25 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel |
25 | import java.util.LinkedHashMap | 26 | import java.util.LinkedHashMap |
26 | import java.util.Optional | 27 | import java.util.Optional |
27 | import org.eclipse.emf.common.util.URI | ||
28 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.DocumentLevelSpecification | ||
29 | import org.eclipse.core.runtime.jobs.Job | ||
30 | import org.eclipse.core.runtime.IProgressMonitor | 28 | import org.eclipse.core.runtime.IProgressMonitor |
31 | import org.eclipse.core.runtime.Status | 29 | import org.eclipse.core.runtime.Status |
30 | import org.eclipse.core.runtime.jobs.Job | ||
31 | import org.eclipse.emf.common.util.URI | ||
32 | import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor | ||
33 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveSpecification | ||
34 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveReference | ||
32 | 35 | ||
36 | @FinalFieldsConstructor | ||
33 | class ScriptExecutor { | 37 | class ScriptExecutor { |
34 | val parser = new ApplicationConfigurationParser | 38 | val parser = new ApplicationConfigurationParser |
35 | 39 | ||
40 | val ScriptConsole.Factory scriptConsoleFactory | ||
41 | |||
36 | /** | 42 | /** |
37 | * Executes a script | 43 | * Executes a script |
38 | */ | 44 | */ |
39 | public def executeScript(URI uri) { | 45 | def executeScript(URI uri) { |
40 | val job = new Job('''Model Generation: «uri.lastSegment»''') { | 46 | val job = new Job('''Model Generation: «uri.lastSegment»''') { |
41 | override protected run(IProgressMonitor monitor) { | 47 | override protected run(IProgressMonitor monitor) { |
42 | try{ | 48 | try{ |
@@ -53,7 +59,7 @@ class ScriptExecutor { | |||
53 | job.schedule(); | 59 | job.schedule(); |
54 | } | 60 | } |
55 | 61 | ||
56 | public def executeScript(ConfigurationScript script, IProgressMonitor monitor) { | 62 | def executeScript(ConfigurationScript script, IProgressMonitor monitor) { |
57 | script.activateAllEPackageReferences | 63 | script.activateAllEPackageReferences |
58 | val tasks = script.commands.filter(Task) | 64 | val tasks = script.commands.filter(Task) |
59 | 65 | ||
@@ -90,12 +96,12 @@ class ScriptExecutor { | |||
90 | // } | 96 | // } |
91 | } | 97 | } |
92 | 98 | ||
93 | def public dispatch execute(GenerationTask task, IProgressMonitor monitor) { | 99 | def dispatch void execute(GenerationTask task, IProgressMonitor monitor) { |
94 | val generationTaskExecutor = new GenerationTaskExecutor | 100 | val generationTaskExecutor = new GenerationTaskExecutor |
95 | generationTaskExecutor.executeGenerationTask(task,this,monitor) | 101 | generationTaskExecutor.executeGenerationTask(task,this,scriptConsoleFactory,monitor) |
96 | } | 102 | } |
97 | 103 | ||
98 | def public dispatch execute(Task task, IProgressMonitor monitor) { | 104 | def dispatch void execute(Task task, IProgressMonitor monitor) { |
99 | throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''') | 105 | throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''') |
100 | } | 106 | } |
101 | 107 | ||
@@ -170,6 +176,16 @@ class ScriptExecutor { | |||
170 | null | 176 | null |
171 | } | 177 | } |
172 | 178 | ||
179 | def dispatch getObjectiveSpecification(ObjectiveSpecification config) { | ||
180 | config | ||
181 | } | ||
182 | def dispatch getObjectiveSpecification(ObjectiveReference config) { | ||
183 | config.referred.specification | ||
184 | } | ||
185 | def dispatch getObjectiveSpecification(Void config) { | ||
186 | null | ||
187 | } | ||
188 | |||
173 | def dispatch getConfiguration(ConfigSpecification config) { | 189 | def dispatch getConfiguration(ConfigSpecification config) { |
174 | config | 190 | config |
175 | } | 191 | } |
@@ -234,4 +250,4 @@ class ScriptExecutor { | |||
234 | } | 250 | } |
235 | } | 251 | } |
236 | } | 252 | } |
237 | } \ No newline at end of file | 253 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend index a9573fbf..1139080b 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend | |||
@@ -1,44 +1,47 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution | 1 | package hu.bme.mit.inf.dslreasoner.application.execution |
2 | 2 | ||
3 | import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloyBackendSolver | ||
4 | import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolver | 3 | import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolver |
5 | import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolverConfiguration | 4 | import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolverConfiguration |
5 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.CostObjectiveFunction | ||
6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveEntry | ||
7 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.OptimizationEntry | ||
6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.Solver | 8 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.Solver |
9 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ThresholdEntry | ||
7 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration | 10 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration |
8 | import hu.bme.mit.inf.dslreasoner.smt.reasoner.SMTSolver | 11 | import hu.bme.mit.inf.dslreasoner.smt.reasoner.SMTSolver |
9 | import hu.bme.mit.inf.dslreasoner.smt.reasoner.SmtSolverConfiguration | 12 | import hu.bme.mit.inf.dslreasoner.smt.reasoner.SmtSolverConfiguration |
13 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.CostObjectiveConfiguration | ||
14 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.CostObjectiveElementConfiguration | ||
15 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor | ||
10 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner | 16 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner |
11 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration | 17 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration |
18 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveKind | ||
19 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveThreshold | ||
20 | import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser | ||
21 | import java.util.List | ||
12 | import java.util.Map | 22 | import java.util.Map |
13 | import java.util.Optional | 23 | import java.util.Optional |
24 | import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternModel | ||
25 | import org.eclipse.xtext.EcoreUtil2 | ||
14 | import org.eclipse.xtext.xbase.lib.Functions.Function1 | 26 | import org.eclipse.xtext.xbase.lib.Functions.Function1 |
15 | import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser | ||
16 | import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor | ||
17 | 27 | ||
18 | class SolverLoader { | 28 | class SolverLoader { |
19 | def loadSolver(Solver solver, Map<String, String> config) { | 29 | def loadSolver(Solver solver, Map<String, String> config) { |
20 | switch(solver) { | 30 | switch (solver) { |
21 | case ALLOY_SOLVER: return new AlloySolver | 31 | case ALLOY_SOLVER: return new AlloySolver |
22 | case SMT_SOLVER: return new SMTSolver | 32 | case SMT_SOLVER: return new SMTSolver |
23 | case VIATRA_SOLVER: return new ViatraReasoner | 33 | case VIATRA_SOLVER: return new ViatraReasoner |
24 | } | 34 | } |
25 | } | 35 | } |
26 | 36 | ||
27 | 37 | private def <Type> Optional<Type> getAsType(Map<String, String> config, String key, ScriptConsole console, | |
28 | 38 | Function1<String, Type> parser, Class<Type> requestedType) { | |
29 | private def <Type> Optional<Type> getAsType( | 39 | if (config.containsKey(key)) { |
30 | Map<String, String> config, | ||
31 | String key, | ||
32 | ScriptConsole console, | ||
33 | Function1<String,Type> parser, | ||
34 | Class<Type> requestedType) | ||
35 | { | ||
36 | if(config.containsKey(key)) { | ||
37 | val stringValue = config.get(key) | 40 | val stringValue = config.get(key) |
38 | try{ | 41 | try { |
39 | val parsedValue = parser.apply(stringValue) | 42 | val parsedValue = parser.apply(stringValue) |
40 | return Optional.of(parsedValue) | 43 | return Optional.of(parsedValue) |
41 | } catch(Exception e) { | 44 | } catch (Exception e) { |
42 | console.writeError('''Unable to parse configuration value for "«key»" to «requestedType.simpleName»!''') | 45 | console.writeError('''Unable to parse configuration value for "«key»" to «requestedType.simpleName»!''') |
43 | return Optional::empty | 46 | return Optional::empty |
44 | } | 47 | } |
@@ -46,60 +49,132 @@ class SolverLoader { | |||
46 | return Optional::empty | 49 | return Optional::empty |
47 | } | 50 | } |
48 | } | 51 | } |
52 | |||
49 | private def getAsInteger(Map<String, String> config, String key, ScriptConsole console) { | 53 | private def getAsInteger(Map<String, String> config, String key, ScriptConsole console) { |
50 | return getAsType(config,key,console,[x|Integer.parseInt(x)],Integer) | 54 | return getAsType(config, key, console, [x|Integer.parseInt(x)], Integer) |
51 | } | 55 | } |
56 | |||
52 | private def getAsBoolean(Map<String, String> config, String key, ScriptConsole console) { | 57 | private def getAsBoolean(Map<String, String> config, String key, ScriptConsole console) { |
53 | return getAsType(config,key,console,[x|Boolean.parseBoolean(x)],Boolean) | 58 | return getAsType(config, key, console, [x|Boolean.parseBoolean(x)], Boolean) |
54 | } | 59 | } |
60 | |||
55 | private def getAsDouble(Map<String, String> config, String key, ScriptConsole console) { | 61 | private def getAsDouble(Map<String, String> config, String key, ScriptConsole console) { |
56 | return getAsType(config,key,console,[x|Double.parseDouble(x)],Double) | 62 | return getAsType(config, key, console, [x|Double.parseDouble(x)], Double) |
57 | } | 63 | } |
58 | 64 | ||
59 | def loadSolverConfig( | 65 | def loadSolverConfig(Solver solver, Map<String, String> config, List<ObjectiveEntry> objectiveEntries, |
60 | Solver solver, | 66 | ScriptConsole console) { |
61 | Map<String, String> config, | 67 | switch (solver) { |
62 | ScriptConsole console) | 68 | case ALLOY_SOLVER: { |
63 | { | 69 | if (!objectiveEntries.empty) { |
64 | if(solver === Solver::ALLOY_SOLVER) { | 70 | throw new IllegalArgumentException("Objectives are not supported by Alloy.") |
65 | return new AlloySolverConfiguration => [c| | 71 | } |
66 | config.getAsInteger("symmetry",console) | 72 | val c = new SmtSolverConfiguration |
67 | .ifPresent[c.symmetry = it] | 73 | config.getAsBoolean("fixRandomSeed", console).ifPresent[c.fixRandomSeed = it] |
68 | config.getAsType("solver",console,[x|AlloyBackendSolver::valueOf(x)],AlloyBackendSolver) | 74 | config.getAsType("path", console, [it], String).ifPresent[c.solverPath = it] |
69 | .ifPresent[c.solver = it] | 75 | c |
70 | ] | 76 | } |
71 | } else if(solver === Solver::SMT_SOLVER) { | 77 | case SMT_SOLVER: { |
72 | return new SmtSolverConfiguration => [c| | 78 | if (!objectiveEntries.empty) { |
73 | config.getAsBoolean("fixRandomSeed",console).ifPresent[c.fixRandomSeed = it] | 79 | throw new IllegalArgumentException("Objectives are not supported by Z3.") |
74 | config.getAsType("path",console,[it],String).ifPresent[c.solverPath = it] | 80 | } |
75 | ] | 81 | val c = new SmtSolverConfiguration |
76 | } else if(solver === Solver::VIATRA_SOLVER) { | 82 | config.getAsBoolean("fixRandomSeed", console).ifPresent[c.fixRandomSeed = it] |
77 | return new ViatraReasonerConfiguration => [c| | 83 | config.getAsType("path", console, [it], String).ifPresent[c.solverPath = it] |
78 | c.debugCongiguration.partialInterpretatioVisualiser = new GraphvizVisualiser | 84 | c |
79 | if(config.containsKey("diversity-range")) { | 85 | } |
86 | case VIATRA_SOLVER: { | ||
87 | val c = new ViatraReasonerConfiguration | ||
88 | c.debugConfiguration.partialInterpretatioVisualiser = new GraphvizVisualiser | ||
89 | if (config.containsKey("diversity-range")) { | ||
80 | val stringValue = config.get("diversity-range") | 90 | val stringValue = config.get("diversity-range") |
81 | try{ | 91 | try { |
82 | val range = Integer.parseInt(stringValue) | 92 | val range = Integer.parseInt(stringValue) |
83 | c.diversityRequirement = new DiversityDescriptor => [ | 93 | c.diversityRequirement = new DiversityDescriptor => [ |
84 | it.ensureDiversity = true | 94 | it.ensureDiversity = true |
85 | it.range = range | 95 | it.range = range |
86 | ] | 96 | ] |
87 | } catch (NumberFormatException e) {console.writeError('''Malformed number format: «e.message»''')} | 97 | } catch (NumberFormatException e) { |
98 | console.writeError('''Malformed number format: «e.message»''') | ||
99 | } | ||
88 | } | 100 | } |
89 | ] | 101 | for (objectiveEntry : objectiveEntries) { |
90 | } else { | 102 | val costObjectiveConfig = new CostObjectiveConfiguration |
91 | throw new UnsupportedOperationException('''Unknown solver: «solver»''') | 103 | switch (objectiveEntry) { |
104 | OptimizationEntry: { | ||
105 | costObjectiveConfig.findExtremum = true | ||
106 | costObjectiveConfig.kind = switch (direction : objectiveEntry.direction) { | ||
107 | case MAXIMIZE: | ||
108 | ObjectiveKind.HIGHER_IS_BETTER | ||
109 | case MINIMIZE: | ||
110 | ObjectiveKind.LOWER_IS_BETTER | ||
111 | default: | ||
112 | throw new IllegalArgumentException("Unknown direction: " + direction) | ||
113 | } | ||
114 | costObjectiveConfig.threshold = ObjectiveThreshold.NO_THRESHOLD | ||
115 | } | ||
116 | ThresholdEntry: { | ||
117 | costObjectiveConfig.findExtremum = false | ||
118 | val threshold = objectiveEntry.threshold.doubleValue | ||
119 | switch (operator : objectiveEntry.operator) { | ||
120 | case LESS: { | ||
121 | costObjectiveConfig.kind = ObjectiveKind.LOWER_IS_BETTER | ||
122 | costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold) | ||
123 | } | ||
124 | case GREATER: { | ||
125 | costObjectiveConfig.kind = ObjectiveKind.HIGHER_IS_BETTER | ||
126 | costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold) | ||
127 | } | ||
128 | case LESS_EQUALS: { | ||
129 | costObjectiveConfig.kind = ObjectiveKind.LOWER_IS_BETTER | ||
130 | costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold) | ||
131 | } | ||
132 | case GREATER_EQUALS: { | ||
133 | costObjectiveConfig.kind = ObjectiveKind.HIGHER_IS_BETTER | ||
134 | costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold) | ||
135 | } | ||
136 | default: | ||
137 | throw new IllegalArgumentException("Unknown operator: " + operator) | ||
138 | } | ||
139 | } | ||
140 | } | ||
141 | val function = objectiveEntry.function | ||
142 | if (function instanceof CostObjectiveFunction) { | ||
143 | for (costEntry : function.entries) { | ||
144 | val element = new CostObjectiveElementConfiguration | ||
145 | val pattern = costEntry.patternElement.pattern | ||
146 | val packageName = costEntry.patternElement.package?.packageName ?: | ||
147 | EcoreUtil2.getContainerOfType(pattern, PatternModel)?.packageName | ||
148 | element.patternQualifiedName = if (packageName.nullOrEmpty) { | ||
149 | pattern.name | ||
150 | } else { | ||
151 | packageName + "." + pattern.name | ||
152 | } | ||
153 | element.weight = costEntry.weight | ||
154 | costObjectiveConfig.elements += element | ||
155 | } | ||
156 | } else { | ||
157 | throw new IllegalArgumentException("Only cost objectives are supported by VIATRA.") | ||
158 | } | ||
159 | c.costObjectives += costObjectiveConfig | ||
160 | } | ||
161 | c | ||
162 | } | ||
163 | default: | ||
164 | throw new UnsupportedOperationException('''Unknown solver: «solver»''') | ||
92 | } | 165 | } |
93 | } | 166 | } |
94 | 167 | ||
95 | def dispatch void setRunIndex(AlloySolverConfiguration config, Map<String, String> parameters, int runIndex, ScriptConsole console) { | 168 | def dispatch void setRunIndex(AlloySolverConfiguration config, Map<String, String> parameters, int runIndex, |
96 | parameters.getAsBoolean("randomize",console).ifPresent[ | 169 | ScriptConsole console) { |
97 | if(it) { | 170 | parameters.getAsBoolean("randomize", console).ifPresent [ |
98 | config.randomise = runIndex-1 | 171 | if (it) { |
172 | config.randomise = runIndex - 1 | ||
99 | } | 173 | } |
100 | ] | 174 | ] |
101 | } | 175 | } |
102 | def dispatch void setRunIndex(LogicSolverConfiguration config, Map<String, String> parameters, int runIndex, ScriptConsole console) { | 176 | |
103 | 177 | def dispatch void setRunIndex(LogicSolverConfiguration config, Map<String, String> parameters, int runIndex, | |
178 | ScriptConsole console) { | ||
104 | } | 179 | } |
105 | } \ No newline at end of file | 180 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/StandaloneScriptExecutor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/StandaloneScriptExecutor.xtend index c612f0ea..42be3ed7 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/StandaloneScriptExecutor.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/StandaloneScriptExecutor.xtend | |||
@@ -1,27 +1,17 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.application.execution | 1 | package hu.bme.mit.inf.dslreasoner.application.execution |
2 | 2 | ||
3 | import com.google.inject.Guice | ||
4 | import com.google.inject.Injector | ||
3 | import hu.bme.mit.inf.dslreasoner.application.ApplicationConfigurationStandaloneSetup | 5 | import hu.bme.mit.inf.dslreasoner.application.ApplicationConfigurationStandaloneSetup |
4 | import org.eclipse.emf.common.util.URI | ||
5 | import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl | ||
6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript | 6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript |
7 | import org.eclipse.core.runtime.NullProgressMonitor | 7 | import org.eclipse.core.runtime.NullProgressMonitor |
8 | import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup | 8 | import org.eclipse.emf.common.util.URI |
9 | import org.eclipse.emf.ecore.util.EcoreUtil | ||
10 | import java.io.FileNotFoundException | ||
11 | import org.eclipse.emf.ecore.resource.Resource | 9 | import org.eclipse.emf.ecore.resource.Resource |
12 | import java.io.IOException | 10 | import org.eclipse.emf.ecore.util.EcoreUtil |
13 | import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl | 11 | import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl |
14 | import org.eclipse.viatra.query.runtime.matchers.backend.IQueryBackendFactoryProvider | 12 | import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup |
15 | import org.eclipse.viatra.query.runtime.rete.matcher.ReteBackendFactoryProvider | ||
16 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions | ||
17 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint | ||
18 | import org.eclipse.viatra.query.runtime.rete.util.ReteHintOptions | ||
19 | import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine | 13 | import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine |
20 | import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneCompilerSetup | ||
21 | import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetupGenerated | ||
22 | import org.eclipse.xtext.resource.XtextResourceSet | 14 | import org.eclipse.xtext.resource.XtextResourceSet |
23 | import com.google.inject.Injector | ||
24 | import com.google.inject.Guice | ||
25 | 15 | ||
26 | class StandaloneScriptExecutor { | 16 | class StandaloneScriptExecutor { |
27 | def static void main(String[] args) { | 17 | def static void main(String[] args) { |
@@ -81,11 +71,11 @@ class StandaloneScriptExecutor { | |||
81 | throw new IllegalArgumentException(message) | 71 | throw new IllegalArgumentException(message) |
82 | } | 72 | } |
83 | } else { | 73 | } else { |
84 | val message = ''' | 74 | val message = ''' |
85 | The Configuration Script contains «errors.size» error«IF errors.size>1»s«ENDIF»: | 75 | The Configuration Script contains «errors.size» error«IF errors.size>1»s«ENDIF»: |
86 | «FOR error : errors» | 76 | «FOR error : errors» |
87 | «"\t"»«error.message» | 77 | «"\t"»«error.message» |
88 | «ENDFOR» | 78 | «ENDFOR» |
89 | ''' | 79 | ''' |
90 | throw new IllegalArgumentException(message) | 80 | throw new IllegalArgumentException(message) |
91 | } | 81 | } |
@@ -94,8 +84,12 @@ class StandaloneScriptExecutor { | |||
94 | } | 84 | } |
95 | } | 85 | } |
96 | 86 | ||
97 | def static executeScript(String path){ | 87 | def static executeScript(String path) { |
98 | val executor = new ScriptExecutor | 88 | executeScript(path, StandardOutputBasedScriptConsole.FACTORY) |
89 | } | ||
90 | |||
91 | def static executeScript(String path, ScriptConsole.Factory scriptConsoleFactory){ | ||
92 | val executor = new ScriptExecutor(scriptConsoleFactory) | ||
99 | try{ | 93 | try{ |
100 | val content = loadScript(path) | 94 | val content = loadScript(path) |
101 | executor.executeScript(content,new NullProgressMonitor) | 95 | executor.executeScript(content,new NullProgressMonitor) |
@@ -104,4 +98,4 @@ class StandaloneScriptExecutor { | |||
104 | return e.message | 98 | return e.message |
105 | } | 99 | } |
106 | } | 100 | } |
107 | } \ No newline at end of file | 101 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/ApplicationConfigurationParser.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/ApplicationConfigurationParser.xtend index ea738c5a..0d11bd31 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/ApplicationConfigurationParser.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/ApplicationConfigurationParser.xtend | |||
@@ -15,4 +15,4 @@ class ApplicationConfigurationParser { | |||
15 | throw new IllegalArgumentException('''Content is not an ConfigurationScript! (got: «content.class.simpleName»)''') | 15 | throw new IllegalArgumentException('''Content is not an ConfigurationScript! (got: «content.class.simpleName»)''') |
16 | } | 16 | } |
17 | } | 17 | } |
18 | } \ No newline at end of file | 18 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/linking/ApplicationConfigurationLinkingService.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/linking/ApplicationConfigurationLinkingService.xtend index fc4b721a..fafba1d7 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/linking/ApplicationConfigurationLinkingService.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/linking/ApplicationConfigurationLinkingService.xtend | |||
@@ -2,123 +2,106 @@ package hu.bme.mit.inf.dslreasoner.application.linking | |||
2 | 2 | ||
3 | import com.google.inject.Inject | 3 | import com.google.inject.Inject |
4 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage | 4 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage |
5 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript | ||
6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport | 5 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport |
7 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternEntry | ||
8 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport | 6 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport |
9 | import java.util.Collections | 7 | import java.util.Collections |
10 | import java.util.List | ||
11 | import java.util.Optional | 8 | import java.util.Optional |
12 | import org.eclipse.emf.common.util.URI | 9 | import org.eclipse.emf.common.util.URI |
13 | import org.eclipse.emf.ecore.EObject | 10 | import org.eclipse.emf.ecore.EObject |
11 | import org.eclipse.emf.ecore.EPackage | ||
14 | import org.eclipse.emf.ecore.EReference | 12 | import org.eclipse.emf.ecore.EReference |
15 | import org.eclipse.emf.ecore.resource.Resource | 13 | import org.eclipse.emf.ecore.resource.Resource |
14 | import org.eclipse.emf.ecore.resource.ResourceSet | ||
16 | import org.eclipse.viatra.query.patternlanguage.emf.scoping.IMetamodelProvider | 15 | import org.eclipse.viatra.query.patternlanguage.emf.scoping.IMetamodelProvider |
17 | import org.eclipse.xtext.EcoreUtil2 | ||
18 | import org.eclipse.xtext.conversion.IValueConverterService | 16 | import org.eclipse.xtext.conversion.IValueConverterService |
19 | import org.eclipse.xtext.conversion.ValueConverterException | 17 | import org.eclipse.xtext.conversion.ValueConverterException |
20 | import org.eclipse.xtext.linking.impl.DefaultLinkingService | 18 | import org.eclipse.xtext.linking.impl.DefaultLinkingService |
21 | import org.eclipse.xtext.nodemodel.ILeafNode | 19 | import org.eclipse.xtext.nodemodel.ILeafNode |
22 | import org.eclipse.xtext.nodemodel.INode | 20 | import org.eclipse.xtext.nodemodel.INode |
23 | import org.eclipse.emf.ecore.resource.ResourceSet | ||
24 | import org.eclipse.emf.ecore.EPackage | ||
25 | 21 | ||
26 | class ApplicationConfigurationLinkingService extends DefaultLinkingService{ | 22 | class ApplicationConfigurationLinkingService extends DefaultLinkingService { |
23 | @Inject IValueConverterService valueConverterService | ||
24 | @Inject IMetamodelProvider metamodelProvider | ||
27 | 25 | ||
28 | //@Inject Logger logger | 26 | public static extension ApplicationConfigurationPackage pac = ApplicationConfigurationPackage.eINSTANCE |
29 | 27 | ||
30 | @Inject IValueConverterService valueConverterService | 28 | override getLinkedObjects(EObject context, EReference ref, INode node) { |
31 | @Inject IMetamodelProvider metamodelProvider | 29 | if (context instanceof EPackageImport) { |
32 | 30 | if (ref == EPackageImport_ImportedPackage && node instanceof ILeafNode) { | |
33 | public static extension ApplicationConfigurationPackage pac = ApplicationConfigurationPackage.eINSTANCE | 31 | return getEPackage(context, node as ILeafNode) |
32 | } | ||
33 | } else if (context instanceof ViatraImport) { | ||
34 | if (ref == viatraImport_ImportedViatra) { | ||
35 | return getViatra(context, node) | ||
36 | } | ||
37 | } | ||
38 | return super.getLinkedObjects(context, ref, node) | ||
39 | } | ||
34 | 40 | ||
35 | override getLinkedObjects(EObject context, EReference ref, INode node) { | 41 | private def getEPackage(EPackageImport packageImport, ILeafNode node) { |
36 | if(context instanceof EPackageImport) { | 42 | val x = getNSUri(node) |
37 | if(ref == EPackageImport_ImportedPackage && node instanceof ILeafNode) { | 43 | if (x.isPresent) { |
38 | return getEPackage(context as EPackageImport, node as ILeafNode) | 44 | val uriString = x.get |
39 | } | 45 | val epackageByMetamodelProvider = metamodelProvider.loadEPackage(uriString, |
40 | } else if(context instanceof ViatraImport) { | 46 | packageImport.eResource.resourceSet) |
41 | if(ref == viatraImport_ImportedViatra) { | 47 | val epackageByMe = ePackageByMe(packageImport.eResource.resourceSet, uriString) |
42 | return getViatra(context as ViatraImport, node) | 48 | if (epackageByMetamodelProvider !== null) { |
43 | } | 49 | return Collections.singletonList(epackageByMetamodelProvider as EObject) |
44 | } else if(context instanceof PatternEntry) { | 50 | } else if (epackageByMe !== null) { |
45 | if(ref === patternEntry_Package) { | 51 | return Collections.singletonList(epackageByMe as EObject) |
46 | return getViatraPackage(context as PatternEntry,node) | 52 | } else { |
47 | } | 53 | emptyList |
48 | } | 54 | } |
49 | return super.getLinkedObjects(context, ref, node) | 55 | } else { |
50 | } | 56 | return emptyList |
57 | } | ||
58 | } | ||
59 | |||
60 | private def ePackageByMe(ResourceSet rs, String uri) { | ||
61 | try { | ||
62 | val resource = rs.getResource(URI.createURI(uri), true); | ||
63 | return resource.contents.head as EPackage | ||
64 | } catch (Exception e) { | ||
65 | return null | ||
66 | } | ||
67 | } | ||
68 | |||
69 | private def getViatra(ViatraImport viatraImport, INode node) { | ||
70 | getByUri(viatraImport, viatraImport_ImportedViatra, node) | ||
71 | } | ||
51 | 72 | ||
52 | def getViatraPackage(PatternEntry entry, INode node) { | 73 | private def getByUri(EObject context, EReference ref, INode node) { |
53 | val document = EcoreUtil2.getContainerOfType(entry,ConfigurationScript) | 74 | val uri = getNSUri(node) |
54 | val nodeString = valueConverterService.toValue(node.text, | 75 | if (uri.present) { |
55 | linkingHelper.getRuleNameFrom(node.grammarElement), node).toString.replaceAll("\\s","") | 76 | var URI createdURI |
56 | val patternModels = document.imports.filter(ViatraImport).map[it.importedViatra].filterNull | 77 | try { |
57 | val List<EObject> patternModelsWithSameNamespace = patternModels.filter[nodeString.equals(it.packageName)].filter(EObject).toList | 78 | createdURI = URI.createURI(uri.get) |
58 | return patternModelsWithSameNamespace | 79 | } catch (IllegalArgumentException e) { |
80 | return super.getLinkedObjects(context, ref, node) | ||
81 | } | ||
82 | var Resource res | ||
83 | try { | ||
84 | res = context.eResource.resourceSet.getResource(createdURI, true); | ||
85 | } catch (RuntimeException e) { | ||
86 | return super.getLinkedObjects(context, ref, node) | ||
87 | } | ||
88 | if (res !== null && res.contents !== null) { | ||
89 | return res.contents.filter[ref.EType.isInstance(it)].toList | ||
90 | } else { | ||
91 | return super.getLinkedObjects(context, ref, node) | ||
92 | } | ||
93 | } else { | ||
94 | return super.getLinkedObjects(context, ref, node) | ||
95 | } | ||
59 | } | 96 | } |
60 | 97 | ||
61 | private def getEPackage(EPackageImport packageImport, ILeafNode node) { | 98 | private def getNSUri(INode node) { |
62 | val x = getNSUri(node) | 99 | try { |
63 | if(x.isPresent) { | 100 | val convertedValue = valueConverterService.toValue(node.text, |
64 | val uriString = x.get | 101 | linkingHelper.getRuleNameFrom(node.grammarElement), node) |
65 | val epackageByMetamodelProvider = metamodelProvider.loadEPackage(uriString, packageImport.eResource.resourceSet) | 102 | Optional.of(convertedValue as String) |
66 | val epackageByMe = ePackageByMe(packageImport.eResource.resourceSet,uriString) | 103 | } catch (ValueConverterException e) { |
67 | //println(epackageByMetamodelProvider) | 104 | Optional.empty |
68 | //println(epackageByMe) | 105 | } |
69 | if(epackageByMetamodelProvider!==null) { | 106 | } |
70 | return Collections.singletonList(epackageByMetamodelProvider as EObject) | 107 | } |
71 | } else if(epackageByMe !== null) { | ||
72 | return Collections.singletonList(epackageByMe as EObject) | ||
73 | } else { | ||
74 | emptyList | ||
75 | } | ||
76 | } else { | ||
77 | return emptyList | ||
78 | } | ||
79 | } | ||
80 | |||
81 | private def ePackageByMe(ResourceSet rs, String uri) { | ||
82 | try { | ||
83 | val resource = rs.getResource(URI.createURI(uri), true); | ||
84 | return resource.contents.head as EPackage | ||
85 | } catch (Exception e) { | ||
86 | return null | ||
87 | } | ||
88 | } | ||
89 | |||
90 | private def getViatra(ViatraImport viatraImport, INode node) { | ||
91 | val uri = getNSUri(node) | ||
92 | if(uri.present) { | ||
93 | var URI createdURI | ||
94 | try{ | ||
95 | createdURI = URI.createURI(uri.get) | ||
96 | }catch(IllegalArgumentException e) { | ||
97 | return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node) | ||
98 | } | ||
99 | var Resource res | ||
100 | try{ | ||
101 | res = viatraImport.eResource.resourceSet.getResource(createdURI,true); | ||
102 | } catch(RuntimeException e){ | ||
103 | return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node) | ||
104 | } | ||
105 | if(res!==null && !res.contents.nullOrEmpty) { | ||
106 | return #[res.contents.head] | ||
107 | } else { | ||
108 | return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node) | ||
109 | } | ||
110 | } else { | ||
111 | return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node) | ||
112 | } | ||
113 | } | ||
114 | |||
115 | private def getNSUri(INode node) { | ||
116 | try { | ||
117 | val convertedValue = valueConverterService.toValue(node.text, | ||
118 | linkingHelper.getRuleNameFrom(node.grammarElement), node) | ||
119 | Optional.of(convertedValue as String) | ||
120 | } catch (ValueConverterException e) { | ||
121 | Optional.empty | ||
122 | } | ||
123 | } | ||
124 | } \ No newline at end of file | ||
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend index 36948c2d..e5db9893 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend | |||
@@ -3,17 +3,12 @@ | |||
3 | */ | 3 | */ |
4 | package hu.bme.mit.inf.dslreasoner.application.scoping | 4 | package hu.bme.mit.inf.dslreasoner.application.scoping |
5 | 5 | ||
6 | import com.google.common.base.Function | 6 | import com.google.inject.Inject |
7 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.AllPackageEntry | ||
8 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.AllPatternEntry | ||
9 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage | ||
10 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ClassReference | ||
11 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript | 7 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript |
12 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport | 8 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport |
13 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelElement | 9 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelElement |
14 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelSpecification | 10 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelEntry |
15 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternElement | 11 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternEntry |
16 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternSpecification | ||
17 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport | 12 | import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport |
18 | import org.eclipse.emf.ecore.EClass | 13 | import org.eclipse.emf.ecore.EClass |
19 | import org.eclipse.emf.ecore.EEnum | 14 | import org.eclipse.emf.ecore.EEnum |
@@ -21,10 +16,11 @@ import org.eclipse.emf.ecore.EObject | |||
21 | import org.eclipse.emf.ecore.EReference | 16 | import org.eclipse.emf.ecore.EReference |
22 | import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternModel | 17 | import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternModel |
23 | import org.eclipse.xtext.EcoreUtil2 | 18 | import org.eclipse.xtext.EcoreUtil2 |
24 | import org.eclipse.xtext.naming.QualifiedName | 19 | import org.eclipse.xtext.naming.IQualifiedNameConverter |
25 | import org.eclipse.xtext.scoping.IScope | ||
26 | import org.eclipse.xtext.scoping.Scopes | 20 | import org.eclipse.xtext.scoping.Scopes |
27 | 21 | ||
22 | import static hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage.Literals.* | ||
23 | |||
28 | /** | 24 | /** |
29 | * This class contains custom scoping description. | 25 | * This class contains custom scoping description. |
30 | * | 26 | * |
@@ -32,150 +28,95 @@ import org.eclipse.xtext.scoping.Scopes | |||
32 | * on how and when to use it. | 28 | * on how and when to use it. |
33 | */ | 29 | */ |
34 | class ApplicationConfigurationScopeProvider extends AbstractApplicationConfigurationScopeProvider { | 30 | class ApplicationConfigurationScopeProvider extends AbstractApplicationConfigurationScopeProvider { |
35 | 31 | ||
36 | private val language = ApplicationConfigurationPackage.eINSTANCE | 32 | @Inject IQualifiedNameConverter qualifiedNameConverter |
37 | protected val nameConverter = new Function<PatternModel,QualifiedName>() { | 33 | |
38 | override apply(PatternModel input) { | ||
39 | println(input) | ||
40 | val res = QualifiedName.create(input.packageName.split("\\.")) | ||
41 | println(res.toString) | ||
42 | return res | ||
43 | } | ||
44 | } | ||
45 | |||
46 | override getScope(EObject context, EReference reference) { | 34 | override getScope(EObject context, EReference reference) { |
47 | val document = EcoreUtil2.getContainerOfType(context,ConfigurationScript) | 35 | val document = EcoreUtil2.getContainerOfType(context, ConfigurationScript) |
48 | if(context instanceof MetamodelElement) { | 36 | switch (reference) { |
49 | return context.scopeForMetamodelElement(reference,document) | 37 | case METAMODEL_ENTRY__PACKAGE: |
50 | } else if(context instanceof MetamodelSpecification) { | 38 | getEPackageScope(document) |
51 | return context.scopeForMetamodelSpecification(reference,document) | 39 | case METAMODEL_ELEMENT__CLASSIFIER: |
52 | } else if(context instanceof AllPackageEntry){ | 40 | getEClassifierScope(context, document) |
53 | return context.scopeForAllPackageEntry(reference,document) | 41 | case METAMODEL_ELEMENT__FEATURE: |
54 | } else if(context instanceof PatternElement) { | 42 | getEStructuralFeatureScope(context, reference, document) |
55 | return context.scopeForPatternElement(reference,document) | 43 | case PATTERN_ENTRY__PACKAGE: |
56 | } else if(context instanceof PatternSpecification) { | 44 | getViatraPackageScope(context, reference, document) |
57 | return context.scopeForPatternSpecification(reference,document) | 45 | case PATTERN_ELEMENT__PATTERN: |
58 | } else if(context instanceof AllPatternEntry) { | 46 | getViatraPatternScope(context, document) |
59 | return context.scopeForAllPatternEntry(reference,document) | 47 | default: |
60 | } else if(context instanceof ClassReference) { | 48 | super.getScope(context, reference) |
61 | return context.scopeForClassReference(reference,document) | ||
62 | }else { | ||
63 | return super.getScope(context,reference) | ||
64 | } | 49 | } |
65 | } | 50 | } |
66 | 51 | ||
67 | private def allEPackages(ConfigurationScript document) { | 52 | private def getAllEPackages(ConfigurationScript document) { |
68 | return document.imports.filter(EPackageImport).map[it.importedPackage].filterNull | 53 | document.imports.filter(EPackageImport).map[importedPackage].filterNull |
69 | } | 54 | } |
70 | private def allViatraPackages(ConfigurationScript document) { | 55 | |
71 | val res = document.imports.filter(ViatraImport).map[it.importedViatra].filterNull | 56 | private def getAllViatraPackages(ConfigurationScript document) { |
72 | //println('''All packages: «res.map[packageName].toList»''') | 57 | document.imports.filter(ViatraImport).map[importedViatra].filterNull |
73 | return res | ||
74 | } | 58 | } |
75 | private def allEClassifiers(ConfigurationScript document) { | 59 | |
60 | private def getAllEClassifiers(ConfigurationScript document) { | ||
76 | document.allEPackages.map[EClassifiers].flatten | 61 | document.allEPackages.map[EClassifiers].flatten |
77 | } | 62 | } |
78 | private def allPatterns(ConfigurationScript document) { | 63 | |
79 | val res = document.allViatraPackages.map[patterns].flatten | 64 | private def getAllPatterns(ConfigurationScript document) { |
80 | //println('''All patterns: «res.map[name].toList»''') | 65 | document.allViatraPackages.map[patterns].flatten |
81 | return res | ||
82 | } | 66 | } |
83 | 67 | ||
84 | protected def scopeForMetamodelElement(MetamodelElement context, EReference reference, ConfigurationScript document) { | 68 | private def getEPackageScope(ConfigurationScript document) { |
85 | if(reference === language.metamodelEntry_Package) { | 69 | Scopes.scopeFor(document.allEPackages) |
86 | return Scopes.scopeFor(document.allEPackages) | ||
87 | } else if(reference === language.metamodelElement_Classifier) { | ||
88 | if(context.package !== null) { | ||
89 | return Scopes.scopeFor(context.package.EClassifiers) | ||
90 | } else { | ||
91 | return Scopes.scopeFor(document.allEClassifiers) | ||
92 | } | ||
93 | } if (reference === language.metamodelElement_Feature) { | ||
94 | val referredClassifier = context.classifier | ||
95 | if(referredClassifier instanceof EClass) { | ||
96 | return Scopes.scopeFor(referredClassifier.EAllStructuralFeatures) | ||
97 | } else if(referredClassifier instanceof EEnum) { | ||
98 | return Scopes.scopeFor(referredClassifier.ELiterals) | ||
99 | } else { | ||
100 | super.getScope(context,reference) | ||
101 | } | ||
102 | } | ||
103 | } | 70 | } |
104 | 71 | ||
105 | protected def scopeForMetamodelSpecification(MetamodelSpecification context, EReference reference, ConfigurationScript document) { | 72 | private def getEClassifierScope(EObject context, ConfigurationScript document) { |
106 | if(reference === language.metamodelEntry_Package) { | 73 | val classifiers = switch (context) { |
107 | return Scopes.scopeFor(document.allEPackages) | 74 | MetamodelEntry case context.package !== null: |
108 | } else if(reference ===language.metamodelElement_Classifier) { | 75 | context.package.EClassifiers |
109 | return Scopes.scopeFor(document.allEClassifiers) | 76 | default: |
110 | } else { | 77 | document.allEClassifiers |
111 | return super.getScope(context,reference) | ||
112 | } | 78 | } |
79 | Scopes.scopeFor(classifiers) | ||
113 | } | 80 | } |
114 | 81 | ||
115 | protected def scopeForAllPackageEntry(AllPackageEntry context, EReference reference, ConfigurationScript document) { | 82 | private def getEStructuralFeatureScope(EObject context, EReference reference, ConfigurationScript document) { |
116 | if(reference === language.metamodelEntry_Package) { | 83 | val referredClassifier = if (context instanceof MetamodelElement) { |
117 | return Scopes.scopeFor(document.allEPackages) | 84 | context.classifier |
118 | } else if(reference === language.metamodelElement_Classifier) { | ||
119 | if(context.package === null) { | ||
120 | return Scopes.scopeFor(document.allEClassifiers) | ||
121 | } else { | 85 | } else { |
122 | return Scopes.scopeFor(context.package.EClassifiers) | 86 | null |
123 | } | 87 | } |
124 | } else { | 88 | switch (referredClassifier) { |
125 | return super.getScope(context,reference) | 89 | EClass: |
126 | } | 90 | Scopes.scopeFor(referredClassifier.EAllStructuralFeatures) |
127 | } | 91 | EEnum: |
128 | 92 | Scopes.scopeFor(referredClassifier.ELiterals) | |
129 | ////////// | 93 | default: |
130 | 94 | super.getScope(context, reference) | |
131 | def IScope scopeForClassReference(ClassReference classReference, EReference eReference, ConfigurationScript document) { | ||
132 | if(eReference === language.metamodelEntry_Package) { | ||
133 | return Scopes.scopeFor(document.allEPackages) | ||
134 | } else if(eReference === language.metamodelElement_Classifier) { | ||
135 | Scopes.scopeFor(document.allEClassifiers) | ||
136 | } else { | ||
137 | return super.getScope(classReference,eReference) | ||
138 | } | 95 | } |
139 | } | 96 | } |
140 | 97 | ||
141 | ////////// | 98 | private def getViatraPackageScope(EObject context, EReference reference, ConfigurationScript document) { |
142 | 99 | val patternModelNameConverter = [ PatternModel patternModel | | |
143 | protected def scopeForPatternElement(PatternElement context, EReference reference, ConfigurationScript document) { | 100 | toQualifiedNameOrNull(patternModel.packageName) |
144 | if(reference === language.patternEntry_Package) { | 101 | ] |
145 | return Scopes.scopeFor(document.allViatraPackages,nameConverter,super.getScope(context,reference)) | 102 | Scopes.scopeFor(document.allViatraPackages, patternModelNameConverter, super.getScope(context, reference)) |
146 | } else if(reference === language.patternElement_Pattern) { | ||
147 | if(context.package !== null) { | ||
148 | return Scopes.scopeFor(context.package.patterns) | ||
149 | } else { | ||
150 | return Scopes.scopeFor(document.allPatterns) | ||
151 | } | ||
152 | } else { | ||
153 | super.getScope(context,reference) | ||
154 | } | ||
155 | } | 103 | } |
156 | 104 | ||
157 | protected def scopeForPatternSpecification(PatternSpecification context, EReference reference, ConfigurationScript document) { | 105 | private def getViatraPatternScope(EObject context, ConfigurationScript document) { |
158 | if(reference === language.patternEntry_Package) { | 106 | val patterns = switch (context) { |
159 | return Scopes.scopeFor(document.allViatraPackages,nameConverter,super.getScope(context,reference)) | 107 | PatternEntry case context.package !== null: |
160 | } else if(reference ===language.patternElement_Pattern) { | 108 | context.package.patterns |
161 | return Scopes.scopeFor(document.allPatterns) | 109 | default: |
162 | } else { | 110 | document.allPatterns |
163 | return super.getScope(context,reference) | ||
164 | } | 111 | } |
112 | Scopes.scopeFor(patterns) | ||
165 | } | 113 | } |
166 | 114 | ||
167 | protected def scopeForAllPatternEntry(AllPatternEntry context, EReference reference, ConfigurationScript document) { | 115 | private def toQualifiedNameOrNull(String packageName) { |
168 | if(reference === language.patternEntry_Package) { | 116 | if (packageName === null) { |
169 | val res = Scopes.scopeFor(document.allViatraPackages,nameConverter,super.getScope(context,reference)) | 117 | null |
170 | return res | ||
171 | } else if(reference === language.patternElement_Pattern) { | ||
172 | if(context.package === null) { | ||
173 | return Scopes.scopeFor(document.allPatterns) | ||
174 | } else { | ||
175 | return Scopes.scopeFor(context.package.patterns) | ||
176 | } | ||
177 | } else { | 118 | } else { |
178 | return super.getScope(context,reference) | 119 | qualifiedNameConverter.toQualifiedName(packageName) |
179 | } | 120 | } |
180 | } | 121 | } |
181 | } | 122 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend index fccc433a..f736f6ba 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend | |||
@@ -73,4 +73,4 @@ class MetamodelValidator { | |||
73 | } | 73 | } |
74 | } | 74 | } |
75 | } | 75 | } |
76 | } \ No newline at end of file | 76 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend index e5488e50..7d79bbbb 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend | |||
@@ -49,4 +49,4 @@ class QueryAndMetamodelValidator { | |||
49 | ].flatten.filter(ENamedElement) | 49 | ].flatten.filter(ENamedElement) |
50 | ].flatten | 50 | ].flatten |
51 | } | 51 | } |
52 | } \ No newline at end of file | 52 | } |
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend index 433f7148..840ffb09 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend | |||
@@ -11,4 +11,4 @@ class ApplicationConfigurationValueConverterService extends DefaultTerminalConve | |||
11 | def IValueConverter<String> QualifiedName() { | 11 | def IValueConverter<String> QualifiedName() { |
12 | converter2 | 12 | converter2 |
13 | } | 13 | } |
14 | } \ No newline at end of file | 14 | } |