From d0a243527533ab589d4b7e69cc361945af2e8953 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Tue, 19 Mar 2019 20:13:18 +0100 Subject: ParseUtil hijacked original vql parser and caused errors - fix by kris7t https://github.com/kris7t --- .../META-INF/MANIFEST.MF | 3 +- .../META-INF/MANIFEST.MF | 32 ++-- .../viatrasolver/logic2viatra/util/ParseUtil.xtend | 209 ++++++++++++++------- 3 files changed, 158 insertions(+), 86 deletions(-) diff --git a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/META-INF/MANIFEST.MF b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/META-INF/MANIFEST.MF index 1fda4212..8fa4517d 100644 --- a/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/META-INF/MANIFEST.MF +++ b/Framework/hu.bme.mit.inf.dslreasoner.viatra2logic/META-INF/MANIFEST.MF @@ -17,7 +17,8 @@ Require-Bundle: com.google.guava, org.eclipse.emf.ecore;visibility:=reexport, hu.bme.mit.inf.dslreasoner.logic.model;bundle-version="1.0.0";visibility:=reexport, org.eclipse.viatra.query.runtime.base.itc;bundle-version="1.5.0", - org.eclipse.viatra.query.patternlanguage.emf;bundle-version="2.0.0" + org.eclipse.viatra.query.patternlanguage.emf;bundle-version="2.0.0", + org.eclipse.xtext Bundle-ActivationPolicy: lazy Export-Package: hu.bme.mit.inf.dslreasoner.viatra2logic, hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations, diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/META-INF/MANIFEST.MF b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/META-INF/MANIFEST.MF index acaf466f..23e3ad13 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/META-INF/MANIFEST.MF +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/META-INF/MANIFEST.MF @@ -4,23 +4,23 @@ Bundle-Name: Logic2viatra Bundle-SymbolicName: hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatraquery;singleton:=true Bundle-Version: 1.0.0.qualifier Export-Package: hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra, - hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns, - hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries + hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns, + hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries Require-Bundle: hu.bme.mit.inf.dslreasoner.logic.model;bundle-version="1.0.0", - hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage;bundle-version="1.0.0", - hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0", - hu.bme.mit.inf.dslreasoner.viatra2logic;bundle-version="1.0.0", - com.google.guava, - org.eclipse.xtext.xbase.lib, - org.eclipse.xtend.lib, - org.eclipse.xtend.lib.macro, - org.eclipse.viatra.query.runtime;bundle-version="1.5.0", - org.eclipse.viatra.query.runtime.base.itc;bundle-version="1.5.0", - org.eclipse.viatra.query.patternlanguage.emf;bundle-version="1.5.0", - com.google.inject;bundle-version="3.0.0", - org.eclipse.xtext;bundle-version="2.10.0", - org.eclipse.viatra.transformation.runtime.emf;bundle-version="1.5.0", - org.eclipse.xtext.xbase;bundle-version="2.10.0" + hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage;bundle-version="1.0.0", + hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0", + hu.bme.mit.inf.dslreasoner.viatra2logic;bundle-version="1.0.0", + com.google.guava, + org.eclipse.xtext.xbase.lib, + org.eclipse.xtend.lib, + org.eclipse.xtend.lib.macro, + org.eclipse.viatra.query.runtime;bundle-version="1.5.0", + org.eclipse.viatra.query.runtime.base.itc;bundle-version="1.5.0", + org.eclipse.viatra.query.patternlanguage.emf;bundle-version="1.5.0", + com.google.inject;bundle-version="3.0.0", + org.eclipse.xtext;bundle-version="2.10.0", + org.eclipse.viatra.transformation.runtime.emf;bundle-version="1.5.0", + org.eclipse.xtext.xbase;bundle-version="2.10.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.apache.log4j Automatic-Module-Name: hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatraquery diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/util/ParseUtil.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/util/ParseUtil.xtend index b6eddcd2..8e264488 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/util/ParseUtil.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/util/ParseUtil.xtend @@ -2,10 +2,11 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.util import com.google.inject.Binder import com.google.inject.Guice +import com.google.inject.Inject import com.google.inject.Injector -import com.google.inject.Module import com.google.inject.multibindings.Multibinder import com.google.inject.name.Names +import com.google.inject.util.Modules import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage @@ -19,6 +20,9 @@ import org.eclipse.emf.common.util.URI import org.eclipse.emf.ecore.EClassifier import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EPackage +import org.eclipse.emf.ecore.EValidator +import org.eclipse.emf.ecore.impl.EPackageRegistryImpl +import org.eclipse.emf.ecore.impl.EValidatorRegistryImpl import org.eclipse.emf.ecore.resource.Resource import org.eclipse.emf.ecore.resource.ResourceSet import org.eclipse.emf.ecore.util.EcoreUtil @@ -37,123 +41,190 @@ import org.eclipse.xtext.resource.EObjectDescription import org.eclipse.xtext.resource.IResourceFactory import org.eclipse.xtext.resource.IResourceServiceProvider import org.eclipse.xtext.resource.XtextResourceSet +import org.eclipse.xtext.resource.impl.ResourceServiceProviderRegistryImpl import org.eclipse.xtext.scoping.IScope import org.eclipse.xtext.scoping.IScopeProvider import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider import org.eclipse.xtext.scoping.impl.SimpleScope -import org.eclipse.viatra.query.patternlanguage.emf.scoping.MetamodelProviderService -import org.eclipse.viatra.query.patternlanguage.emf.scoping.ResourceSetMetamodelProviderService +import org.eclipse.xtext.service.AbstractGenericModule +import org.eclipse.xtext.service.SingletonBinding +import org.eclipse.xtext.workspace.IProjectConfigProvider -class MyModule extends StandaloneParserWithSeparateModules implements Module{ +package class StandaloneParserWithFixedMetamodelProviderModule extends StandaloneParserWithSeparateModules { /** * Overrided binder * MultibinderIMetamodelProviderInstance.class); - metamodelProviderBinder.addBinding().to(MetamodelProviderService.class); - metamodelProviderBinder.addBinding().to(ResourceSetMetamodelProviderService.class); + * metamodelProviderBinder.addBinding().to(MetamodelProviderService.class); + * metamodelProviderBinder.addBinding().to(ResourceSetMetamodelProviderService.class); * */ - override configureIScopeProviderDelegate(Binder binder) { - binder.bind(IScopeProvider).annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)) - .to(EMFPatternLanguageImportNamespaceProvider); - Multibinder::newSetBinder(binder, IMetamodelProviderInstance); - } - - override Class bindIMetamodelProvider() { - FixedMetamodelProvider - } + override configureIScopeProviderDelegate(Binder binder) { + binder.bind(IScopeProvider).annotatedWith(Names.named(AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to( + EMFPatternLanguageImportNamespaceProvider); + Multibinder::newSetBinder(binder, IMetamodelProviderInstance); + } + +} + +package class StandaloneParserOverridesModule extends AbstractGenericModule { + + def Class bindIMetamodelProvider() { + FixedMetamodelProvider + } + + def Class bindProjectConfigProvider() { + NullProjectConfigProvider + } + + @SingletonBinding + def Class bindIResourceServiceProvider$Registry() { + VqlDeactivatedServiceProviderRegistry + } + + def EValidator.Registry bindEValidator$Registry() { + // org.eclipse.xtext.validation.EValidatorRegistrar modifies EValidators already in the registry, + // so it is not safe to populate the registry from the EValidator.Registry.INSTANCE singleton. + // There is no need to execute any EValiator other than EMFPatternLanguageValidator, + // so we can start with a blank registry instead. + new EValidatorRegistryImpl() + } + + def EPackage.Registry bindEPackage$Registry() { + new EPackageRegistryImpl(EPackage.Registry.INSTANCE) + } + +} + +package class NullProjectConfigProvider implements IProjectConfigProvider { + + override getProjectConfig(ResourceSet context) { + null + } + +} + +package class VqlDeactivatedServiceProviderRegistry extends ResourceServiceProviderRegistryImpl { + + new() { + val delegateRegistry = IResourceServiceProvider.Registry.INSTANCE + contentTypeToFactoryMap.putAll(delegateRegistry.contentTypeToFactoryMap) + extensionToFactoryMap.putAll(delegateRegistry.extensionToFactoryMap) + protocolToFactoryMap.putAll(delegateRegistry.protocolToFactoryMap) + } + + @Inject + def void setResourceServiceProvider(IResourceServiceProvider vqlDeactivatedResourceServiceProvider) { + extensionToFactoryMap.put(ParseUtil.SIMPLIFIED_PARSER_EXTENSION, vqlDeactivatedResourceServiceProvider) + } } class ParseUtil { + public static val PARSER_EXTENSION = "vql" public static val SIMPLIFIED_PARSER_EXTENSION = "vql_deactivated" - - val Injector injector; + + val Injector injector + val IResourceFactory resourceFactory + new() { PartialinterpretationPackage.eINSTANCE.class; LogicproblemPackage.eINSTANCE.class; LogiclanguagePackage.eINSTANCE.class; - injector = internalCreateInjector - - val IResourceFactory resourceFactory = injector.getInstance(IResourceFactory); - val IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider); - Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(SIMPLIFIED_PARSER_EXTENSION, resourceFactory); - IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put(SIMPLIFIED_PARSER_EXTENSION, serviceProvider); + resourceFactory = injector.getInstance(IResourceFactory) } - + def protected Injector internalCreateInjector() { - var newInjector = new EMFPatternLanguageStandaloneSetup().createInjectorAndDoEMFRegistration(); - val Module module = new MyModule - newInjector = Guice.createInjector(module) - return newInjector; - } - + ensureViatraInitialized(); + val runtimeModulemodule = new StandaloneParserWithFixedMetamodelProviderModule + val overridesModule = new StandaloneParserOverridesModule + val module = Modules.override(runtimeModulemodule).with(overridesModule) + val newInjector = Guice.createInjector(module) + return newInjector + } + + protected def ensureViatraInitialized() { + val extensionToFactoryMap = Resource.Factory.Registry.INSTANCE.extensionToFactoryMap + if (!extensionToFactoryMap.containsKey(PARSER_EXTENSION)) { + EMFPatternLanguageStandaloneSetup.doSetup + } + } + + protected def createResourceSet() { + val XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet) + resourceSet.resourceFactoryRegistry.extensionToFactoryMap.put(SIMPLIFIED_PARSER_EXTENSION, resourceFactory) + resourceSet + } + val builder = new SpecificationBuilder - - public def parse(CharSequence vqlFileContent) { - val XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet); - val Resource resource = resourceSet.createResource(URI.createURI("dummy:/example."+SIMPLIFIED_PARSER_EXTENSION)); + + def parse(CharSequence vqlFileContent) { + val resourceSet = createResourceSet(); + val Resource resource = resourceSet.createResource( + URI.createURI("dummy:/example." + SIMPLIFIED_PARSER_EXTENSION)); val InputStream in = new ByteArrayInputStream(vqlFileContent.toString.getBytes()); resource.load(in, resourceSet.getLoadOptions()); val patternModel = resource.getContents().get(0) as PatternModel; - + EcoreUtil.resolveAll(resource) resource.validate - val res = new LinkedHashMap>> + val res = new LinkedHashMap>> val patterns = new LinkedList> - for(pattern : patternModel.patterns) { - val querySpecification = createSpecification(pattern,patterns) - res.put(querySpecification.fullyQualifiedName,querySpecification) + for (pattern : patternModel.patterns) { + val querySpecification = createSpecification(pattern, patterns) + res.put(querySpecification.fullyQualifiedName, querySpecification) patterns += querySpecification } resource.validate - + return res } - - def IQuerySpecification> createSpecification( - Pattern pattern,List> createdPatternList) - { - builder.getOrCreateSpecification(pattern,createdPatternList,true) + + def IQuerySpecification> createSpecification(Pattern pattern, + List> createdPatternList) { + builder.getOrCreateSpecification(pattern, createdPatternList, true) } - + def private validate(Resource resource) { val errors = resource.errors - if(!errors.isEmpty) { + if (!errors.isEmpty) { println('''-- Errors --''') errors.forEach[println('''> «it»''')] - println('''------------''') + println('''------------''') } } } class FixedMetamodelProvider implements IMetamodelProvider { - + protected val List packages = new LinkedList + new() { packages += PartialinterpretationPackage.eINSTANCE - packages += LogicproblemPackage.eINSTANCE - packages += LogiclanguagePackage.eINSTANCE + packages += LogicproblemPackage.eINSTANCE + packages += LogiclanguagePackage.eINSTANCE } - + override getAllMetamodelObjects(IScope delegateScope, EObject context) { - val metamodels = packages.map[EObjectDescription.create(it.nsURI, it, Collections.singletonMap("nsURI", "true"))] - return new SimpleScope(delegateScope, metamodels); - } - - override boolean isGeneratedCodeAvailable(EPackage ePackage, ResourceSet set) { - true - } - - override String getModelPluginId(EPackage ePackage, ResourceSet set) { - return "hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage" - } - - override String getQualifiedClassName(EClassifier classifier, EObject context) { - classifier.name - } - + val metamodels = packages.map [ + EObjectDescription.create(it.nsURI, it, Collections.singletonMap("nsURI", "true")) + ] + return new SimpleScope(delegateScope, metamodels); + } + + override boolean isGeneratedCodeAvailable(EPackage ePackage, ResourceSet set) { + true + } + + override String getModelPluginId(EPackage ePackage, ResourceSet set) { + return "hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage" + } + + override String getQualifiedClassName(EClassifier classifier, EObject context) { + classifier.name + } + override loadEPackage(String uri, ResourceSet resourceSet) { return packages.filter[it.nsURI.equals(uri)].head } -} \ No newline at end of file +} -- cgit v1.2.3-54-g00ecf