From 6867b650178eaab9e90a88a9348c3736c769a608 Mon Sep 17 00:00:00 2001 From: sefftinge Date: Tue, 15 Jul 2008 14:38:55 +0000 Subject: [PATCH] service framework refactored (made xtext independent) --- .../org.eclipse.xtext/META-INF/MANIFEST.MF | 1 + .../builtin/XtextBuiltinStandaloneSetup.java | 15 ++-- .../xtext/junit/AbstractXtextTests.java | 4 +- .../xtext/parser/BaseEPackageAccess.java | 74 ++++++++++--------- .../xtext/service/ILanguageService.java | 17 +++++ .../generator/resource/ResourceTest.java | 8 +- .../grammarinheritance/InheritanceTest.java | 2 +- .../xtext/tests/AbstractGeneratorTest.java | 26 +++---- .../eclipse/xtext/xtext2ecore/ActionTest.java | 2 +- 9 files changed, 85 insertions(+), 64 deletions(-) create mode 100644 plugins/org.eclipse.xtext/src/org/eclipse/xtext/service/ILanguageService.java diff --git a/plugins/org.eclipse.xtext/META-INF/MANIFEST.MF b/plugins/org.eclipse.xtext/META-INF/MANIFEST.MF index 0e8fbf6e9..afde40e87 100644 --- a/plugins/org.eclipse.xtext/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.xtext/META-INF/MANIFEST.MF @@ -22,6 +22,7 @@ Export-Package: org.eclipse.xtext, org.eclipse.xtext.parsetree.reconstr.impl, org.eclipse.xtext.parsetree.util, org.eclipse.xtext.resource, + org.eclipse.xtext.service, org.eclipse.xtext.services, org.eclipse.xtext.util, org.eclipse.xtext.xtextutil, diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltinStandaloneSetup.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltinStandaloneSetup.java index b029d5861..f6003d1af 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltinStandaloneSetup.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltinStandaloneSetup.java @@ -7,9 +7,9 @@ import org.eclipse.xtext.IGrammarAccess; import org.eclipse.xtext.XtextPackage; import org.eclipse.xtext.builtin.conversion.XtextBuiltInConverters; import org.eclipse.xtext.conversion.IValueConverterService; -import org.eclipse.xtext.service.ILanguageDescriptor; -import org.eclipse.xtext.service.LanguageDescriptorFactory; +import org.eclipse.xtext.service.IServiceScope; import org.eclipse.xtext.service.ServiceRegistry; +import org.eclipse.xtext.service.ServiceScopeFactory; public class XtextBuiltinStandaloneSetup { @@ -21,19 +21,18 @@ public class XtextBuiltinStandaloneSetup { Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl()); EPackage.Registry.INSTANCE.put(XtextPackage.eNS_URI,XtextPackage.eINSTANCE); - ILanguageDescriptor languageDescriptor = LanguageDescriptorFactory.createLanguageDescriptor(IXtextBuiltin.ID, - IXtextBuiltin.NAME, IXtextBuiltin.NAMESPACE, null); + IServiceScope serviceScope = ServiceScopeFactory.createScope(IXtextBuiltin.ID, null); - ServiceRegistry.registerService(languageDescriptor, IGrammarAccess.class, XtextBuiltinGrammarAccess.class); - ServiceRegistry.registerService(languageDescriptor, IValueConverterService.class, XtextBuiltInConverters.class); + ServiceRegistry.registerService(serviceScope, IGrammarAccess.class, XtextBuiltinGrammarAccess.class); + ServiceRegistry.registerService(serviceScope, IValueConverterService.class, XtextBuiltInConverters.class); isInitialized = true; } } - public synchronized static ILanguageDescriptor getLanguageDescriptor() { + public synchronized static IServiceScope getServiceScope() { if (!isInitialized) { doSetup(); } - return LanguageDescriptorFactory.get(IXtextBuiltin.ID); + return ServiceScopeFactory.get(IXtextBuiltin.ID); } } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/junit/AbstractXtextTests.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/junit/AbstractXtextTests.java index 3883a31b3..44f44e762 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/junit/AbstractXtextTests.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/junit/AbstractXtextTests.java @@ -12,7 +12,7 @@ import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.m2t.type.emf.EmfRegistryMetaModel; import org.eclipse.xtext.parser.IParseResult; import org.eclipse.xtext.parser.IParser; -import org.eclipse.xtext.service.ILanguageDescriptor; +import org.eclipse.xtext.service.IServiceScope; import org.eclipse.xtext.service.Inject; import org.eclipse.xtext.service.ServiceRegistry; import org.eclipse.xtext.util.StringInputStream; @@ -35,7 +35,7 @@ public abstract class AbstractXtextTests extends TestCase { return parser; } - protected void setCurrentLanguage(ILanguageDescriptor desc) { + protected void setCurrentLanguage(IServiceScope desc) { ServiceRegistry.injectServices(desc, this); } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/BaseEPackageAccess.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/BaseEPackageAccess.java index 44e0a7a4c..74762b16d 100755 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/BaseEPackageAccess.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/parser/BaseEPackageAccess.java @@ -15,6 +15,8 @@ import org.eclipse.emf.common.util.WrappedException; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.xtext.resource.ClassloaderClasspathUriResolver; import org.eclipse.xtext.resource.XtextResourceSet; /** @@ -23,43 +25,45 @@ import org.eclipse.xtext.resource.XtextResourceSet; */ public abstract class BaseEPackageAccess { - public static EPackage getEPackageFromRegistry(String string) { - EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(string); - if (ePackage == null) - throw new IllegalStateException("couldn't load EPackage for URI '" + string + "'"); - return ePackage; - } + public static EPackage getEPackageFromRegistry(String string) { + EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(string); + if (ePackage == null) + throw new IllegalStateException("couldn't load EPackage for URI '" + string + "'"); + return ePackage; + } - protected static Resource loadResource(ClassLoader loader, String string) { - URI uri = URI.createURI("classpath:/" + string); - XtextResourceSet resourceSet = new XtextResourceSet(); - resourceSet.setClasspathURIContext(loader); - Resource resource; - try { - resource = resourceSet.getResource(uri, true); - if (resource == null) { - throw new IllegalArgumentException("Couldn't create resource for URI : " + uri); - } - } catch (Exception e) { - throw new WrappedException(e); - } - EList contents = resource.getContents(); - if (contents.size() != 1) { - throw new IllegalStateException("loading classpath:" + string + " : Expected one root element but found " + contents.size()); - } - return resource; - } + protected static Resource loadResource(ClassLoader loader, String string) { + URI uri = URI.createURI(string); + XtextResourceSet resourceSet = new XtextResourceSet(); + resourceSet.setClasspathURIContext(loader); + Resource resource; + try { + resource = resourceSet.getResource(uri, true); + if (resource == null) { + throw new IllegalArgumentException("Couldn't create resource for URI : " + uri); + } + } catch (Exception e) { + throw new WrappedException(e); + } + EList contents = resource.getContents(); + if (contents.size() != 1) { + throw new IllegalStateException("loading classpath:" + string + " : Expected one root element but found " + + contents.size()); + } + return resource; + } - protected static EPackage loadEcoreFile(ClassLoader loader, String string) { - Resource resource = loadResource(loader, string); - return (EPackage) resource.getContents().get(0); - } + protected static EPackage loadEcoreFile(ClassLoader loader, String string) { + URI uri = URI.createURI(string); + if (!uri.hasFragment()) + uri = uri.appendFragment("/"); + URI normalized = new ClassloaderClasspathUriResolver().resolve(loader, uri); + return (EPackage) new ResourceSetImpl().getEObject(normalized, true); + } - protected static Object loadGrammarFile(ClassLoader loader, String string) { - Resource resource = loadResource(loader, string); - return resource.getContents().get(0); - } - - + protected static Object loadGrammarFile(ClassLoader loader, String string) { + Resource resource = loadResource(loader, string); + return resource.getContents().get(0); + } } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/service/ILanguageService.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/service/ILanguageService.java new file mode 100644 index 000000000..bb1219f81 --- /dev/null +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/service/ILanguageService.java @@ -0,0 +1,17 @@ +/******************************************************************************* + * Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + *******************************************************************************/ +package org.eclipse.xtext.service; + +/** + * @author Peter Friese - Initial contribution and API + * + */ +public interface ILanguageService { + +} diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/generator/resource/ResourceTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/generator/resource/ResourceTest.java index 7e9417ba0..fa0d76fac 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/generator/resource/ResourceTest.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/generator/resource/ResourceTest.java @@ -10,9 +10,9 @@ import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.xtext.resource.IResourceFactory; -import org.eclipse.xtext.service.ILanguageDescriptor; -import org.eclipse.xtext.service.LanguageDescriptorFactory; +import org.eclipse.xtext.service.IServiceScope; import org.eclipse.xtext.service.ServiceRegistry; +import org.eclipse.xtext.service.ServiceScopeFactory; import org.eclipse.xtext.testlanguages.ITestLanguage; import org.eclipse.xtext.tests.AbstractGeneratorTest; import org.eclipse.xtext.xtext2ecore.EcoreModelComparator; @@ -21,8 +21,8 @@ public class ResourceTest extends AbstractGeneratorTest { public void testResource() throws Exception { new Object(); // workaround for Java bug on MacOSX - ILanguageDescriptor languageDescriptor = LanguageDescriptorFactory.get(ITestLanguage.ID); - IResourceFactory resourceFactory = ServiceRegistry.getService(languageDescriptor, IResourceFactory.class); + IServiceScope serviceScope = ServiceScopeFactory.get(ITestLanguage.ID); + IResourceFactory resourceFactory = ServiceRegistry.getService(serviceScope, IResourceFactory.class); File modelFile = File.createTempFile("testfile", "." + resourceFactory.getModelFileExtensions()[0]); modelFile.deleteOnExit(); diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/InheritanceTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/InheritanceTest.java index 79f687212..ea8ca413e 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/InheritanceTest.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/InheritanceTest.java @@ -7,7 +7,7 @@ import org.eclipse.xtext.tests.AbstractGeneratorTest; public class InheritanceTest extends AbstractGeneratorTest { static { - ServiceRegistry.registerService(AbstractTestLanguageStandaloneSetup.getLanguageDescriptor(), + ServiceRegistry.registerService(AbstractTestLanguageStandaloneSetup.getServiceScope(), IValueConverterService.class, AbstractTestLanguageValueConverters.class); } diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/tests/AbstractGeneratorTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/tests/AbstractGeneratorTest.java index 5fbbee147..6d576ada9 100755 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/tests/AbstractGeneratorTest.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/tests/AbstractGeneratorTest.java @@ -30,7 +30,7 @@ import org.eclipse.xtext.parsetree.reconstr.IParseTreeConstructor; import org.eclipse.xtext.resource.IResourceFactory; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.resource.XtextResourceSet; -import org.eclipse.xtext.service.ILanguageDescriptor; +import org.eclipse.xtext.service.IServiceScope; import org.eclipse.xtext.service.ServiceRegistry; import org.eclipse.xtext.util.StringInputStream; import org.openarchitectureware.expression.ExecutionContextImpl; @@ -58,10 +58,10 @@ public abstract class AbstractGeneratorTest extends TestCase { } - private ILanguageDescriptor currentLanguageDescriptor; + private IServiceScope currentScope; - public ILanguageDescriptor getCurrentLanguageDescriptor() { - return currentLanguageDescriptor; + public IServiceScope getCurrentServiceScope() { + return currentScope; } @Override @@ -73,36 +73,36 @@ public abstract class AbstractGeneratorTest extends TestCase { @Override protected void tearDown() throws Exception { super.tearDown(); - currentLanguageDescriptor = null; + currentScope = null; } /** * call this to set the language class to be used in the current test. */ protected void with(Class standaloneSetup) throws Exception { - Method getLangDescMethod = standaloneSetup.getMethod("getLanguageDescriptor"); - currentLanguageDescriptor = (ILanguageDescriptor) getLangDescMethod.invoke(null); - assert currentLanguageDescriptor != null; + Method getLangDescMethod = standaloneSetup.getMethod("getServiceScope"); + currentScope = (IServiceScope) getLangDescMethod.invoke(null); + assert currentScope != null; } protected IParser getParser() { - return ServiceRegistry.getService(currentLanguageDescriptor, IParser.class); + return ServiceRegistry.getService(currentScope, IParser.class); } protected IAstFactory getASTFactory() { - return ServiceRegistry.getService(currentLanguageDescriptor, IAstFactory.class); + return ServiceRegistry.getService(currentScope, IAstFactory.class); } protected IParseTreeConstructor getParseTreeConstructor() { - return ServiceRegistry.getService(currentLanguageDescriptor, IParseTreeConstructor.class); + return ServiceRegistry.getService(currentScope, IParseTreeConstructor.class); } protected IResourceFactory getResourceFactory() { - return ServiceRegistry.getService(currentLanguageDescriptor, IResourceFactory.class); + return ServiceRegistry.getService(currentScope, IResourceFactory.class); } protected IValueConverterService getValueConverterService() { - return ServiceRegistry.getService(currentLanguageDescriptor, IValueConverterService.class); + return ServiceRegistry.getService(currentScope, IValueConverterService.class); } // parse methods diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/ActionTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/ActionTest.java index 5b6f625c7..f548a3ff6 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/ActionTest.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/ActionTest.java @@ -40,7 +40,7 @@ public class ActionTest extends AbstractGeneratorTest { } private EPackage getActionLangEPackage() { - IMetamodelAccess metaModelAccess = ServiceRegistry.getService(ActionTestLanguageStandaloneSetup.getLanguageDescriptor(), IMetamodelAccess.class); + IMetamodelAccess metaModelAccess = ServiceRegistry.getService(ActionTestLanguageStandaloneSetup.getServiceScope(), IMetamodelAccess.class); EPackage actionLangEPackage = metaModelAccess.getGeneratedEPackages()[0]; return actionLangEPackage; }