From 0a31d5448e92d915c7163c3985fa0807f67d3f06 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Wed, 17 Jan 2018 00:54:44 +0100 Subject: Scoping and linking of Viatra Packages and Patterns is completed --- .../application/ApplicationConfiguration.xtext | 140 +++++++++++---------- .../ApplicationConfigurationLinkingService.xtend | 54 +++++++- .../ApplicationConfigurationScopeProvider.xtend | 63 +++++++++- 3 files changed, 187 insertions(+), 70 deletions(-) (limited to 'Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme') 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 ed83419f..1e8fd485 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 @@ -4,23 +4,19 @@ import "http://www.eclipse.org/emf/2002/Ecore" as ecore import "http://www.eclipse.org/viatra/query/patternlanguage/PatternLanguage" as viatra generate applicationConfiguration "http://www.bme.hu/mit/inf/dslreasoner/application/ApplicationConfiguration" + ConfigurationScript: (imports += Import)* (commands += Command)* -; +; Command : - Declaration - //| Task -; -Declaration : -// FileDeclaration | - MetamodelDeclaration -// | PartialModelDeclaration -// | GraphPatternDeclaration -// | SolverConfig + Declaration | Task ; +QualifiedName returns ecore::EString: + ID (=>'.' ID)*; + /////////////////////////////////////////////////// // Imports /////////////////////////////////////////////////// @@ -29,25 +25,37 @@ Import: EPackageImport | ViatraImport; EPackageImport: "import" "epackage" importedPackage=[ecore::EPackage|STRING]; ViatraImport: "import" "viatra" importedViatra=[viatra::PatternModel|STRING]; + +/////////////////////////////////////////////////// +// Declaration +/////////////////////////////////////////////////// + +Declaration : + FileDeclaration + | MetamodelDeclaration + | PartialModelDeclaration + | GraphPatternDeclaration + | ConfigDeclaration + | ScopeDeclaration +; /////////////////////////////////////////////////// // Files and Folders /////////////////////////////////////////////////// -/* + FileSpecification: path = STRING; FileDeclaration: 'file' name = ID '=' specification = FileSpecification; - FileReference: referred = [FileDeclaration]; File: FileSpecification | FileReference; -*/ + /////////////////////////////////////////////////// // Metamodel /////////////////////////////////////////////////// MetamodelSpecification: '{' (entries += MetamodelEntry) (',' entries += MetamodelEntry)* '}'; MetamodelEntry: MetamodelElement | AllPackageEntry; -AllPackageEntry: "package" package=[ecore::EPackage] ("excluding" '{'exclusion +=MetamodelElement (',' exclusion +=MetamodelElement)*'}')?; -MetamodelElement: (package=[ecore::EPackage] '::')? classifier = [ecore::EClassifier] ('.' feature= [ecore::ENamedElement])?; +AllPackageEntry: "package" package=[ecore::EPackage|QualifiedName] ("excluding" '{'exclusion +=MetamodelElement (',' exclusion +=MetamodelElement)*'}')?; +MetamodelElement: (package=[ecore::EPackage|QualifiedName] '::')? classifier = [ecore::EClassifier] ('.' feature= [ecore::ENamedElement])?; MetamodelDeclaration: 'metamodel' name = ID specification = MetamodelSpecification; MetamodelReference: referred = [MetamodelDeclaration]; @@ -56,72 +64,74 @@ Metamodel: MetamodelReference | MetamodelSpecification; /////////////////////////////////////////////////// // Partial Model /////////////////////////////////////////////////// -/* -PartialModelEntry: path = File; -PartialModelSpecification: entry += PartialModelEntry ('+' entry += PartialModelEntry)*; -PartialModelDeclaration: 'partial-model' name = ID '=' specification = PartialModelSpecification; + +PartialModelSpecification: '{' entry += PartialModelEntry (',' entry += PartialModelEntry)? '}'; +PartialModelEntry: ModelEntry | FolderEntry; +ModelEntry: path = File; +FolderEntry: "folder" path = File ("excluding" "{" exclusion += ModelEntry ("," exclusion += ModelEntry)* "}")?; + +PartialModelDeclaration: 'models' name = ID specification = PartialModelSpecification; PartialModelReference : referred = [PartialModelDeclaration]; PartialModel: PartialModelSpecification | PartialModelReference; -*/ + /////////////////////////////////////////////////// // Patterns /////////////////////////////////////////////////// -/* + PatternSpecification: '{' entries += PatternEntry (',' entries += PatternEntry)* '}'; PatternEntry: PatternElement | AllPatternEntry; -AllPatternEntry: package = [viatra::PatternModel] ('excluding' '{' exclusuion += PatternElement (',' exclusuion += PatternElement)* '}')?; -PatternElement: pattern = [viatra::Pattern]; +AllPatternEntry: 'package' package = [viatra::PatternModel|QualifiedName] ('excluding' '{' exclusuion += PatternElement (',' exclusuion += PatternElement)* '}')?; +PatternElement: (package =[viatra::PatternModel|QualifiedName] '::')? pattern = [viatra::Pattern]; GraphPatternDeclaration: 'patterns' name = ID specification = PatternSpecification; GraphPatternReference: referred = [GraphPatternDeclaration]; GraphPattern: GraphPatternReference|PatternSpecification; -*/ + /////////////////////////////////////////////////// // SolverConfig /////////////////////////////////////////////////// -/* -SolverConfig : SMTSolverConfig | AlloySolverConfig | ViatraSolverConfig; - -SMTSolverConfig: - 'smt-solver-config' name = ID '{' - 'solver-path' '=' solverPath = File - '}' -; - -AlloySolverConfig: - 'alloy-solver-config' name = ID '{' - ('symmetry' '=' symmetry=INT)? - '}' -; - -ViatraSolverConfig: - 'viatra-solver-config' name = ID '{' - ('statecoding' '=' statecoding = ViatraStatecoder)? & - ('type-inferencing' '=' typeinferencing = ViatraTypeInferencing)? & - ('backtrack-chance' '=' backtrackChance = INT)? - '}' -; -enum ViatraStatecoder: neighbourhood | identifier; -enum ViatraTypeInferencing: preliminary | online; - -Solver: SMTSolver | AlloySolver | ViatraSolver; -SMTSolver: 'smt-solver' '(' (config = [SMTSolverConfig]) ')'; -AlloySolver: 'alloy-solver' {AlloySolver} '(' (config = [AlloySolverConfig]|'default') ')'; -ViatraSolver: 'viatra-solver' {ViatraSolver} '(' (config= [ViatraSolverConfig]|'default')')'; - -Task: GenerationTask; - -GenerationTask: 'generate' '{' - ('metamodel' '=' metamodel = Metamodel) & +ConfigSpecification: {ConfigSpecification}'{' + (entries += ConfigEntry ("," entries += ConfigEntry)*)? + '}'; +ConfigDeclaration : + 'config' name = ID specification = ConfigSpecification +; +ConfigEntry: key = STRING "=" value = STRING; +ConfigReference: config = [ConfigDeclaration]; +Config: ConfigSpecification | ConfigReference; + +enum Solver: SMTSolver | AlloySolver | ViatraSolver; + +ScopeSpecification: {ScopeSpecification} '{' + (scopes += TypeScope (',' scopes += TypeScope)*)? +'}'; +TypeScope: ( min = INT ( greather?='<' | greaterOrEqual?= '<='))? '#' type = TypeReference (( less?='<' | lessOrEqual?= '<=') max = INT)?; +TypeReference: ClassReference | ObjectReference | IntegerReference | RealReference | StringReference; +ClassReference: '[' element = MetamodelElement ']'; +ObjectReference: {ObjectReference} 'Object'; +IntegerReference: {IntegerScope} 'int'; +RealReference: {RealScope} 'real'; +StringReference: {StringScope} 'string'; + +ScopeDeclaration: 'scope' name = ID specification = ScopeSpecification; +ScopeReference: referred = [ScopeDeclaration]; +Scope: ScopeSpecification | ScopeReference; + +Task: GenerationTask /*| MeasurementTask | ValidationTask*/; + +GenerationTask: 'generate' {GenerationTask} '{' + (('metamodel' '=' metamodel = Metamodel)? & ('partial-model' '=' partialModel = PartialModel)? & ('patterns' '=' patterns = GraphPattern)? & - ('new-objects' '=' size = INT) & + ('scope' '=' scope = Scope)? & ('number' '=' number= INT)? & - ('runs' '=' runs = INT)? - 'target-folder' '=' tagetFolder = File - 'debug-folder' '=' debugFolder = File - ('log' '=' targetLogFile = File)? - ('statistics' '=' targetStatisticsFile = File)? + ('runs' '=' runs = INT)? & + ('solver' '=' solver = Solver)? & + ('config' '=' config = Config)? & + ('output' '=' tagetFolder = File)? & + ('debug' '=' debugFolder = File)? & + ('log' '=' targetLogFile = File)? & + ('statistics' '=' targetStatisticsFile = File)?) '}' -;*/ \ No newline at end of file +; \ No newline at end of file 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 15567f88..35d4008b 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 @@ -6,6 +6,7 @@ import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.EPackageI import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport import java.util.Collections import java.util.Optional +import org.eclipse.emf.common.util.URI import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EReference import org.eclipse.viatra.query.patternlanguage.emf.scoping.IMetamodelProvider @@ -14,6 +15,13 @@ import org.eclipse.xtext.conversion.ValueConverterException import org.eclipse.xtext.linking.impl.DefaultLinkingService import org.eclipse.xtext.nodemodel.ILeafNode import org.eclipse.xtext.nodemodel.INode +import org.eclipse.emf.ecore.resource.Resource +import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternEntry +import org.eclipse.emf.ecore.util.EcoreUtil +import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript +import org.eclipse.xtext.EcoreUtil2 +import java.util.List +import org.eclipse.xtext.conversion.impl.QualifiedNameValueConverter class ApplicationConfigurationLinkingService extends DefaultLinkingService{ @@ -31,20 +39,60 @@ class ApplicationConfigurationLinkingService extends DefaultLinkingService{ return getEPackage(context as EPackageImport, node as ILeafNode) } } else if(context instanceof ViatraImport) { - super.getLinkedObjects(context, ref, node) + if(ref == viatraImport_ImportedViatra && node instanceof ILeafNode) { + return getViatra(context as ViatraImport, node as ILeafNode) + } + } else if(context instanceof PatternEntry) { + if(ref === patternEntry_Package) { + return getViatraPackage(context as PatternEntry,node) + } } return super.getLinkedObjects(context, ref, node) } + + def getViatraPackage(PatternEntry entry, INode node) { + val document = EcoreUtil2.getContainerOfType(entry,ConfigurationScript) + val nodeString = valueConverterService.toValue(node.text, + linkingHelper.getRuleNameFrom(node.grammarElement), node).toString.replaceAll("\\s","") + val patternModels = document.imports.filter(ViatraImport).map[it.importedViatra].filterNull + val List patternModelsWithSameNamespace = patternModels.filter[nodeString.equals(it.packageName)].filter(EObject).toList + return patternModelsWithSameNamespace + } private def getEPackage(EPackageImport packageImport, ILeafNode node) { - getMetamodelNsUri(node).flatMap [ uri | + getNSUri(node).flatMap [ uri | Optional.ofNullable(metamodelProvider.loadEPackage(uri, packageImport.eResource.resourceSet)) ].map [ ePackage | Collections.singletonList(ePackage as EObject) ].orElse(emptyList) } + + private def getViatra(ViatraImport viatraImport, ILeafNode node) { + val uri = getNSUri(node) + if(uri.present) { + var URI createdURI + try{ + createdURI = URI.createURI(uri.get) + }catch(IllegalArgumentException e) { + return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node) + } + var Resource res + try{ + res = viatraImport.eResource.resourceSet.getResource(createdURI,true); + } catch(RuntimeException e){ + return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node) + } + if(res!==null && !res.contents.empty) { + return #[res.contents.head] + } else { + return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node) + } + } else { + return super.getLinkedObjects(viatraImport, viatraImport_ImportedViatra, node) + } + } - private def getMetamodelNsUri(ILeafNode node) { + private def getNSUri(ILeafNode node) { try { val convertedValue = valueConverterService.toValue(node.text, linkingHelper.getRuleNameFrom(node.grammarElement), node) 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 3aa349f3..97cda4a4 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 @@ -15,6 +15,10 @@ import org.eclipse.emf.ecore.EClass import org.eclipse.emf.ecore.EEnum import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelSpecification import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.AllPackageEntry +import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternElement +import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.AllPatternEntry +import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.PatternSpecification +import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ViatraImport /** * This class contains custom scoping description. @@ -34,6 +38,12 @@ class ApplicationConfigurationScopeProvider extends AbstractApplicationConfigura context.scopeForMetamodelSpecification(reference,document) } else if(context instanceof AllPackageEntry){ context.scopeForAllPackageEntry(reference,document) + } else if(context instanceof PatternElement) { + context.scopeForPatternElement(reference,document) + } else if(context instanceof PatternSpecification) { + context.scopeForPatternSpecification(reference,document) + } else if(context instanceof AllPatternEntry) { + context.scopeForAllPatternEntry(reference,document) } else { return super.getScope(context,reference) } @@ -42,15 +52,24 @@ class ApplicationConfigurationScopeProvider extends AbstractApplicationConfigura private def allEPackages(ConfigurationScript document) { return document.imports.filter(EPackageImport).map[it.importedPackage].filterNull } - + private def allViatraPackages(ConfigurationScript document) { + val res = document.imports.filter(ViatraImport).map[it.importedViatra].filterNull + //println('''All packages: «res.map[packageName].toList»''') + return res + } private def allEClassifiers(ConfigurationScript document) { document.allEPackages.map[EClassifiers].flatten } + private def allPatterns(ConfigurationScript document) { + val res = document.allViatraPackages.map[patterns].flatten + //println('''All patterns: «res.map[name].toList»''') + return res + } protected def scopeForMetamodelElement(MetamodelElement context, EReference reference, ConfigurationScript document) { if(reference === language.metamodelEntry_Package) { return Scopes.scopeFor(document.allEPackages) - } if(reference === language.metamodelElement_Classifier) { + } else if(reference === language.metamodelElement_Classifier) { if(context.package !== null) { return Scopes.scopeFor(context.package.EClassifiers) } else { @@ -91,4 +110,44 @@ class ApplicationConfigurationScopeProvider extends AbstractApplicationConfigura return super.getScope(context,reference) } } + + ////////// + + protected def scopeForPatternElement(PatternElement context, EReference reference, ConfigurationScript document) { + if(reference === language.patternEntry_Package) { + return Scopes.scopeFor(document.allViatraPackages) + } else if(reference === language.patternElement_Pattern) { + if(context.package !== null) { + return Scopes.scopeFor(context.package.patterns) + } else { + return Scopes.scopeFor(document.allPatterns) + } + } else { + super.getScope(context,reference) + } + } + + protected def scopeForPatternSpecification(PatternSpecification context, EReference reference, ConfigurationScript document) { + if(reference === language.patternEntry_Package) { + return Scopes.scopeFor(document.allViatraPackages) + } else if(reference ===language.patternElement_Pattern) { + return Scopes.scopeFor(document.allPatterns) + } else { + return super.getScope(context,reference) + } + } + + protected def scopeForAllPatternEntry(AllPatternEntry context, EReference reference, ConfigurationScript document) { + if(reference === language.patternEntry_Package) { + return Scopes.scopeFor(document.allViatraPackages) + } else if(reference === language.patternElement_Pattern) { + if(context.package === null) { + return Scopes.scopeFor(document.allPatterns) + } else { + return Scopes.scopeFor(context.package.patterns) + } + } else { + return super.getScope(context,reference) + } + } } -- cgit v1.2.3-54-g00ecf