aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit
diff options
context:
space:
mode:
Diffstat (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit')
-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.xtend15
-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.xtend294
-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.xtend34
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend185
-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.xtend2
-rw-r--r--Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend2
21 files changed, 714 insertions, 687 deletions
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext
index 6af31723..537989f7 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/ApplicationConfiguration.xtext
@@ -5,177 +5,314 @@ import "http://www.eclipse.org/viatra/query/patternlanguage/emf/PatternLanguage"
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 c9d38c7d..1ee69827 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/GenerationTaskExecutor.xtend
@@ -41,6 +41,7 @@ class GenerationTaskExecutor {
41 def executeGenerationTask( 41 def executeGenerationTask(
42 GenerationTask task, 42 GenerationTask task,
43 ScriptExecutor scriptExecutor, 43 ScriptExecutor scriptExecutor,
44 ScriptConsole.Factory scriptConsoleFactory,
44 IProgressMonitor monitor) 45 IProgressMonitor monitor)
45 { 46 {
46 monitor.subTask('''Collecting all resources''') 47 monitor.subTask('''Collecting all resources''')
@@ -62,7 +63,7 @@ class GenerationTaskExecutor {
62 val memoryLimit = scriptExecutor.getMemoryLimit(configSpecification) 63 val memoryLimit = scriptExecutor.getMemoryLimit(configSpecification)
63 64
64 // 2. create console 65 // 2. create console
65 val console = new ScriptConsole(true,false, 66 val console = scriptConsoleFactory.createScriptConsole(false,
66 if(messageFile!==null) URI.createURI(messageFile.path) else null, 67 if(messageFile!==null) URI.createURI(messageFile.path) else null,
67 if(debugFolder!==null) URI.createURI('''«debugFolder.path»/errors.txt''') else null, 68 if(debugFolder!==null) URI.createURI('''«debugFolder.path»/errors.txt''') else null,
68 if(statisticsFile!==null) URI.createURI(statisticsFile.path) else null 69 if(statisticsFile!==null) URI.createURI(statisticsFile.path) else null
@@ -132,12 +133,14 @@ class GenerationTaskExecutor {
132 // 5. create a solver and a configuration 133 // 5. create a solver and a configuration
133 // 5.1 initialize 134 // 5.1 initialize
134 val solver = solverLoader.loadSolver(task.solver,configurationMap) 135 val solver = solverLoader.loadSolver(task.solver,configurationMap)
135 val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,console) 136 val objectiveSpecification = scriptExecutor.getObjectiveSpecification(task.objectives)
137 val objectiveEntries = objectiveSpecification?.entries ?: emptyList
138 val solverConfig = solverLoader.loadSolverConfig(task.solver,configurationMap,objectiveEntries,console)
136 139
137 140
138 // 5.2 set values that defined directly 141 // 5.2 set values that defined directly
139 solverConfig.solutionScope = new SolutionScope => [ 142 solverConfig.solutionScope = new SolutionScope => [
140 it.numberOfRequiredSolution = if(task.numberSpecified) { 143 it.numberOfRequiredSolutions = if(task.numberSpecified) {
141 task.number 144 task.number
142 } else { 145 } else {
143 1 146 1
@@ -290,7 +293,7 @@ class GenerationTaskExecutor {
290 statistics.put("Domain to logic transformation time",domain2LogicTransformationTime/1000000) 293 statistics.put("Domain to logic transformation time",domain2LogicTransformationTime/1000000)
291 statistics.put("Logic to solver transformation time",solution.statistics.transformationTime) 294 statistics.put("Logic to solver transformation time",solution.statistics.transformationTime)
292 statistics.put("Solver time",solution.statistics.solverTime) 295 statistics.put("Solver time",solution.statistics.solverTime)
293 statistics.put("Postprocessing time",solutionVisualisationTime) 296 statistics.put("Postprocessing time",solutionVisualisationTime/1000000)
294 for(entry: solution.statistics.entries) { 297 for(entry: solution.statistics.entries) {
295 statistics.put(entry.name,statisticsUtil.readValue(entry)) 298 statistics.put(entry.name,statisticsUtil.readValue(entry))
296 } 299 }
@@ -301,7 +304,7 @@ class GenerationTaskExecutor {
301 console.flushStatistics 304 console.flushStatistics
302 console.writeMessage("Model generation finished") 305 console.writeMessage("Model generation finished")
303 } catch(Exception e) { 306 } catch(Exception e) {
304 console.writeError(''' 307 console.writeError('''
305 Error occured («e.class.simpleName»): «e.message» 308 Error occured («e.class.simpleName»): «e.message»
306 «FOR s : e.stackTrace SEPARATOR "\n"» «s»«ENDFOR»''') 309 «FOR s : e.stackTrace SEPARATOR "\n"» «s»«ENDFOR»''')
307 } 310 }
@@ -347,4 +350,4 @@ class GenerationTaskExecutor {
347 return false 350 return false
348 } 351 }
349 } 352 }
350} \ No newline at end of file 353}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/MetamodelLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/MetamodelLoader.xtend
index 5e7f84f0..626329dc 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/MetamodelLoader.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/MetamodelLoader.xtend
@@ -120,4 +120,4 @@ class MetamodelLoader {
120// } 120// }
121// return res 121// return res
122// } 122// }
123} \ No newline at end of file 123}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend
index 05081581..5e656e8f 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/NullWorkspace.xtend
@@ -59,4 +59,4 @@ class NullWorkspace extends ReasonerWorkspace{
59 throw new UnsupportedOperationException(message) 59 throw new UnsupportedOperationException(message)
60 } 60 }
61 override refreshFile(String name) { } 61 override refreshFile(String name) { }
62} \ No newline at end of file 62}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend
index 1269ec1f..3e598dd6 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend
@@ -43,4 +43,4 @@ class PatternLanguageWithRSModule extends EMFPatternLanguageRuntimeModule{
43 override Class<? extends ITypeInferrer> bindITypeInferrer() { 43 override Class<? extends ITypeInferrer> bindITypeInferrer() {
44 return EMFTypeInferrer; 44 return EMFTypeInferrer;
45 } 45 }
46} \ No newline at end of file 46}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend
index dd5af673..c209cde5 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend
@@ -12,4 +12,4 @@ class PatternLanguageWithRSSetup extends EMFPatternLanguageStandaloneSetup{
12 override Injector createInjector() { 12 override Injector createInjector() {
13 return Guice::createInjector(new PatternLanguageWithRSModule()); 13 return Guice::createInjector(new PatternLanguageWithRSModule());
14 } 14 }
15} \ No newline at end of file 15}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend
index cfc91143..5a73845d 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend
@@ -144,4 +144,4 @@ class QueryLoader {
144 } 144 }
145 return res 145 return res
146 } 146 }
147} \ No newline at end of file 147}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend
index dcaf74cd..6d6ad85e 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScopeLoader.xtend
@@ -220,4 +220,4 @@ class ScopeLoader {
220 else return specification.exactNumber 220 else return specification.exactNumber
221 } 221 }
222 222
223} \ No newline at end of file 223}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend
index 91d3d286..2ce86a78 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptConsole.xtend
@@ -9,128 +9,108 @@ import java.util.LinkedHashSet
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 c9ec68bb..3941179a 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/ScriptExecutor.xtend
@@ -4,6 +4,7 @@ import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigRef
4import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigSpecification 4import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigSpecification
5import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript 5import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript
6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.CustomEntry 6import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.CustomEntry
7import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.DocumentLevelSpecification
7import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.DocumentationEntry 8import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.DocumentationEntry
8import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport 9import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageImport
9import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.FileReference 10import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.FileReference
@@ -24,19 +25,24 @@ import hu.bme.mit.inf.dslreasoner.application.execution.util.ApplicationConfigur
24import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel 25import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel
25import java.util.LinkedHashMap 26import java.util.LinkedHashMap
26import java.util.Optional 27import java.util.Optional
27import org.eclipse.emf.common.util.URI
28import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.DocumentLevelSpecification
29import org.eclipse.core.runtime.jobs.Job
30import org.eclipse.core.runtime.IProgressMonitor 28import org.eclipse.core.runtime.IProgressMonitor
31import org.eclipse.core.runtime.Status 29import org.eclipse.core.runtime.Status
30import org.eclipse.core.runtime.jobs.Job
31import org.eclipse.emf.common.util.URI
32import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
33import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveSpecification
34import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ObjectiveReference
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,7 +59,7 @@ class ScriptExecutor {
53 job.schedule(); 59 job.schedule();
54 } 60 }
55 61
56 public def executeScript(ConfigurationScript script, IProgressMonitor monitor) { 62 def executeScript(ConfigurationScript script, IProgressMonitor monitor) {
57 script.activateAllEPackageReferences 63 script.activateAllEPackageReferences
58 val tasks = script.commands.filter(Task) 64 val tasks = script.commands.filter(Task)
59 65
@@ -90,12 +96,12 @@ class ScriptExecutor {
90// } 96// }
91 } 97 }
92 98
93 def public dispatch execute(GenerationTask task, IProgressMonitor monitor) { 99 def dispatch void execute(GenerationTask task, IProgressMonitor monitor) {
94 val generationTaskExecutor = new GenerationTaskExecutor 100 val generationTaskExecutor = new GenerationTaskExecutor
95 generationTaskExecutor.executeGenerationTask(task,this,monitor) 101 generationTaskExecutor.executeGenerationTask(task,this,scriptConsoleFactory,monitor)
96 } 102 }
97 103
98 def public dispatch execute(Task task, IProgressMonitor monitor) { 104 def dispatch void execute(Task task, IProgressMonitor monitor) {
99 throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''') 105 throw new IllegalArgumentException('''Unsupported task type: «task.class.simpleName»!''')
100 } 106 }
101 107
@@ -170,6 +176,16 @@ class ScriptExecutor {
170 null 176 null
171 } 177 }
172 178
179 def dispatch getObjectiveSpecification(ObjectiveSpecification config) {
180 config
181 }
182 def dispatch getObjectiveSpecification(ObjectiveReference config) {
183 config.referred.specification
184 }
185 def dispatch getObjectiveSpecification(Void config) {
186 null
187 }
188
173 def dispatch getConfiguration(ConfigSpecification config) { 189 def dispatch getConfiguration(ConfigSpecification config) {
174 config 190 config
175 } 191 }
@@ -234,4 +250,4 @@ class ScriptExecutor {
234 } 250 }
235 } 251 }
236 } 252 }
237} \ No newline at end of file 253}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend
index a9573fbf..1139080b 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/SolverLoader.xtend
@@ -1,44 +1,47 @@
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
17 27
18class SolverLoader { 28class SolverLoader {
19 def loadSolver(Solver solver, Map<String, String> config) { 29 def loadSolver(Solver solver, Map<String, String> config) {
20 switch(solver) { 30 switch (solver) {
21 case ALLOY_SOLVER: return new AlloySolver 31 case ALLOY_SOLVER: return new AlloySolver
22 case SMT_SOLVER: return new SMTSolver 32 case SMT_SOLVER: return new SMTSolver
23 case VIATRA_SOLVER: return new ViatraReasoner 33 case VIATRA_SOLVER: return new ViatraReasoner
24 } 34 }
25 } 35 }
26 36
27 37 private def <Type> Optional<Type> getAsType(Map<String, String> config, String key, ScriptConsole console,
28 38 Function1<String, Type> parser, Class<Type> requestedType) {
29 private def <Type> Optional<Type> getAsType( 39 if (config.containsKey(key)) {
30 Map<String, String> config,
31 String key,
32 ScriptConsole console,
33 Function1<String,Type> parser,
34 Class<Type> requestedType)
35 {
36 if(config.containsKey(key)) {
37 val stringValue = config.get(key) 40 val stringValue = config.get(key)
38 try{ 41 try {
39 val parsedValue = parser.apply(stringValue) 42 val parsedValue = parser.apply(stringValue)
40 return Optional.of(parsedValue) 43 return Optional.of(parsedValue)
41 } catch(Exception e) { 44 } catch (Exception e) {
42 console.writeError('''Unable to parse configuration value for "«key»" to «requestedType.simpleName»!''') 45 console.writeError('''Unable to parse configuration value for "«key»" to «requestedType.simpleName»!''')
43 return Optional::empty 46 return Optional::empty
44 } 47 }
@@ -46,60 +49,132 @@ class SolverLoader {
46 return Optional::empty 49 return Optional::empty
47 } 50 }
48 } 51 }
52
49 private def getAsInteger(Map<String, String> config, String key, ScriptConsole console) { 53 private def getAsInteger(Map<String, String> config, String key, ScriptConsole console) {
50 return getAsType(config,key,console,[x|Integer.parseInt(x)],Integer) 54 return getAsType(config, key, console, [x|Integer.parseInt(x)], Integer)
51 } 55 }
56
52 private def getAsBoolean(Map<String, String> config, String key, ScriptConsole console) { 57 private def getAsBoolean(Map<String, String> config, String key, ScriptConsole console) {
53 return getAsType(config,key,console,[x|Boolean.parseBoolean(x)],Boolean) 58 return getAsType(config, key, console, [x|Boolean.parseBoolean(x)], Boolean)
54 } 59 }
60
55 private def getAsDouble(Map<String, String> config, String key, ScriptConsole console) { 61 private def getAsDouble(Map<String, String> config, String key, ScriptConsole console) {
56 return getAsType(config,key,console,[x|Double.parseDouble(x)],Double) 62 return getAsType(config, key, console, [x|Double.parseDouble(x)], Double)
57 } 63 }
58 64
59 def loadSolverConfig( 65 def loadSolverConfig(Solver solver, Map<String, String> config, List<ObjectiveEntry> objectiveEntries,
60 Solver solver, 66 ScriptConsole console) {
61 Map<String, String> config, 67 switch (solver) {
62 ScriptConsole console) 68 case ALLOY_SOLVER: {
63 { 69 if (!objectiveEntries.empty) {
64 if(solver === Solver::ALLOY_SOLVER) { 70 throw new IllegalArgumentException("Objectives are not supported by Alloy.")
65 return new AlloySolverConfiguration => [c| 71 }
66 config.getAsInteger("symmetry",console) 72 val c = new SmtSolverConfiguration
67 .ifPresent[c.symmetry = it] 73 config.getAsBoolean("fixRandomSeed", console).ifPresent[c.fixRandomSeed = it]
68 config.getAsType("solver",console,[x|AlloyBackendSolver::valueOf(x)],AlloyBackendSolver) 74 config.getAsType("path", console, [it], String).ifPresent[c.solverPath = it]
69 .ifPresent[c.solver = it] 75 c
70 ] 76 }
71 } else if(solver === Solver::SMT_SOLVER) { 77 case SMT_SOLVER: {
72 return new SmtSolverConfiguration => [c| 78 if (!objectiveEntries.empty) {
73 config.getAsBoolean("fixRandomSeed",console).ifPresent[c.fixRandomSeed = it] 79 throw new IllegalArgumentException("Objectives are not supported by Z3.")
74 config.getAsType("path",console,[it],String).ifPresent[c.solverPath = it] 80 }
75 ] 81 val c = new SmtSolverConfiguration
76 } else if(solver === Solver::VIATRA_SOLVER) { 82 config.getAsBoolean("fixRandomSeed", console).ifPresent[c.fixRandomSeed = it]
77 return new ViatraReasonerConfiguration => [c| 83 config.getAsType("path", console, [it], String).ifPresent[c.solverPath = it]
78 c.debugCongiguration.partialInterpretatioVisualiser = new GraphvizVisualiser 84 c
79 if(config.containsKey("diversity-range")) { 85 }
86 case VIATRA_SOLVER: {
87 val c = new ViatraReasonerConfiguration
88 c.debugConfiguration.partialInterpretatioVisualiser = new GraphvizVisualiser
89 if (config.containsKey("diversity-range")) {
80 val stringValue = config.get("diversity-range") 90 val stringValue = config.get("diversity-range")
81 try{ 91 try {
82 val range = Integer.parseInt(stringValue) 92 val range = Integer.parseInt(stringValue)
83 c.diversityRequirement = new DiversityDescriptor => [ 93 c.diversityRequirement = new DiversityDescriptor => [
84 it.ensureDiversity = true 94 it.ensureDiversity = true
85 it.range = range 95 it.range = range
86 ] 96 ]
87 } catch (NumberFormatException e) {console.writeError('''Malformed number format: «e.message»''')} 97 } catch (NumberFormatException e) {
98 console.writeError('''Malformed number format: «e.message»''')
99 }
88 } 100 }
89 ] 101 for (objectiveEntry : objectiveEntries) {
90 } else { 102 val costObjectiveConfig = new CostObjectiveConfiguration
91 throw new UnsupportedOperationException('''Unknown solver: «solver»''') 103 switch (objectiveEntry) {
104 OptimizationEntry: {
105 costObjectiveConfig.findExtremum = true
106 costObjectiveConfig.kind = switch (direction : objectiveEntry.direction) {
107 case MAXIMIZE:
108 ObjectiveKind.HIGHER_IS_BETTER
109 case MINIMIZE:
110 ObjectiveKind.LOWER_IS_BETTER
111 default:
112 throw new IllegalArgumentException("Unknown direction: " + direction)
113 }
114 costObjectiveConfig.threshold = ObjectiveThreshold.NO_THRESHOLD
115 }
116 ThresholdEntry: {
117 costObjectiveConfig.findExtremum = false
118 val threshold = objectiveEntry.threshold.doubleValue
119 switch (operator : objectiveEntry.operator) {
120 case LESS: {
121 costObjectiveConfig.kind = ObjectiveKind.LOWER_IS_BETTER
122 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
123 }
124 case GREATER: {
125 costObjectiveConfig.kind = ObjectiveKind.HIGHER_IS_BETTER
126 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
127 }
128 case LESS_EQUALS: {
129 costObjectiveConfig.kind = ObjectiveKind.LOWER_IS_BETTER
130 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
131 }
132 case GREATER_EQUALS: {
133 costObjectiveConfig.kind = ObjectiveKind.HIGHER_IS_BETTER
134 costObjectiveConfig.threshold = new ObjectiveThreshold.Exclusive(threshold)
135 }
136 default:
137 throw new IllegalArgumentException("Unknown operator: " + operator)
138 }
139 }
140 }
141 val function = objectiveEntry.function
142 if (function instanceof CostObjectiveFunction) {
143 for (costEntry : function.entries) {
144 val element = new CostObjectiveElementConfiguration
145 val pattern = costEntry.patternElement.pattern
146 val packageName = costEntry.patternElement.package?.packageName ?:
147 EcoreUtil2.getContainerOfType(pattern, PatternModel)?.packageName
148 element.patternQualifiedName = if (packageName.nullOrEmpty) {
149 pattern.name
150 } else {
151 packageName + "." + pattern.name
152 }
153 element.weight = costEntry.weight
154 costObjectiveConfig.elements += element
155 }
156 } else {
157 throw new IllegalArgumentException("Only cost objectives are supported by VIATRA.")
158 }
159 c.costObjectives += costObjectiveConfig
160 }
161 c
162 }
163 default:
164 throw new UnsupportedOperationException('''Unknown solver: «solver»''')
92 } 165 }
93 } 166 }
94 167
95 def dispatch void setRunIndex(AlloySolverConfiguration config, Map<String, String> parameters, int runIndex, ScriptConsole console) { 168 def dispatch void setRunIndex(AlloySolverConfiguration config, Map<String, String> parameters, int runIndex,
96 parameters.getAsBoolean("randomize",console).ifPresent[ 169 ScriptConsole console) {
97 if(it) { 170 parameters.getAsBoolean("randomize", console).ifPresent [
98 config.randomise = runIndex-1 171 if (it) {
172 config.randomise = runIndex - 1
99 } 173 }
100 ] 174 ]
101 } 175 }
102 def dispatch void setRunIndex(LogicSolverConfiguration config, Map<String, String> parameters, int runIndex, ScriptConsole console) { 176
103 177 def dispatch void setRunIndex(LogicSolverConfiguration config, Map<String, String> parameters, int runIndex,
178 ScriptConsole console) {
104 } 179 }
105} \ No newline at end of file 180}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/StandaloneScriptExecutor.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/StandaloneScriptExecutor.xtend
index c612f0ea..42be3ed7 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/StandaloneScriptExecutor.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/StandaloneScriptExecutor.xtend
@@ -1,27 +1,17 @@
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..7d79bbbb 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/validation/QueryAndMetamodelValidator.xtend
@@ -49,4 +49,4 @@ class QueryAndMetamodelValidator {
49 ].flatten.filter(ENamedElement) 49 ].flatten.filter(ENamedElement)
50 ].flatten 50 ].flatten
51 } 51 }
52} \ No newline at end of file 52}
diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend
index 433f7148..840ffb09 100644
--- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend
+++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/valueconverter/ApplicationConfigurationValueConverterService.xtend
@@ -11,4 +11,4 @@ class ApplicationConfigurationValueConverterService extends DefaultTerminalConve
11 def IValueConverter<String> QualifiedName() { 11 def IValueConverter<String> QualifiedName() {
12 converter2 12 converter2
13 } 13 }
14} \ No newline at end of file 14}