aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application
diff options
context:
space:
mode:
Diffstat (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application')
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext391
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfigurationStandaloneRuntimeModule.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/EclipseBasedProgressMonitor.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend19
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/MetamodelLoader.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend290
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsoleFileHiperlink.xtend28
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend32
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend190
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/StandaloneScriptExecutor.xtend40
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/ApplicationConfigurationParser.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/linking/ApplicationConfigurationLinkingService.xtend181
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/scoping/ApplicationConfigurationScopeProvider.xtend209
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/MetamodelValidator.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend4
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend2
21 files changed, 711 insertions, 695 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"
5generate applicationConfiguration "http://www.bme.hu/mit/inf/dslreasoner/application/ApplicationConfiguration" 5generate applicationConfiguration "http://www.bme.hu/mit/inf/dslreasoner/application/ApplicationConfiguration"
6 6
7ConfigurationScript: 7ConfigurationScript:
8 (imports += Import)* 8 (imports+=Import)*
9 (commands += Command)* 9 (commands+=Command)*;
10;
11 10
12Command : 11Command:
13 Declaration | Task 12 Declaration | Task;
14;
15 13
16QualifiedName returns ecore::EString: 14QualifiedName returns ecore::EString:
17 ID ('.' ID)*; 15 ID ('.' ID)*;
18REALLiteral returns ecore::EBigDecimal: '-'? INT '.' INT; 16
19INTLiteral returns ecore::EInt: '-'? INT; 17REALLiteral returns ecore::EBigDecimal:
18 '-'? INT '.' INT;
19
20INTLiteral returns ecore::EInt:
21 '-'? INT;
20 22
21/////////////////////////////////////////////////// 23///////////////////////////////////////////////////
22// Imports 24// Imports
23/////////////////////////////////////////////////// 25///////////////////////////////////////////////////
26Import:
27 EPackageImport | ViatraImport;
24 28
25Import: EPackageImport | ViatraImport; 29EPackageImport:
30 "import" "epackage" importedPackage=[ecore::EPackage|STRING];
26 31
27EPackageImport: "import" "epackage" importedPackage=[ecore::EPackage|STRING]; 32ViatraImport:
28ViatraImport: "import" "viatra" importedViatra=[viatra::PatternModel|STRING]; 33 "import" "viatra" importedViatra=[viatra::PatternModel|STRING];
29 34
30/////////////////////////////////////////////////// 35///////////////////////////////////////////////////
31// Declaration 36// Declaration
32/////////////////////////////////////////////////// 37///////////////////////////////////////////////////
33 38Declaration:
34Declaration :
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///////////////////////////////////////////////////
50FileSpecification:
51 path=STRING;
52
53FileDeclaration:
54 'file' name=ID '=' specification=FileSpecification;
46 55
47FileSpecification: path = STRING; 56FileReference:
48FileDeclaration: 'file' name = ID '=' specification = FileSpecification; 57 referred=[FileDeclaration];
49FileReference: referred = [FileDeclaration]; 58
50File: FileSpecification | FileReference; 59File:
60 FileSpecification | FileReference;
51 61
52/////////////////////////////////////////////////// 62///////////////////////////////////////////////////
53// Metamodel 63// Metamodel
54/////////////////////////////////////////////////// 64///////////////////////////////////////////////////
65MetamodelSpecification:
66 '{' (entries+=MetamodelEntry) (',' entries+=MetamodelEntry)* '}';
67
68MetamodelEntry:
69 MetamodelElement | AllPackageEntry;
70
71AllPackageEntry:
72 "package" package=[ecore::EPackage|QualifiedName] ("excluding" '{' exclusion+=MetamodelElement (','
73 exclusion+=MetamodelElement)* '}')?;
74
75MetamodelElement:
76 (package=[ecore::EPackage|QualifiedName] '::')? classifier=[ecore::EClassifier] ('.'
77 feature=[ecore::ENamedElement])?;
55 78
56MetamodelSpecification: '{' (entries += MetamodelEntry) (',' entries += MetamodelEntry)* '}'; 79MetamodelDeclaration:
57MetamodelEntry: MetamodelElement | AllPackageEntry; 80 'metamodel' name=ID specification=MetamodelSpecification;
58AllPackageEntry: "package" package=[ecore::EPackage|QualifiedName] ("excluding" '{'exclusion +=MetamodelElement (',' exclusion +=MetamodelElement)*'}')?;
59MetamodelElement: (package=[ecore::EPackage|QualifiedName] '::')? classifier = [ecore::EClassifier] ('.' feature= [ecore::ENamedElement])?;
60 81
61MetamodelDeclaration: 'metamodel' name = ID specification = MetamodelSpecification; 82MetamodelReference:
62MetamodelReference: referred = [MetamodelDeclaration]; 83 referred=[MetamodelDeclaration];
63Metamodel: MetamodelReference | MetamodelSpecification; 84
85Metamodel:
86 MetamodelReference | MetamodelSpecification;
64 87
65/////////////////////////////////////////////////// 88///////////////////////////////////////////////////
66// Partial Model 89// Partial Model
67/////////////////////////////////////////////////// 90///////////////////////////////////////////////////
91PartialModelSpecification:
92 '{' entry+=PartialModelEntry (',' entry+=PartialModelEntry)? '}';
93
94PartialModelEntry:
95 ModelEntry | FolderEntry;
96
97ModelEntry:
98 path=File;
99
100FolderEntry:
101 "folder" path=File ("excluding" "{" exclusion+=ModelEntry ("," exclusion+=ModelEntry)* "}")?;
102
103PartialModelDeclaration:
104 'models' name=ID specification=PartialModelSpecification;
68 105
69PartialModelSpecification: '{' entry += PartialModelEntry (',' entry += PartialModelEntry)? '}'; 106PartialModelReference:
70PartialModelEntry: ModelEntry | FolderEntry; 107 referred=[PartialModelDeclaration];
71ModelEntry: path = File;
72FolderEntry: "folder" path = File ("excluding" "{" exclusion += ModelEntry ("," exclusion += ModelEntry)* "}")?;
73 108
74PartialModelDeclaration: 'models' name = ID specification = PartialModelSpecification; 109PartialModel:
75PartialModelReference : referred = [PartialModelDeclaration]; 110 PartialModelSpecification | PartialModelReference;
76PartialModel: PartialModelSpecification | PartialModelReference;
77 111
78/////////////////////////////////////////////////// 112///////////////////////////////////////////////////
79// Patterns 113// Patterns
80/////////////////////////////////////////////////// 114///////////////////////////////////////////////////
115PatternSpecification:
116 '{' entries+=PatternEntry (',' entries+=PatternEntry)* '}';
117
118PatternEntry:
119 PatternElement | AllPatternEntry;
120
121AllPatternEntry:
122 'package' package=[viatra::PatternModel|QualifiedName] ('excluding' '{' exclusuion+=PatternElement (','
123 exclusuion+=PatternElement)* '}')?;
124
125PatternElement:
126 (package=[viatra::PatternModel|QualifiedName] '::')? pattern=[viatra::Pattern];
127
128GraphPatternDeclaration:
129 'constraints' name=ID specification=PatternSpecification;
130
131GraphPatternReference:
132 referred=[GraphPatternDeclaration];
133
134GraphPattern:
135 GraphPatternReference | PatternSpecification;
136
137///////////////////////////////////////////////////
138// Objectives
139///////////////////////////////////////////////////
140ObjectiveSpecification:
141 '{' entries+=ObjectiveEntry (',' entries+=ObjectiveEntry)* '}';
142
143ObjectiveEntry:
144 OptimizationEntry | ThresholdEntry;
145
146enum OptimizationDirection:
147 MINIMIZE='minimize' | MAXIMIZE='maximize';
148
149OptimizationEntry:
150 direction=OptimizationDirection function=ObjectiveFunction;
151
152enum ComparisonOperator:
153 LESS='<' | GREATER='>' | LESS_EQUALS='<=' | GREATER_EQUALS='>=';
81 154
82PatternSpecification: '{' entries += PatternEntry (',' entries += PatternEntry)* '}'; 155ThresholdEntry:
83PatternEntry: PatternElement | AllPatternEntry; 156 function=ObjectiveFunction operator=ComparisonOperator threshold=REALLiteral;
84AllPatternEntry: 'package' package = [viatra::PatternModel|QualifiedName] ('excluding' '{' exclusuion += PatternElement (',' exclusuion += PatternElement)* '}')?;
85PatternElement: (package =[viatra::PatternModel|QualifiedName] '::')? pattern = [viatra::Pattern];
86 157
87GraphPatternDeclaration: 'constraints' name = ID specification = PatternSpecification; 158ObjectiveFunction:
88GraphPatternReference: referred = [GraphPatternDeclaration]; 159 CostObjectiveFunction;
89GraphPattern: GraphPatternReference|PatternSpecification; 160
161CostObjectiveFunction:
162 'cost' '{' entries+=CostEntry (',' entries+=CostEntry)* '}';
163
164CostEntry:
165 patternElement=PatternElement '=' weight=INTLiteral;
166
167ObjectiveDeclaration:
168 'objectives' name=ID specification=ObjectiveSpecification;
169
170ObjectiveReference:
171 referred=[ObjectiveDeclaration];
172
173Objective:
174 ObjectiveReference | ObjectiveSpecification;
90 175
91/////////////////////////////////////////////////// 176///////////////////////////////////////////////////
92// SolverConfig 177// SolverConfig
93/////////////////////////////////////////////////// 178///////////////////////////////////////////////////
179ConfigSpecification:
180 {ConfigSpecification} '{'
181 (entries+=ConfigEntry ("," entries+=ConfigEntry)*)?
182 '}';
183
184ConfigDeclaration:
185 'config' name=ID specification=ConfigSpecification;
186
187ConfigEntry:
188 DocumentationEntry | RuntimeEntry | MemoryEntry | CustomEntry;
189
190DocumentationEntry:
191 "log-level" '=' level=DocumentLevelSpecification;
94 192
95ConfigSpecification: {ConfigSpecification}'{' 193enum DocumentLevelSpecification:
96 (entries += ConfigEntry ("," entries += ConfigEntry)*)? 194 none | normal | full;
195
196RuntimeEntry:
197 "runtime" "=" millisecLimit=INT;
198
199MemoryEntry:
200 "memory" "=" megabyteLimit=INT;
201
202CustomEntry:
203 key=STRING "=" value=STRING;
204
205ConfigReference:
206 config=[ConfigDeclaration];
207
208Config:
209 ConfigSpecification | ConfigReference;
210
211enum Solver:
212 SMTSolver | AlloySolver | ViatraSolver;
213
214ScopeSpecification:
215 {ScopeSpecification} '{'
216 (scopes+=TypeScope (',' scopes+=TypeScope)*)?
97 '}'; 217 '}';
98ConfigDeclaration : 218
99 'config' name = ID specification = ConfigSpecification 219TypeScope:
100; 220 ClassTypeScope | ObjectTypeScope | IntegerTypeScope | RealTypeScope | StringTypeScope;
101ConfigEntry: DocumentationEntry | RuntimeEntry | MemoryEntry | CustomEntry; 221
102DocumentationEntry: "log-level" '=' level = DocumentLevelSpecification; enum DocumentLevelSpecification: none | normal | full; 222ClassTypeScope:
103RuntimeEntry: "runtime" "=" millisecLimit = INT; 223 '#' type=ClassReference
104MemoryEntry: "memory" "=" megabyteLimit = INT; 224 (setsNew?='+=' | setsSum?='=')
105CustomEntry: key = STRING "=" value = STRING; 225 (number=ExactNumber | number=IntervallNumber);
106 226
107ConfigReference: config = [ConfigDeclaration]; 227ObjectTypeScope:
108Config: ConfigSpecification | ConfigReference; 228 '#' type=ObjectReference
109 229 (setsNew?='+=' | setsSum?='=')
110enum Solver: SMTSolver | AlloySolver | ViatraSolver; 230 (number=ExactNumber | number=IntervallNumber);
111 231
112ScopeSpecification: {ScopeSpecification} '{' 232IntegerTypeScope:
113 (scopes += TypeScope (',' scopes += TypeScope)*)? 233 '#' type=IntegerReference
114'}'; 234 (setsNew?='+=' | setsSum?='=')
115TypeScope: ClassTypeScope | ObjectTypeScope | IntegerTypeScope | RealTypeScope | StringTypeScope; 235 (number=ExactNumber | number=IntervallNumber | number=IntEnumberation);
116ClassTypeScope: '#' type = ClassReference 236
117 (setsNew ?='+=' | setsSum ?= '=') 237RealTypeScope:
118 (number = ExactNumber | number = IntervallNumber) 238 '#' type=RealReference
119; 239 (setsNew?='+=' | setsSum?='=')
120ObjectTypeScope: '#' type = ObjectReference 240 (number=ExactNumber | number=IntervallNumber | number=RealEnumeration);
121 (setsNew ?='+=' | setsSum ?= '=') 241
122 (number = ExactNumber | number = IntervallNumber) 242StringTypeScope:
123; 243 '#' type=StringReference
124IntegerTypeScope: '#' type = IntegerReference 244 (setsNew?='+=' | setsSum?='=')
125 (setsNew ?='+=' | setsSum ?= '=') 245 (number=ExactNumber | number=IntervallNumber | number=StringEnumeration);
126 (number = ExactNumber | number = IntervallNumber | number = IntEnumberation) 246
127; 247TypeReference:
128RealTypeScope: '#' type = RealReference 248 ClassReference | ObjectReference | IntegerReference | RealReference | StringReference;
129 (setsNew ?='+=' | setsSum ?= '=') 249
130 (number = ExactNumber | number = IntervallNumber | number = RealEnumeration) 250ClassReference:
131; 251 '<' element=MetamodelElement '>';
132StringTypeScope: '#' type = StringReference 252
133 (setsNew ?='+=' | setsSum ?= '=') 253ObjectReference:
134 (number = ExactNumber | number = IntervallNumber | number = StringEnumeration) 254 {ObjectReference} 'node';
135; 255
136 256IntegerReference:
137TypeReference: ClassReference | ObjectReference | IntegerReference | RealReference | StringReference; 257 {IntegerScope} 'int';
138ClassReference: '<' element = MetamodelElement '>'; 258
139ObjectReference: {ObjectReference} 'node'; 259RealReference:
140IntegerReference: {IntegerScope} 'int'; 260 {RealScope} 'real';
141RealReference: {RealScope} 'real'; 261
142StringReference: {StringScope} 'string'; 262StringReference:
143 263 {StringScope} 'string';
144NumberSpecification: ExactNumber | IntervallNumber | IntEnumberation | RealEnumeration | StringEnumeration; 264
145ExactNumber: exactNumber = INT | exactUnlimited ?= '*'; 265NumberSpecification:
146IntervallNumber: min = INT '..' (maxNumber = INT | maxUnlimited ?= '*'); 266 ExactNumber | IntervallNumber | IntEnumberation | RealEnumeration | StringEnumeration;
147IntEnumberation: {IntEnumberation} '{' (entry += INTLiteral (',' entry += INTLiteral)*)?'}'; 267
148RealEnumeration: {RealEnumeration} '{' (entry += REALLiteral (',' entry += REALLiteral)*)?'}'; 268ExactNumber:
149StringEnumeration: {StringEnumeration} '{' (entry += STRING (',' entry += STRING)*)?'}'; 269 exactNumber=INT | exactUnlimited?='*';
150 270
151ScopeDeclaration: 'scope' name = ID specification = ScopeSpecification; 271IntervallNumber:
152ScopeReference: referred = [ScopeDeclaration]; 272 min=INT '..' (maxNumber=INT | maxUnlimited?='*');
153Scope: ScopeSpecification | ScopeReference; 273
154 274IntEnumberation:
155Task: GenerationTask /*| CoverageCalculation | ValidationTask*/; 275 {IntEnumberation} '{' (entry+=INTLiteral (',' entry+=INTLiteral)*)? '}';
156 276
157GenerationTask: 'generate' {GenerationTask} '{'( 277RealEnumeration:
158 278 {RealEnumeration} '{' (entry+=REALLiteral (',' entry+=REALLiteral)*)? '}';
159 // domain 279
160 ('metamodel' '=' metamodel = Metamodel)? & 280StringEnumeration:
161 ('partial-model' '=' partialModel = PartialModel)? & 281 {StringEnumeration} '{' (entry+=STRING (',' entry+=STRING)*)? '}';
162 ('constraints' '=' patterns = GraphPattern)? & 282
163 283ScopeDeclaration:
164 // model set 284 'scope' name=ID specification=ScopeSpecification;
165 ('scope' '=' scope = Scope)? & 285
166 (numberSpecified ?= 'number' '=' number= INT)? & 286ScopeReference:
167 (runSpecified ?= 'runs' '=' runs = INT)? & 287 referred=[ScopeDeclaration];
168 // Solver 288
169 ('solver' '=' solver = Solver)? & 289Scope:
170 ('config' '=' config = Config)? & 290 ScopeSpecification | ScopeReference;
171 291
172 // output texts 292Task:
173 ('debug' '=' debugFolder = File)? & 293 GenerationTask /*| CoverageCalculation | ValidationTask*/;
174 ('log' '=' targetLogFile = File)? & 294
175 ('statistics' '=' targetStatisticsFile = File)? & 295GenerationTask:
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 aa98e268..c3ba9f81 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
@@ -2,8 +2,6 @@ package hu.bme.mit.inf.dslreasoner.application.execution
2 2
3import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript 3import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript
4import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.GenerationTask 4import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.GenerationTask
5import hu.bme.mit.inf.dslreasoner.application.validation.MetamodelValidator
6import hu.bme.mit.inf.dslreasoner.application.validation.QueryAndMetamodelValidator
7import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic 5import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
8import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration 6import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration
9import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel 7import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel
@@ -35,12 +33,10 @@ class GenerationTaskExecutor {
35 val scopeLoader = new ScopeLoader 33 val scopeLoader = new ScopeLoader
36 val statisticsUtil = new StatisticSections2CSV 34 val statisticsUtil = new StatisticSections2CSV
37 35
38 val metamodelValidator = new MetamodelValidator
39 val queryAndMetamodelValidator = new QueryAndMetamodelValidator
40
41 def executeGenerationTask( 36 def executeGenerationTask(
42 GenerationTask task, 37 GenerationTask task,
43 ScriptExecutor scriptExecutor, 38 ScriptExecutor scriptExecutor,
39 ScriptConsole.Factory scriptConsoleFactory,
44 IProgressMonitor monitor) 40 IProgressMonitor monitor)
45 { 41 {
46 monitor.subTask('''Collecting all resources''') 42 monitor.subTask('''Collecting all resources''')
@@ -62,7 +58,7 @@ class GenerationTaskExecutor {
62 val memoryLimit = scriptExecutor.getMemoryLimit(configSpecification) 58 val memoryLimit = scriptExecutor.getMemoryLimit(configSpecification)
63 59
64 // 2. create console 60 // 2. create console
65 val console = new ScriptConsole(true,false, 61 val console = scriptConsoleFactory.createScriptConsole(false,
66 if(messageFile!==null) URI.createURI(messageFile.path) else null, 62 if(messageFile!==null) URI.createURI(messageFile.path) else null,
67 if(debugFolder!==null) URI.createURI('''«debugFolder.path»/errors.txt''') else null, 63 if(debugFolder!==null) URI.createURI('''«debugFolder.path»/errors.txt''') else null,
68 if(statisticsFile!==null) URI.createURI(statisticsFile.path) else null 64 if(statisticsFile!==null) URI.createURI(statisticsFile.path) else null
@@ -132,11 +128,12 @@ class GenerationTaskExecutor {
132 // 5. create a solver and a configuration 128 // 5. create a solver and a configuration
133 // 5.1 initialize 129 // 5.1 initialize
134 val solver = solverLoader.loadSolver(task.solver,configurationMap) 130 val solver = solverLoader.loadSolver(task.solver,configurationMap)
135 131 val objectiveSpecification = scriptExecutor.getObjectiveSpecification(task.objectives)
136 val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,console) 132 val objectiveEntries = objectiveSpecification?.entries ?: emptyList
133 val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,objectiveEntries,console)
137 // 5.2 set values that defined directly 134 // 5.2 set values that defined directly
138 solverConfig.solutionScope = new SolutionScope => [ 135 solverConfig.solutionScope = new SolutionScope => [
139 it.numberOfRequiredSolution = if(task.numberSpecified) { 136 it.numberOfRequiredSolutions = if(task.numberSpecified) {
140 task.number 137 task.number
141 } else { 138 } else {
142 1 139 1
@@ -303,7 +300,7 @@ class GenerationTaskExecutor {
303 console.flushStatistics 300 console.flushStatistics
304 console.writeMessage("Model generation finished") 301 console.writeMessage("Model generation finished")
305 } catch(Exception e) { 302 } catch(Exception e) {
306 console.writeError(''' 303 console.writeError('''
307 Error occured («e.class.simpleName»): «e.message» 304 Error occured («e.class.simpleName»): «e.message»
308 «FOR s : e.stackTrace SEPARATOR "\n"» «s»«ENDFOR»''') 305 «FOR s : e.stackTrace SEPARATOR "\n"» «s»«ENDFOR»''')
309 } 306 }
@@ -349,4 +346,4 @@ class GenerationTaskExecutor {
349 return false 346 return false
350 } 347 }
351 } 348 }
352} \ No newline at end of file 349}
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 cfb1f09b..d49a0f2a 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
9import java.util.LinkedList 9import java.util.LinkedList
10import java.util.List 10import java.util.List
11import java.util.Map 11import java.util.Map
12import java.util.concurrent.CompletableFuture
13import javax.swing.text.BadLocationException
14import org.eclipse.emf.common.util.URI 12import org.eclipse.emf.common.util.URI
15import org.eclipse.jface.text.DocumentEvent
16import org.eclipse.jface.text.IDocumentListener
17import org.eclipse.swt.graphics.Color
18import org.eclipse.ui.console.ConsolePlugin
19import org.eclipse.ui.console.MessageConsole
20import org.eclipse.ui.console.MessageConsoleStream
21import org.eclipse.xtend.lib.annotations.Data 13import org.eclipse.xtend.lib.annotations.Data
22 14
23//import org.eclipse.ui.console.MessageConsole 15abstract class ScriptConsole {
24
25class 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 169class 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
281class ScriptConsoleDecorator { 184class 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 @@
1package hu.bme.mit.inf.dslreasoner.application.execution
2
3import org.eclipse.ui.console.IHyperlink
4import org.eclipse.ui.ide.IDE
5import org.eclipse.ui.PlatformUI
6import org.eclipse.core.filesystem.EFS
7import java.io.File
8import java.net.URI
9
10class 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 04449a74..3dea677f 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
@@ -14,6 +14,8 @@ import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.GraphPatt
14import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MemoryEntry 14import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MemoryEntry
15import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelReference 15import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelReference
16import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelSpecification 16import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelSpecification
17import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveReference
18import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveSpecification
17import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PartialModelReference 19import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PartialModelReference
18import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PartialModelSpecification 20import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PartialModelSpecification
19import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternSpecification 21import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternSpecification
@@ -29,14 +31,18 @@ import org.eclipse.core.runtime.IProgressMonitor
29import org.eclipse.core.runtime.Status 31import org.eclipse.core.runtime.Status
30import org.eclipse.core.runtime.jobs.Job 32import org.eclipse.core.runtime.jobs.Job
31import org.eclipse.emf.common.util.URI 33import org.eclipse.emf.common.util.URI
34import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
32 35
36@FinalFieldsConstructor
33class ScriptExecutor { 37class 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,10 +59,10 @@ 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 val intermediateScriptConsole = new ScriptConsole(true,false,null,null,null) 65 val intermediateScriptConsole = scriptConsoleFactory.createScriptConsole(false, null, null, null)
60 66
61 for(taskIndex : 0..<tasks.size) { 67 for(taskIndex : 0..<tasks.size) {
62 if(taskIndex>0) { 68 if(taskIndex>0) {
@@ -94,12 +100,12 @@ class ScriptExecutor {
94// } 100// }
95 } 101 }
96 102
97 def public dispatch execute(GenerationTask task, IProgressMonitor monitor) { 103 def dispatch void execute(GenerationTask task, IProgressMonitor monitor) {
98 val generationTaskExecutor = new GenerationTaskExecutor 104 val generationTaskExecutor = new GenerationTaskExecutor
99 generationTaskExecutor.executeGenerationTask(task,this,monitor) 105 generationTaskExecutor.executeGenerationTask(task,this,scriptConsoleFactory,monitor)
100 } 106 }
101 107
102 def public dispatch execute(Task task, IProgressMonitor monitor) { 108 def dispatch void execute(Task task, IProgressMonitor monitor) {
103 throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''') 109 throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''')
104 } 110 }
105 111
@@ -174,6 +180,16 @@ class ScriptExecutor {
174 null 180 null
175 } 181 }
176 182
183 def dispatch getObjectiveSpecification(ObjectiveSpecification config) {
184 config
185 }
186 def dispatch getObjectiveSpecification(ObjectiveReference config) {
187 config.referred.specification
188 }
189 def dispatch getObjectiveSpecification(Void config) {
190 null
191 }
192
177 def dispatch getConfiguration(ConfigSpecification config) { 193 def dispatch getConfiguration(ConfigSpecification config) {
178 config 194 config
179 } 195 }
@@ -238,6 +254,7 @@ class ScriptExecutor {
238 } 254 }
239 } 255 }
240 } 256 }
257
241 static val boolean measuring = true 258 static val boolean measuring = true
242 static def restForMeasurements(ScriptConsole console) { 259 static def restForMeasurements(ScriptConsole console) {
243 if(measuring) { 260 if(measuring) {
@@ -248,4 +265,5 @@ class ScriptExecutor {
248 Thread.sleep(2500) 265 Thread.sleep(2500)
249 } 266 }
250 } 267 }
251} \ No newline at end of file 268}
269
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 2fe69a47..b1be56cb 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,45 +1,47 @@
1package hu.bme.mit.inf.dslreasoner.application.execution 1package hu.bme.mit.inf.dslreasoner.application.execution
2 2
3import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloyBackendSolver
4import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolver 3import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolver
5import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolverConfiguration 4import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.AlloySolverConfiguration
5import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.CostObjectiveFunction
6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveEntry
7import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.OptimizationEntry
6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.Solver 8import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.Solver
9import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ThresholdEntry
7import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration 10import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicSolverConfiguration
8import hu.bme.mit.inf.dslreasoner.smt.reasoner.SMTSolver 11import hu.bme.mit.inf.dslreasoner.smt.reasoner.SMTSolver
9import hu.bme.mit.inf.dslreasoner.smt.reasoner.SmtSolverConfiguration 12import hu.bme.mit.inf.dslreasoner.smt.reasoner.SmtSolverConfiguration
13import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.CostObjectiveConfiguration
14import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.CostObjectiveElementConfiguration
15import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor
10import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner 16import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner
11import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration 17import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration
18import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveKind
19import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveThreshold
20import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser
21import java.util.List
12import java.util.Map 22import java.util.Map
13import java.util.Optional 23import java.util.Optional
24import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternModel
25import org.eclipse.xtext.EcoreUtil2
14import org.eclipse.xtext.xbase.lib.Functions.Function1 26import org.eclipse.xtext.xbase.lib.Functions.Function1
15import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser
16import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DiversityDescriptor
17import hu.bme.mit.inf.dlsreasoner.alloy.reasoner.builder.SolverConfiguration
18 27
19class SolverLoader { 28class SolverLoader {
20 def loadSolver(Solver solver, Map<String, String> config) { 29 def loadSolver(Solver solver, Map<String, String> config) {
21 switch(solver) { 30 switch (solver) {
22 case ALLOY_SOLVER: return new AlloySolver 31 case ALLOY_SOLVER: return new AlloySolver
23 case SMT_SOLVER: return new SMTSolver 32 case SMT_SOLVER: return new SMTSolver
24 case VIATRA_SOLVER: return new ViatraReasoner 33 case VIATRA_SOLVER: return new ViatraReasoner
25 } 34 }
26 } 35 }
27 36
28 37 private def <Type> Optional<Type> getAsType(Map<String, String> config, String key, ScriptConsole console,
29 38 Function1<String, Type> parser, Class<Type> requestedType) {
30 private def <Type> Optional<Type> getAsType( 39 if (config.containsKey(key)) {
31 Map<String, String> config,
32 String key,
33 ScriptConsole console,
34 Function1<String,Type> parser,
35 Class<Type> requestedType)
36 {
37 if(config.containsKey(key)) {
38 val stringValue = config.get(key) 40 val stringValue = config.get(key)
39 try{ 41 try {
40 val parsedValue = parser.apply(stringValue) 42 val parsedValue = parser.apply(stringValue)
41 return Optional.of(parsedValue) 43 return Optional.of(parsedValue)
42 } catch(Exception e) { 44 } catch (Exception e) {
43 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»!''')
44 return Optional::empty 46 return Optional::empty
45 } 47 }
@@ -47,45 +49,54 @@ class SolverLoader {
47 return Optional::empty 49 return Optional::empty
48 } 50 }
49 } 51 }
52
50 private def getAsInteger(Map<String, String> config, String key, ScriptConsole console) { 53 private def getAsInteger(Map<String, String> config, String key, ScriptConsole console) {
51 return getAsType(config,key,console,[x|Integer.parseInt(x)],Integer) 54 return getAsType(config, key, console, [x|Integer.parseInt(x)], Integer)
52 } 55 }
56
53 private def getAsBoolean(Map<String, String> config, String key, ScriptConsole console) { 57 private def getAsBoolean(Map<String, String> config, String key, ScriptConsole console) {
54 return getAsType(config,key,console,[x|Boolean.parseBoolean(x)],Boolean) 58 return getAsType(config, key, console, [x|Boolean.parseBoolean(x)], Boolean)
55 } 59 }
60
56 private def getAsDouble(Map<String, String> config, String key, ScriptConsole console) { 61 private def getAsDouble(Map<String, String> config, String key, ScriptConsole console) {
57 return getAsType(config,key,console,[x|Double.parseDouble(x)],Double) 62 return getAsType(config, key, console, [x|Double.parseDouble(x)], Double)
58 } 63 }
59 64
60 def loadSolverConfig( 65 def loadSolverConfig(Solver solver, Map<String, String> config, List<ObjectiveEntry> objectiveEntries,
61 Solver solver, 66 ScriptConsole console) {
62 Map<String, String> config, 67 switch (solver) {
63 ScriptConsole console) 68 case ALLOY_SOLVER: {
64 { 69 if (!objectiveEntries.empty) {
65 if(solver === Solver::ALLOY_SOLVER) { 70 throw new IllegalArgumentException("Objectives are not supported by Alloy.")
66 return new AlloySolverConfiguration => [c| 71 }
67 config.getAsInteger("symmetry",console) 72 val c = new SmtSolverConfiguration
68 .ifPresent[c.symmetry = it] 73 config.getAsBoolean("fixRandomSeed", console).ifPresent[c.fixRandomSeed = it]
69 config.getAsType("solver",console,[x|AlloyBackendSolver::valueOf(x)],AlloyBackendSolver) 74 config.getAsType("path", console, [it], String).ifPresent[c.solverPath = it]
70 .ifPresent[c.solver = it] 75 c
71 ] 76 }
72 } else if(solver === Solver::SMT_SOLVER) { 77 case SMT_SOLVER: {
73 return new SmtSolverConfiguration => [c| 78 if (!objectiveEntries.empty) {
74 config.getAsBoolean("fixRandomSeed",console).ifPresent[c.fixRandomSeed = it] 79 throw new IllegalArgumentException("Objectives are not supported by Z3.")
75 config.getAsType("path",console,[it],String).ifPresent[c.solverPath = it] 80 }
76 ] 81 val c = new SmtSolverConfiguration
77 } else if(solver === Solver::VIATRA_SOLVER) { 82 config.getAsBoolean("fixRandomSeed", console).ifPresent[c.fixRandomSeed = it]
78 return new ViatraReasonerConfiguration => [c| 83 config.getAsType("path", console, [it], String).ifPresent[c.solverPath = it]
79 c.debugCongiguration.partialInterpretatioVisualiser = new GraphvizVisualiser 84 c
80 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")) {
81 val stringValue = config.get("diversity-range") 90 val stringValue = config.get("diversity-range")
82 try{ 91 try {
83 val range = Integer.parseInt(stringValue) 92 val range = Integer.parseInt(stringValue)
84 c.diversityRequirement = new DiversityDescriptor => [ 93 c.diversityRequirement = new DiversityDescriptor => [
85 it.ensureDiversity = true 94 it.ensureDiversity = true
86 it.range = range 95 it.range = range
87 ] 96 ]
88 } catch (NumberFormatException e) {console.writeError('''Malformed number format: «e.message»''')} 97 } catch (NumberFormatException e) {
98 console.writeError('''Malformed number format: «e.message»''')
99 }
89 } 100 }
90 if(config.containsKey("numeric-solver-at-end")) { 101 if(config.containsKey("numeric-solver-at-end")) {
91 val stringValue = config.get("numeric-solver-at-end") 102 val stringValue = config.get("numeric-solver-at-end")
@@ -124,26 +135,83 @@ class SolverLoader {
124 c.unfinishedWFWeight = Integer.parseInt(stringValue) 135 c.unfinishedWFWeight = Integer.parseInt(stringValue)
125 } catch(Exception e) {} 136 } catch(Exception e) {}
126 } 137 }
127 if(config.containsKey("fitness-objectCreationCosts")) { 138 for (objectiveEntry : objectiveEntries) {
128 val stringValue = config.get("fitness-objectCreationCosts") 139 val costObjectiveConfig = new CostObjectiveConfiguration
129 try { 140 switch (objectiveEntry) {
130 c.calculateObjectCreationCosts = Boolean.parseBoolean(stringValue) 141 OptimizationEntry: {
131 } catch(Exception e) {} 142 costObjectiveConfig.findExtremum = true
143 costObjectiveConfig.kind = switch (direction : objectiveEntry.direction) {
144 case MAXIMIZE:
145 ObjectiveKind.HIGHER_IS_BETTER
146 case MINIMIZE:
147 ObjectiveKind.LOWER_IS_BETTER
148 default:
149 throw new IllegalArgumentException("Unknown direction: " + direction)
150 }
151 costObjectiveConfig.threshold = ObjectiveThreshold.NO_THRESHOLD
152 }
153 ThresholdEntry: {
154 costObjectiveConfig.findExtremum = false
155 val threshold = objectiveEntry.threshold.doubleValue
156 switch (operator : objectiveEntry.operator) {
157 case LESS: {
158 costObjectiveConfig.kind = ObjectiveKind.LOWER_IS_BETTER
159 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
160 }
161 case GREATER: {
162 costObjectiveConfig.kind = ObjectiveKind.HIGHER_IS_BETTER
163 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
164 }
165 case LESS_EQUALS: {
166 costObjectiveConfig.kind = ObjectiveKind.LOWER_IS_BETTER
167 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
168 }
169 case GREATER_EQUALS: {
170 costObjectiveConfig.kind = ObjectiveKind.HIGHER_IS_BETTER
171 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
172 }
173 default:
174 throw new IllegalArgumentException("Unknown operator: " + operator)
175 }
176 }
177 }
178 val function = objectiveEntry.function
179 if (function instanceof CostObjectiveFunction) {
180 for (costEntry : function.entries) {
181 val element = new CostObjectiveElementConfiguration
182 val pattern = costEntry.patternElement.pattern
183 val packageName = costEntry.patternElement.package?.packageName ?:
184 EcoreUtil2.getContainerOfType(pattern, PatternModel)?.packageName
185 element.patternQualifiedName = if (packageName.nullOrEmpty) {
186 pattern.name
187 } else {
188 packageName + "." + pattern.name
189 }
190 element.weight = costEntry.weight
191 costObjectiveConfig.elements += element
192 }
193 } else {
194 throw new IllegalArgumentException("Only cost objectives are supported by VIATRA.")
195 }
196 c.costObjectives += costObjectiveConfig
132 } 197 }
133 ] 198 c
134 } else { 199 }
135 throw new UnsupportedOperationException('''Unknown solver: «solver»''') 200 default:
201 throw new UnsupportedOperationException('''Unknown solver: «solver»''')
136 } 202 }
137 } 203 }
138 204
139 def dispatch void setRunIndex(AlloySolverConfiguration config, Map<String, String> parameters, int runIndex, ScriptConsole console) { 205 def dispatch void setRunIndex(AlloySolverConfiguration config, Map<String, String> parameters, int runIndex,
140 parameters.getAsBoolean("randomize",console).ifPresent[ 206 ScriptConsole console) {
141 if(it) { 207 parameters.getAsBoolean("randomize", console).ifPresent [
142 config.randomise = runIndex-1 208 if (it) {
209 config.randomise = runIndex - 1
143 } 210 }
144 ] 211 ]
145 } 212 }
146 def dispatch void setRunIndex(LogicSolverConfiguration config, Map<String, String> parameters, int runIndex, ScriptConsole console) { 213
147 214 def dispatch void setRunIndex(LogicSolverConfiguration config, Map<String, String> parameters, int runIndex,
215 ScriptConsole console) {
148 } 216 }
149} \ No newline at end of file 217}
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 @@
1package hu.bme.mit.inf.dslreasoner.application.execution 1package hu.bme.mit.inf.dslreasoner.application.execution
2 2
3import com.google.inject.Guice
4import com.google.inject.Injector
3import hu.bme.mit.inf.dslreasoner.application.ApplicationConfigurationStandaloneSetup 5import hu.bme.mit.inf.dslreasoner.application.ApplicationConfigurationStandaloneSetup
4import org.eclipse.emf.common.util.URI
5import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript 6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript
7import org.eclipse.core.runtime.NullProgressMonitor 7import org.eclipse.core.runtime.NullProgressMonitor
8import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup 8import org.eclipse.emf.common.util.URI
9import org.eclipse.emf.ecore.util.EcoreUtil
10import java.io.FileNotFoundException
11import org.eclipse.emf.ecore.resource.Resource 9import org.eclipse.emf.ecore.resource.Resource
12import java.io.IOException 10import org.eclipse.emf.ecore.util.EcoreUtil
13import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl 11import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
14import org.eclipse.viatra.query.runtime.matchers.backend.IQueryBackendFactoryProvider 12import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup
15import org.eclipse.viatra.query.runtime.rete.matcher.ReteBackendFactoryProvider
16import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions
17import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint
18import org.eclipse.viatra.query.runtime.rete.util.ReteHintOptions
19import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine 13import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine
20import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneCompilerSetup
21import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetupGenerated
22import org.eclipse.xtext.resource.XtextResourceSet 14import org.eclipse.xtext.resource.XtextResourceSet
23import com.google.inject.Injector
24import com.google.inject.Guice
25 15
26class StandaloneScriptExecutor { 16class 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
3import com.google.inject.Inject 3import com.google.inject.Inject
4import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage 4import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage
5import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript
6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport 5import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport
7import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternEntry
8import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport 6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport
9import java.util.Collections 7import java.util.Collections
10import java.util.List
11import java.util.Optional 8import java.util.Optional
12import org.eclipse.emf.common.util.URI 9import org.eclipse.emf.common.util.URI
13import org.eclipse.emf.ecore.EObject 10import org.eclipse.emf.ecore.EObject
11import org.eclipse.emf.ecore.EPackage
14import org.eclipse.emf.ecore.EReference 12import org.eclipse.emf.ecore.EReference
15import org.eclipse.emf.ecore.resource.Resource 13import org.eclipse.emf.ecore.resource.Resource
14import org.eclipse.emf.ecore.resource.ResourceSet
16import org.eclipse.viatra.query.patternlanguage.emf.scoping.IMetamodelProvider 15import org.eclipse.viatra.query.patternlanguage.emf.scoping.IMetamodelProvider
17import org.eclipse.xtext.EcoreUtil2
18import org.eclipse.xtext.conversion.IValueConverterService 16import org.eclipse.xtext.conversion.IValueConverterService
19import org.eclipse.xtext.conversion.ValueConverterException 17import org.eclipse.xtext.conversion.ValueConverterException
20import org.eclipse.xtext.linking.impl.DefaultLinkingService 18import org.eclipse.xtext.linking.impl.DefaultLinkingService
21import org.eclipse.xtext.nodemodel.ILeafNode 19import org.eclipse.xtext.nodemodel.ILeafNode
22import org.eclipse.xtext.nodemodel.INode 20import org.eclipse.xtext.nodemodel.INode
23import org.eclipse.emf.ecore.resource.ResourceSet
24import org.eclipse.emf.ecore.EPackage
25 21
26class ApplicationConfigurationLinkingService extends DefaultLinkingService{ 22class 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 */
4package hu.bme.mit.inf.dslreasoner.application.scoping 4package hu.bme.mit.inf.dslreasoner.application.scoping
5 5
6import com.google.common.base.Function 6import com.google.inject.Inject
7import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.AllPackageEntry
8import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.AllPatternEntry
9import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ApplicationConfigurationPackage
10import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ClassReference
11import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript 7import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript
12import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport 8import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport
13import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelElement 9import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelElement
14import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelSpecification 10import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelEntry
15import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternElement 11import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternEntry
16import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternSpecification
17import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport 12import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport
18import org.eclipse.emf.ecore.EClass 13import org.eclipse.emf.ecore.EClass
19import org.eclipse.emf.ecore.EEnum 14import org.eclipse.emf.ecore.EEnum
@@ -21,10 +16,11 @@ import org.eclipse.emf.ecore.EObject
21import org.eclipse.emf.ecore.EReference 16import org.eclipse.emf.ecore.EReference
22import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternModel 17import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternModel
23import org.eclipse.xtext.EcoreUtil2 18import org.eclipse.xtext.EcoreUtil2
24import org.eclipse.xtext.naming.QualifiedName 19import org.eclipse.xtext.naming.IQualifiedNameConverter
25import org.eclipse.xtext.scoping.IScope
26import org.eclipse.xtext.scoping.Scopes 20import org.eclipse.xtext.scoping.Scopes
27 21
22import 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 */
34class ApplicationConfigurationScopeProvider extends AbstractApplicationConfigurationScopeProvider { 30class 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..b378ec0c 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
@@ -10,7 +10,7 @@ import org.eclipse.viatra.query.patternlanguage.emf.vql.Pattern
10 10
11class QueryAndMetamodelValidator { 11class QueryAndMetamodelValidator {
12 12
13 def public validateQueryAndMetamodel( 13 def validateQueryAndMetamodel(
14 EcoreMetamodelDescriptor metamodel, 14 EcoreMetamodelDescriptor metamodel,
15 Pair<ViatraQuerySetDescriptor, Set<Pattern>> viatra) 15 Pair<ViatraQuerySetDescriptor, Set<Pattern>> viatra)
16 { 16 {
@@ -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}