From cb77845089f6c8171fc3c39a92690dee3671886a Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Sun, 17 Feb 2019 19:34:52 +0100 Subject: Created new module to load referred patterns. hacked metamodel linking. --- .../execution/PatternLanguageWithRSModule.xtend | 46 ++++++++++ .../execution/PatternLanguageWithRSSetup.xtend | 15 ++++ .../application/execution/QueryLoader.xtend | 17 +++- .../execution/StandaloneScriptExecutor.xtend | 21 ++++- .../application/execution/util/VQLParser.xtend | 100 --------------------- .../ApplicationConfigurationLinkingService.xtend | 33 +++++-- 6 files changed, 124 insertions(+), 108 deletions(-) create mode 100644 Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend create mode 100644 Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend delete mode 100644 Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/VQLParser.xtend 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 new file mode 100644 index 00000000..1269ec1f --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSModule.xtend @@ -0,0 +1,46 @@ +package hu.bme.mit.inf.dslreasoner.application.execution + +import com.google.inject.Binder +import com.google.inject.multibindings.Multibinder +import com.google.inject.name.Names +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup.StandaloneParserWithSeparateModules +import org.eclipse.viatra.query.patternlanguage.emf.scoping.EMFPatternLanguageImportNamespaceProvider +import org.eclipse.viatra.query.patternlanguage.emf.scoping.IMetamodelProvider +import org.eclipse.viatra.query.patternlanguage.emf.scoping.IMetamodelProviderInstance +import org.eclipse.xtext.scoping.IScopeProvider +import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider +import org.eclipse.viatra.query.patternlanguage.emf.scoping.CompoundMetamodelProviderService +import org.eclipse.viatra.query.patternlanguage.emf.scoping.MetamodelProviderService +import org.eclipse.viatra.query.patternlanguage.emf.scoping.ResourceSetMetamodelProviderService +import org.eclipse.viatra.query.patternlanguage.emf.types.EMFTypeInferrer +import org.eclipse.viatra.query.patternlanguage.emf.types.EMFTypeSystem +import org.eclipse.viatra.query.patternlanguage.emf.types.ITypeInferrer +import org.eclipse.viatra.query.patternlanguage.emf.types.ITypeSystem +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageRuntimeModule + +class PatternLanguageWithRSModule extends EMFPatternLanguageRuntimeModule{ + + override configureIScopeProviderDelegate(Binder binder) { + binder.bind(IScopeProvider).annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)) + .to(EMFPatternLanguageImportNamespaceProvider); + Multibinder::newSetBinder(binder, IMetamodelProviderInstance); + } + + override Class bindIMetamodelProvider() { + CompoundMetamodelProviderService + } + + def configureMetamodelProviderInstance(Binder binder) { + val metamodelProviderBinder = Multibinder.newSetBinder(binder, IMetamodelProviderInstance) + metamodelProviderBinder.addBinding.to(MetamodelProviderService) + metamodelProviderBinder.addBinding.to(ResourceSetMetamodelProviderService) + } + + override Class bindITypeSystem() { + return EMFTypeSystem; + } + + override Class bindITypeInferrer() { + return EMFTypeInferrer; + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..dd5af673 --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/PatternLanguageWithRSSetup.xtend @@ -0,0 +1,15 @@ +package hu.bme.mit.inf.dslreasoner.application.execution + +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetupGenerated +import com.google.inject.Injector +import com.google.inject.Guice +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageRuntimeModule +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup + +class PatternLanguageWithRSSetup extends EMFPatternLanguageStandaloneSetup{ + override Injector createInjector() { + return Guice::createInjector(new PatternLanguageWithRSModule()); + } +} \ No newline at end of file diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/QueryLoader.xtend index 8f8348b1..cfc91143 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 @@ -22,6 +22,10 @@ import org.eclipse.xtext.EcoreUtil2 import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternCall +import org.eclipse.viatra.query.runtime.api.IPatternMatch +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher +import java.util.LinkedHashMap +import java.util.LinkedList class QueryLoader { //val parser = new VQLParser @@ -34,6 +38,9 @@ class QueryLoader { patterns += getPatterns(entry) } + //val errors = patterns.map[eResource].toSet.map[errors] + //errors.forEach[println(it)] + val allConcernedPatterns = patterns.allReferredPatterns val pattern2Specification = allConcernedPatterns.translatePatterns() @@ -108,7 +115,15 @@ class QueryLoader { } def private translatePatterns(Set xtextPattern) { - xtextPattern.toInvertedMap[builder.getOrCreateSpecification(it) as IQuerySpecification] + val res = new LinkedHashMap> + val patterns = new LinkedList> + for(pattern : xtextPattern) { + val querySpecification = builder.getOrCreateSpecification(pattern,patterns,true) + res.put(pattern,querySpecification) + patterns += querySpecification + } + + return res } def private calculateDerivedFeatures(Set packages, Iterable> patterns) { 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 f373d910..c612f0ea 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 @@ -17,6 +17,11 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint import org.eclipse.viatra.query.runtime.rete.util.ReteHintOptions import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneCompilerSetup +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetupGenerated +import org.eclipse.xtext.resource.XtextResourceSet +import com.google.inject.Injector +import com.google.inject.Guice class StandaloneScriptExecutor { def static void main(String[] args) { @@ -32,9 +37,19 @@ class StandaloneScriptExecutor { } } + static def protected Injector internalCreateInjector() { + var newInjector = new EMFPatternLanguageStandaloneSetup().createInjectorAndDoEMFRegistration(); + val PatternLanguageWithRSModule module = new PatternLanguageWithRSModule + newInjector = Guice.createInjector(module) + //val XtextInjectorProvider x = null + return newInjector; + } + + def static loadScript(String path) { //Initialise extensions - EMFPatternLanguageStandaloneSetup.doSetup + val i = (new PatternLanguageWithRSSetup).createInjectorAndDoEMFRegistration + //PatternLanguageWithRSSetup.createInjectorAndDoEMFRegistration ApplicationConfigurationStandaloneSetup.doSetup Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("xmi",new XMIResourceFactoryImpl) Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("logicproblem",new XMIResourceFactoryImpl) @@ -43,7 +58,9 @@ class StandaloneScriptExecutor { val ext = path.split("\\.").last if(ext.equals("vsconfig")) { - val resourceSet = new ResourceSetImpl + + val resourceSet = //new ResourceSetImpl + i.getInstance(XtextResourceSet); var Resource resource try{ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/VQLParser.xtend b/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/VQLParser.xtend deleted file mode 100644 index e458267c..00000000 --- a/Application/hu.bme.mit.inf.dslreasoner.application/src/hu/bme/mit/inf/dslreasoner/application/execution/util/VQLParser.xtend +++ /dev/null @@ -1,100 +0,0 @@ -package hu.bme.mit.inf.dslreasoner.application.execution.util - -import com.google.inject.Guice -import com.google.inject.Injector -import com.google.inject.Module -import hu.bme.mit.inf.dslreasoner.application.execution.ScriptConsole -import java.util.LinkedHashMap -import java.util.List -import org.eclipse.emf.common.util.URI -import org.eclipse.emf.ecore.resource.Resource -import org.eclipse.emf.ecore.resource.ResourceSet -import org.eclipse.emf.ecore.util.EcoreUtil -import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageRuntimeModule -import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup -import org.eclipse.viatra.query.patternlanguage.emf.GenmodelExtensionLoader -import org.eclipse.viatra.query.patternlanguage.emf.IGenmodelMappingLoader -import org.eclipse.viatra.query.patternlanguage.emf.scoping.CompoundMetamodelProviderService -import org.eclipse.viatra.query.patternlanguage.emf.scoping.IMetamodelProvider -import org.eclipse.viatra.query.patternlanguage.emf.specification.SpecificationBuilder -import org.eclipse.viatra.query.patternlanguage.emf.vql.PatternModel -import org.eclipse.viatra.query.runtime.api.IQuerySpecification -import org.eclipse.xtext.resource.XtextResourceSet - -class MyModule extends EMFPatternLanguageRuntimeModule implements Module { -// override public Class bindAnnotationValidatorLoader() { -// return typeof(ExtensionBasedAnnotationValidatorLoader); -// } - def public Class bindGenmodelMappingLoader() { - return typeof(GenmodelExtensionLoader); - } - override Class bindIMetamodelProvider() { - CompoundMetamodelProviderService - // PreloadedMetamodelProvider - } -} - -class VQLParser { - val Injector injector; - val SpecificationBuilder builder = new SpecificationBuilder - - new() { - EMFPatternLanguageStandaloneSetup.doSetup; - - injector = internalCreateInjector - } - - def protected Injector internalCreateInjector() { - new EMFPatternLanguageStandaloneSetup().createInjectorAndDoEMFRegistration(); - val Module module = new MyModule - val newInjector = Guice.createInjector(module) - return newInjector; - } - - public def createResourceSet() { - injector.getInstance(XtextResourceSet); - } - - /** - * Load patterns in two steps: first, the pattern models are are loaded to a resource set, then - * the linked patterns are loaded validated and translated to a {@link IQuerySpecification} object. - * @returns uri -> (name -> pattern) - */ - public def parse(List uris, ResourceSet resourceSet, ScriptConsole context) { - val res = new LinkedHashMap - val uri2resource = new LinkedHashMap - - for(uri : uris) { - var Resource resource - var PatternModel patternModel - try { - resource = resourceSet.getResource(URI.createURI(uri),true); - patternModel = resource.getContents().get(0) as PatternModel; - uri2resource.put(uri,patternModel) - } catch(RuntimeException e) { - context.writeError('''Unable to load patterns from "«uri»"!''') - } - } - - for(entry : uri2resource.entrySet) { - val uri = entry.key - val model = entry.value - EcoreUtil.resolveAll(model.eResource) - model.eResource.validate(uri, context) - - val map = new LinkedHashMap - for(pattern : model.patterns) { - val IQuerySpecification querySpecification = (this.builder as SpecificationBuilder).getOrCreateSpecification(pattern) - map.put(querySpecification.fullyQualifiedName.split('.').last,querySpecification) - } - res.put(uri,map) - } - - return res - } - - def private validate(Resource resource, String URI, ScriptConsole context) { - val errors = resource.errors - errors.forEach[context.writeError('''Error in loading pattern "«URI»": «it»''')] - } -} \ 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 41a89e6f..fc4b721a 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 @@ -20,6 +20,8 @@ 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.ResourceSet +import org.eclipse.emf.ecore.EPackage class ApplicationConfigurationLinkingService extends DefaultLinkingService{ @@ -57,11 +59,32 @@ class ApplicationConfigurationLinkingService extends DefaultLinkingService{ } private def getEPackage(EPackageImport packageImport, ILeafNode node) { - getNSUri(node).flatMap [ uri | - Optional.ofNullable(metamodelProvider.loadEPackage(uri, packageImport.eResource.resourceSet)) - ].map [ ePackage | - Collections.singletonList(ePackage as EObject) - ].orElse(emptyList) + val x = getNSUri(node) + if(x.isPresent) { + val uriString = x.get + val epackageByMetamodelProvider = metamodelProvider.loadEPackage(uriString, packageImport.eResource.resourceSet) + val epackageByMe = ePackageByMe(packageImport.eResource.resourceSet,uriString) + //println(epackageByMetamodelProvider) + //println(epackageByMe) + if(epackageByMetamodelProvider!==null) { + return Collections.singletonList(epackageByMetamodelProvider as EObject) + } else if(epackageByMe !== null) { + return Collections.singletonList(epackageByMe as EObject) + } else { + emptyList + } + } else { + return emptyList + } + } + + private def ePackageByMe(ResourceSet rs, String uri) { + try { + val resource = rs.getResource(URI.createURI(uri), true); + return resource.contents.head as EPackage + } catch (Exception e) { + return null + } } private def getViatra(ViatraImport viatraImport, INode node) { -- cgit v1.2.3-54-g00ecf