service framework refactored (made xtext independent)

This commit is contained in:
sefftinge 2008-07-15 14:38:55 +00:00
parent ca06607789
commit 6867b65017
9 changed files with 85 additions and 64 deletions

View file

@ -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,

View file

@ -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);
}
}

View file

@ -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);
}

View file

@ -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<EObject> 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<EObject> 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);
}
}

View file

@ -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 {
}

View file

@ -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();

View file

@ -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);
}

View file

@ -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

View file

@ -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;
}