summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Efftinge2011-08-03 05:38:37 (EDT)
committer Ed Merks2011-08-03 05:39:04 (EDT)
commitec1738a677979928fddb03a4883b87db90d9795a (patch)
tree0ffdf291d6450798942b03cf78e35dfb69d003f2
parent7ee3b8fdba1811296f0f8075f8a42c67b2b26312 (diff)
downloadorg.eclipse.emf-ec1738a677979928fddb03a4883b87db90d9795a.zip
org.eclipse.emf-ec1738a677979928fddb03a4883b87db90d9795a.tar.gz
org.eclipse.emf-ec1738a677979928fddb03a4883b87db90d9795a.tar.bz2
First bits of ResourceDescriptionStrategy
-rw-r--r--org.eclipse.emf.ecore.xcore.tests/META-INF/MANIFEST.MF4
-rw-r--r--org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/scoping/LazyCreationProxyUriConverterTest.java85
-rw-r--r--org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/scoping/ResourceDescriptionManagerTest.java50
-rw-r--r--org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/XcoreRuntimeModule.java8
-rw-r--r--org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/scoping/LazyCreationProxyUriConverter.java85
-rw-r--r--org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/scoping/XcoreResourceDescriptionStrategy.java71
6 files changed, 302 insertions, 1 deletions
diff --git a/org.eclipse.emf.ecore.xcore.tests/META-INF/MANIFEST.MF b/org.eclipse.emf.ecore.xcore.tests/META-INF/MANIFEST.MF
index 87a5686..3953641 100644
--- a/org.eclipse.emf.ecore.xcore.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.emf.ecore.xcore.tests/META-INF/MANIFEST.MF
@@ -9,5 +9,7 @@ Require-Bundle: org.eclipse.emf.ecore.xcore,
org.junit4;bundle-version="4.5.0",
org.eclipse.ui;bundle-version="3.5.2";resolution:=optional,
org.eclipse.core.runtime;bundle-version="3.5.0";resolution:=optional,
- org.eclipse.xtext.junit4;bundle-version="2.0.0"
+ org.eclipse.xtext.junit4;bundle-version="2.0.0",
+ org.eclipse.emf.codegen.ecore;bundle-version="2.7.0",
+ org.eclipse.xtext.common.types;bundle-version="2.0.0"
Import-Package: org.eclipse.xtext.junit
diff --git a/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/scoping/LazyCreationProxyUriConverterTest.java b/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/scoping/LazyCreationProxyUriConverterTest.java
new file mode 100644
index 0000000..7131ecb
--- /dev/null
+++ b/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/scoping/LazyCreationProxyUriConverterTest.java
@@ -0,0 +1,85 @@
+package org.eclipse.emf.ecore.xcore.tests.scoping;
+
+import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
+import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.ecore.xcore.scoping.LazyCreationProxyUriConverter;
+import org.eclipse.xtext.common.types.JvmGenericType;
+import org.eclipse.xtext.common.types.TypesFactory;
+import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.xtext.util.Pair;
+import org.junit.Test;
+
+import static junit.framework.Assert.*;
+
+public class LazyCreationProxyUriConverterTest {
+
+ @Test
+ public void testUriConversion_1() throws Exception {
+ LazyCreationProxyUriConverter converter = new LazyCreationProxyUriConverter();
+
+ GenClass genClass = GenModelFactory.eINSTANCE.createGenClass();
+ final QualifiedName name = QualifiedName.create("foo.bar","Baz");
+ converter.installProxyURI(URI.createFileURI("foo.test"), genClass, name);
+
+ Pair<EClass, QualifiedName> proxyInfo = converter.decodeProxy(genClass);
+ assertSame(genClass.eClass(), proxyInfo.getFirst());
+ assertEquals(name.toString(), proxyInfo.getSecond().toString());
+ }
+
+ @Test
+ public void testUriConversion_2() throws Exception {
+ LazyCreationProxyUriConverter converter = new LazyCreationProxyUriConverter();
+
+ EClass eClass = EcoreFactory.eINSTANCE.createEClass();
+ final QualifiedName name = QualifiedName.create("foo.bar","Baz");
+ converter.installProxyURI(URI.createFileURI("foo.test"), eClass, name);
+
+ Pair<EClass, QualifiedName> proxyInfo = converter.decodeProxy(eClass);
+ assertSame(eClass.eClass(), proxyInfo.getFirst());
+ assertEquals(name.toString(), proxyInfo.getSecond().toString());
+ }
+
+ @Test
+ public void testUriConversion_3() throws Exception {
+ LazyCreationProxyUriConverter converter = new LazyCreationProxyUriConverter();
+
+ JvmGenericType genericType = TypesFactory.eINSTANCE.createJvmGenericType();
+ final QualifiedName name = QualifiedName.create("foo.bar","Baz");
+ converter.installProxyURI(URI.createFileURI("foo.test"), genericType, name);
+
+ Pair<EClass, QualifiedName> proxyInfo = converter.decodeProxy(genericType);
+ assertSame(genericType.eClass(), proxyInfo.getFirst());
+ assertEquals(name.toString(), proxyInfo.getSecond().toString());
+ }
+
+ @Test
+ public void testUriConversion_4() throws Exception {
+ LazyCreationProxyUriConverter converter = new LazyCreationProxyUriConverter();
+
+ EOperation op = EcoreFactory.eINSTANCE.createEOperation();
+ final QualifiedName name = QualifiedName.create("foo.bar","Baz");
+ try {
+ converter.installProxyURI(URI.createFileURI("foo.test"), op, name);
+ fail();
+ } catch (IllegalArgumentException e) {
+
+ }
+ }
+
+ @Test
+ public void testUriConversion_5() throws Exception {
+ LazyCreationProxyUriConverter converter = new LazyCreationProxyUriConverter();
+
+ JvmGenericType genericType = TypesFactory.eINSTANCE.createJvmGenericType();
+ try {
+ converter.decodeProxy(genericType);
+ fail();
+ } catch (IllegalArgumentException e) {
+
+ }
+ }
+}
diff --git a/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/scoping/ResourceDescriptionManagerTest.java b/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/scoping/ResourceDescriptionManagerTest.java
new file mode 100644
index 0000000..548b4fa
--- /dev/null
+++ b/org.eclipse.emf.ecore.xcore.tests/src/org/eclipse/emf/ecore/xcore/tests/scoping/ResourceDescriptionManagerTest.java
@@ -0,0 +1,50 @@
+package org.eclipse.emf.ecore.xcore.tests.scoping;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.xcore.XPackage;
+import org.eclipse.emf.ecore.xcore.XcoreInjectorProvider;
+import org.eclipse.xtext.common.types.TypesPackage;
+import org.eclipse.xtext.junit4.InjectWith;
+import org.eclipse.xtext.junit4.XtextRunner;
+import org.eclipse.xtext.junit4.util.ParseHelper;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import com.google.inject.Inject;
+
+import static org.junit.Assert.*;
+
+@RunWith(XtextRunner.class)
+@InjectWith(XcoreInjectorProvider.class)
+public class ResourceDescriptionManagerTest {
+
+ @Inject
+ private ParseHelper<XPackage> parser;
+
+ @Inject
+ private IResourceDescription.Manager descriptionManager;
+
+ @Test
+ public void testCreateResourceDescription() throws Exception {
+ XPackage xcorePackage = parser.parse("package foo.bar class Baz {}");
+ IResourceDescription resourceDescription = descriptionManager.getResourceDescription(xcorePackage.eResource());
+
+ Iterator<IEObjectDescription> eclass = resourceDescription.getExportedObjectsByType(EcorePackage.Literals.ECLASS).iterator();
+ Iterator<IEObjectDescription> genclass = resourceDescription.getExportedObjectsByType(GenModelPackage.Literals.GEN_CLASS).iterator();
+ Iterator<IEObjectDescription> jvmTypes = resourceDescription.getExportedObjectsByType(TypesPackage.Literals.JVM_GENERIC_TYPE).iterator();
+ final String expected = "foo.bar.Baz";
+ assertEquals(expected, eclass.next().getName().toString());
+ assertFalse(eclass.hasNext());
+ assertEquals(expected, genclass.next().getName().toString());
+ assertFalse(genclass.hasNext());
+ assertEquals(expected, jvmTypes.next().getName().toString());
+ assertEquals(expected+"Impl", jvmTypes.next().getName().toString());
+ assertFalse(genclass.hasNext());
+ }
+
+}
diff --git a/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/XcoreRuntimeModule.java b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/XcoreRuntimeModule.java
index 13a3377..ee9e9b6 100644
--- a/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/XcoreRuntimeModule.java
+++ b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/XcoreRuntimeModule.java
@@ -4,7 +4,9 @@
package org.eclipse.emf.ecore.xcore;
import org.eclipse.emf.ecore.xcore.linking.XcoreLazyLinker;
+import org.eclipse.emf.ecore.xcore.scoping.XcoreResourceDescriptionStrategy;
import org.eclipse.xtext.linking.ILinker;
+import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy;
import org.eclipse.xtext.serializer.ISerializer;
import org.eclipse.xtext.serializer.impl.Serializer;
@@ -24,4 +26,10 @@ public class XcoreRuntimeModule extends org.eclipse.emf.ecore.xcore.AbstractXcor
{
return Serializer.class;
}
+
+ public Class<? extends IDefaultResourceDescriptionStrategy> bindIDefaultResourceDescriptionStrategy()
+ {
+ return XcoreResourceDescriptionStrategy.class;
+ }
+
}
diff --git a/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/scoping/LazyCreationProxyUriConverter.java b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/scoping/LazyCreationProxyUriConverter.java
new file mode 100644
index 0000000..7d9fc6e
--- /dev/null
+++ b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/scoping/LazyCreationProxyUriConverter.java
@@ -0,0 +1,85 @@
+package org.eclipse.emf.ecore.xcore.scoping;
+
+import java.util.Map;
+
+import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.xtext.common.types.TypesPackage;
+import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.xtext.util.Pair;
+import org.eclipse.xtext.util.Tuples;
+
+import static com.google.common.collect.Maps.*;
+
+public class LazyCreationProxyUriConverter {
+
+ private Map<String, EClass> types = newHashMap();
+ {
+ EClass eclass = EcorePackage.Literals.ECLASS;
+ EClass genClass = GenModelPackage.Literals.GEN_CLASS;
+ EClass jvmGenericType = TypesPackage.Literals.JVM_GENERIC_TYPE;
+ types.put(eclass.getName(), eclass);
+ types.put(genClass.getName(), genClass);
+ types.put(jvmGenericType.getName(), jvmGenericType);
+ }
+
+ public void installProxyURI(URI resourceURI, EObject eobject, QualifiedName name) {
+ URI proxyURI = getProxyURI(resourceURI, eobject, name);
+ ((InternalEObject) eobject).eSetProxyURI(proxyURI);
+ }
+
+ public URI getProxyURI(URI resourceURI, EObject eObject, QualifiedName name) {
+ if (!isSupported(eObject)) {
+ throw new IllegalArgumentException("eObjects of type " + eObject.eClass().getName() + " are not supported.");
+ }
+ return resourceURI.appendFragment(encodeFragment(eObject.eClass(), name));
+ }
+
+ private boolean isSupported(EObject eObject) {
+ return types.containsValue(eObject.eClass());
+ }
+
+ public Pair<EClass, QualifiedName> decodeProxy(EObject obj) {
+ if (obj != null) {
+ URI proxyURI = ((InternalEObject) obj).eProxyURI();
+ if (proxyURI != null) {
+ return decodeProxyUri(proxyURI);
+ }
+ }
+ throw new IllegalArgumentException("" + obj);
+ }
+
+ public Pair<EClass, QualifiedName> decodeProxyUri(URI proxyUri) {
+ final String fragment = proxyUri.fragment();
+ if (fragment != null) {
+ Pair<EClass, QualifiedName> fragmentInfo = decodeFragment(fragment);
+ if (fragmentInfo != null) {
+ return fragmentInfo;
+ }
+ }
+ throw new IllegalArgumentException("couldn't parse URI :'" + proxyUri);
+ }
+
+ private final static String DELIM = "%";
+
+ protected String encodeFragment(EClass eclass, QualifiedName name) {
+ return eclass.getName() + DELIM + name.toString();
+ }
+
+ protected Pair<EClass, QualifiedName> decodeFragment(String fragment) {
+ String[] segments = fragment.split(DELIM);
+ if (segments.length == 2) {
+ String clazzName = segments[0];
+ QualifiedName name = QualifiedName.create(segments[1]);
+ if (types.containsKey(clazzName)) {
+ return Tuples.create(types.get(clazzName), name);
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/scoping/XcoreResourceDescriptionStrategy.java b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/scoping/XcoreResourceDescriptionStrategy.java
new file mode 100644
index 0000000..be932ed
--- /dev/null
+++ b/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/scoping/XcoreResourceDescriptionStrategy.java
@@ -0,0 +1,71 @@
+package org.eclipse.emf.ecore.xcore.scoping;
+
+import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
+import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.ecore.xcore.XClass;
+import org.eclipse.xtext.common.types.JvmGenericType;
+import org.eclipse.xtext.common.types.TypesFactory;
+import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.xtext.resource.EObjectDescription;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy;
+import org.eclipse.xtext.util.IAcceptor;
+
+import com.google.inject.Inject;
+
+public class XcoreResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy {
+
+ @Inject(optional=true)
+ private TypesFactory typesFactory = TypesFactory.eINSTANCE;
+
+ @Inject(optional=true)
+ private EcoreFactory ecoreFactory = EcoreFactory.eINSTANCE;
+
+ @Inject(optional=true)
+ private GenModelFactory genFactory = GenModelFactory.eINSTANCE;
+
+ @Inject
+ private LazyCreationProxyUriConverter proxyTool;
+
+ @Override
+ public boolean createEObjectDescriptions(EObject eObject, IAcceptor<IEObjectDescription> acceptor) {
+ if (eObject instanceof XClass) {
+ final XClass clazz = (XClass) eObject;
+ String name = clazz.getName();
+ String packageName = clazz.getPackage().getName();
+ QualifiedName qn = QualifiedName.create(packageName,name);
+ createGenModelDescription(eObject, acceptor, qn);
+ createEcoreDescription(eObject, acceptor, qn);
+ createJvmTypesDescription(eObject, acceptor, qn);
+ return false;
+ }
+ return true;
+ }
+
+ protected void createJvmTypesDescription(EObject eObject, IAcceptor<IEObjectDescription> acceptor, QualifiedName qn) {
+ JvmGenericType theInterface = typesFactory.createJvmGenericType();
+ proxyTool.installProxyURI(eObject.eResource().getURI(), theInterface, qn);
+ acceptor.accept(EObjectDescription.create(qn, theInterface));
+
+ QualifiedName implClassName = QualifiedName.create(qn.toString()+"Impl");
+ JvmGenericType theImplClass = typesFactory.createJvmGenericType();
+ proxyTool.installProxyURI(eObject.eResource().getURI(), theImplClass, implClassName);
+ acceptor.accept(EObjectDescription.create(implClassName, theImplClass));
+ }
+
+ protected void createEcoreDescription(EObject eObject, IAcceptor<IEObjectDescription> acceptor, QualifiedName qn) {
+ EClass eclass = ecoreFactory.createEClass();
+ proxyTool.installProxyURI(eObject.eResource().getURI(), eclass, qn);
+ acceptor.accept(EObjectDescription.create(qn, eclass));
+ }
+
+ protected void createGenModelDescription(EObject eObject, IAcceptor<IEObjectDescription> acceptor, QualifiedName qn) {
+ GenClass genClass = genFactory.createGenClass();
+ proxyTool.installProxyURI(eObject.eResource().getURI(), genClass, qn);
+ acceptor.accept(EObjectDescription.create(qn, genClass));
+ }
+
+}