Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormtaal2007-04-07 12:42:42 +0000
committermtaal2007-04-07 12:42:42 +0000
commit2292ea6497374c1d678713304e402338d92d028d (patch)
treec8716ce4c9eec01d1b3112f89548628b19872291
parent35c6a7cbe41a10b7000dfb628fb71d18dc1b91d2 (diff)
downloadorg.eclipse.emf.teneo-2292ea6497374c1d678713304e402338d92d028d.tar.gz
org.eclipse.emf.teneo-2292ea6497374c1d678713304e402338d92d028d.tar.xz
org.eclipse.emf.teneo-2292ea6497374c1d678713304e402338d92d028d.zip
[181492]
Reworked ERuntime to the more generic EModelResolver class.
-rw-r--r--plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ERuntime.java98
-rw-r--r--plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/DefaultEClassNameStrategy.java17
-rw-r--r--plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/EModelResolver.java62
-rw-r--r--plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/resource/StoreResource.java18
4 files changed, 106 insertions, 89 deletions
diff --git a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ERuntime.java b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ERuntime.java
index 0218ece52..bb5b18a6d 100644
--- a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ERuntime.java
+++ b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ERuntime.java
@@ -12,7 +12,7 @@
*
* </copyright>
*
- * $Id: ERuntime.java,v 1.7 2007/03/29 15:00:51 mtaal Exp $
+ * $Id: ERuntime.java,v 1.8 2007/04/07 12:42:42 mtaal Exp $
*/
package org.eclipse.emf.teneo;
@@ -33,6 +33,9 @@ import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.impl.EcorePackageImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xml.type.impl.XMLTypePackageImpl;
+import org.eclipse.emf.teneo.classloader.ClassLoaderResolver;
+import org.eclipse.emf.teneo.classloader.StoreClassLoadException;
+import org.eclipse.emf.teneo.ecore.EModelResolver;
import org.eclipse.emf.teneo.util.StoreUtil;
/**
@@ -44,10 +47,10 @@ import org.eclipse.emf.teneo.util.StoreUtil;
* contained computations.
*
* @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
- * @version $Revision: 1.7 $
+ * @version $Revision: 1.8 $
*/
-public class ERuntime {
+public class ERuntime extends EModelResolver {
/** The logger */
private static Log log = LogFactory.getLog(ERuntime.class);
@@ -61,6 +64,12 @@ public class ERuntime {
/** The singleton instance */
public static final ERuntime INSTANCE = new ERuntime();
+ /** Set this instance as the emodelresolver */
+ public static void setAsEModelResolver() {
+ log.debug("Setting ERunTime as EModelResolver");
+ EModelResolver.setInstance(INSTANCE);
+ }
+
/** The list of epackages processed here */
private final ArrayList<EPackage> epackages = new ArrayList<EPackage>();
@@ -69,7 +78,7 @@ public class ERuntime {
private final HashMap<Class<?>, EClass> interfaceToEClass = new HashMap<Class<?>, EClass>();
- private final HashMap<EClass, Class<?>> eclassToConcrete = new HashMap<EClass, Class<?>>();
+ private final HashMap<EClassifier, Class<?>> eclassifierToConcrete = new HashMap<EClassifier, Class<?>>();
/** The list of topclasses/interfaces */
private final ArrayList<Class<?>> topClasses = new ArrayList<Class<?>>();
@@ -96,7 +105,7 @@ public class ERuntime {
containedClasses.clear();
concreteToEClass.clear();
interfaceToEClass.clear();
- eclassToConcrete.clear();
+ eclassifierToConcrete.clear();
topClasses.clear();
}
@@ -211,7 +220,7 @@ public class ERuntime {
/** Determines concrete impl classes for each eclass */
private void computeConcreteInstanceMapping() {
concreteToEClass.clear();
- eclassToConcrete.clear();
+ eclassifierToConcrete.clear();
interfaceToEClass.clear();
// walk through all the epackages
@@ -231,9 +240,9 @@ public class ERuntime {
if (!(eclassifier instanceof EClass))
continue;
- final Object instance = getPersistableInstance(eclassifier);
+ final Object instance = create((EClass)eclassifier);
if (instance != null) {
- eclassToConcrete.put((EClass) eclassifier, instance
+ eclassifierToConcrete.put((EClass) eclassifier, instance
.getClass());
concreteToEClass.put(instance.getClass(),
(EClass) eclassifier);
@@ -273,37 +282,11 @@ public class ERuntime {
if (EObject.class.isAssignableFrom(interf[i])) {
final EClass eclass = (EClass) interfaceToEClass.get(interf[i]);
concreteToEClass.put(clazz, eclass);
- eclassToConcrete.put(eclass, clazz);
+ eclassifierToConcrete.put(eclass, clazz);
}
}
}
- /**
- * Returns a persistable instance of an eclassifier, if the eclassifier is
- * not persistable/instantiable then null is returned.
- */
- private Object getPersistableInstance(EClassifier eclassifier) {
- final EClass eclazz = (EClass) eclassifier;
-
- // abstract instance classes are added later
- if (eclazz.isAbstract() || eclazz.isInterface())
- return null;
-
- // Check if the class is persistable
- try {
- return EcoreUtil.create(eclazz);
- } catch (Exception e) {
- // log but do nothing because this happens when we try to create an
- // object
- // with an invalid classifier, which is a eclass!
- log.debug("The classifier: " + eclassifier.getName()
- + " is not a valid eclass");
-
- return null;
- }
-
- }
-
/*
* (non-Javadoc)
*
@@ -333,22 +316,50 @@ public class ERuntime {
if (eclass == null) {
throw new StoreException("No eclass for interf " + interf.getName());
}
- return getInstanceClass(eclass);
+ return getJavaClass(eclass);
}
/** Returns the instanceclass for a passed eclass */
- public Class<?> getInstanceClass(EClass eclass) {
- if (eclass.isInterface()) {
- return eclass.getInstanceClass();
+ public Class<?> getJavaClass(EClassifier eclassifier) {
+ if (eclassifier instanceof EClass) {
+ final EClass eclass = (EClass)eclassifier;
+ if (eclass.isInterface()) {
+ return eclass.getInstanceClass();
+ }
}
- return (Class<?>) eclassToConcrete.get(eclass);
+ return (Class<?>) eclassifierToConcrete.get(eclassifier);
}
/** Returns the interface class for a passed eclass */
- public Class<?> getInterfaceClass(EClass eclass) {
+ public Class<?> getJavaInterfaceClass(EClass eclass) {
return eclass.getInstanceClass();
}
+ /** Returns true if the passed EClass has a javaClass representation. */
+ public boolean hasImplementationClass(EClassifier eclassifier) {
+ return null != getJavaClass(eclassifier);
+ }
+
+ /** Returns null */
+ public Object create(EClass eclass) {
+ // abstract instance classes are added later
+ if (eclass.isAbstract() || eclass.isInterface())
+ return null;
+
+ // Check if the class is persistable
+ try {
+ return EcoreUtil.create(eclass);
+ } catch (Exception e) {
+ // log but do nothing because this happens when we try to create an
+ // object
+ // with an invalid classifier, which is a eclass!
+ log.debug("The classifier: " + eclass.getName()
+ + " is not a valid eclass");
+
+ return null;
+ }
+ }
+
/** Get the eclass for a certain class */
public EClass getEClass(Class<?> clazz) {
if (clazz.isInterface()) {
@@ -360,10 +371,9 @@ public class ERuntime {
/** Get the eclass for a certain class name */
public EClass getEClass(String classname) {
try {
- return getEClass(Class.forName(classname));
- } catch (ClassNotFoundException e) {
+ return getEClass(ClassLoaderResolver.classForName(classname));
+ } catch (StoreClassLoadException e) {
log.debug("Failed to retreive ECLass for name: " + classname);
-
return null;
}
}
diff --git a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/DefaultEClassNameStrategy.java b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/DefaultEClassNameStrategy.java
index 248a3ead7..802130d08 100644
--- a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/DefaultEClassNameStrategy.java
+++ b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/DefaultEClassNameStrategy.java
@@ -1,22 +1,26 @@
package org.eclipse.emf.teneo.ecore;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.teneo.ERuntime;
+import org.eclipse.emf.teneo.classloader.ClassLoaderResolver;
+import org.eclipse.emf.teneo.classloader.StoreClassLoadException;
/**
* This implementation assumes that EClass names are unique. It will (de)Resolve
* using the EClass name.
- * <p>
- * TODO: Should be moved to Teneo project.
*
* @author <a href="lmfridael@elver.org">Laurens Fridael</a>
* @author <a href="mtaal@elver.org">Martin Taal</a>
*/
public class DefaultEClassNameStrategy implements EClassNameStrategy {
+ /** The logger */
+ private static Log log = LogFactory.getLog(DefaultEClassNameStrategy.class);
+
/** The singleton instance as it is thread safe */
public static final DefaultEClassNameStrategy INSTANCE = new DefaultEClassNameStrategy();
@@ -87,7 +91,12 @@ public class DefaultEClassNameStrategy implements EClassNameStrategy {
// we didn'y find it, perhaps it is fully qualified, lets try by full class name
if (eClass == null) {
- eClass = ERuntime.INSTANCE.getEClass(eClassName);
+ try {
+ final Class<?> cls = ClassLoaderResolver.classForName(eClassName);
+ eClass = EModelResolver.instance().getEClass(cls);
+ } catch (StoreClassLoadException e) {
+ log.debug("Failed to retreive ECLass for name: " + eClassName);
+ }
}
if (eClass == null) {
diff --git a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/EModelResolver.java b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/EModelResolver.java
index 2983c3026..7dffe3def 100644
--- a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/EModelResolver.java
+++ b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/ecore/EModelResolver.java
@@ -12,13 +12,16 @@ import org.eclipse.emf.ecore.EStructuralFeature;
*
* @author <a href="mtaal@elver.org">Martin Taal</a>
*/
-public class EModelResolver {
+public abstract class EModelResolver {
/** The default instance of an EcoreResolver */
- private static EModelResolver instance = new EModelResolver();
+ private static EModelResolver instance = null;
/** Return the current ecore resolver */
public static EModelResolver instance() {
+ if (instance == null) {
+ throw new IllegalStateException("ModelResolver instance has not been set!");
+ }
return instance;
}
@@ -27,22 +30,20 @@ public class EModelResolver {
instance = modelResolver;
}
+ /** Clear all internal datastructures */
+ public abstract void clear();
+
/**
* @return the EClass for a java class, if not found then the superclass of
* the javaclass is tried
*/
- public EClass getEClass(Class<?> javaClass) {
- return null;
- }
+ public abstract EClass getEClass(Class<?> javaClass);
/** Is the epackage registered */
- public boolean isRegistered(EPackage epackage) {
- return false;
- }
+ public abstract boolean isRegistered(EPackage epackage);
- /** Register the epackage */
- public void register(EPackage epackage) {
- }
+ /** Register the epackages */
+ public abstract void register(EPackage[] epacks);
/** Return the java member name for the efeature */
public String getJavaMember(EStructuralFeature efeature) {
@@ -50,32 +51,37 @@ public class EModelResolver {
}
/** @return the java implementation class for an EClass */
- public Class<?> getJavaClass(EClassifier eclassifier) {
- return null;
- }
+ public abstract Class<?> getJavaClass(EClassifier eclassifier);
/** @return the java interface class for an EClass */
- public Class<?> getJavaInterfaceClass(EClass eclass) {
- return null;
- }
+ public abstract Class<?> getJavaInterfaceClass(EClass eclass);
/** Returns true if the passed EClass has a javaClass representation. */
- public boolean hasImplementationClass(EClassifier eclassifier) {
- return false;
- }
-
- /** Returns null */
- public Object create(EClass eclass) {
- return null;
- }
+ public abstract boolean hasImplementationClass(EClassifier eclassifier);
+
+ /** Returns the currently registered epackages */
+ public abstract EPackage[] getEPackages();
/** Returns null */
+ public abstract Object create(EClass eclass);
+
+ /** Returns a java instance of an EClass defined by name */
public Object create(EPackage epackage, String eclassName) {
- return null;
+ final EClass eclass = (EClass)epackage.getEClassifier(eclassName);
+ if (eclass == null) {
+ throw new IllegalArgumentException("No EClass " + eclassName + " found in epackage " + epackage.getName());
+ }
+ return create(eclass);
}
- /** Returns null */
+ /** Returns a java instance of an EClass defined by name, all epackages are searched for this eclass. */
public Object create(String eclassName) {
- return null;
+ for (EPackage epackage : getEPackages()) {
+ final EClass eclass = (EClass)epackage.getEClassifier(eclassName);
+ if (eclass != null) {
+ return create(eclass);
+ }
+ }
+ throw new IllegalArgumentException("No EClass " + eclassName + " found.");
}
} \ No newline at end of file
diff --git a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/resource/StoreResource.java b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/resource/StoreResource.java
index f81c33206..e46691e65 100644
--- a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/resource/StoreResource.java
+++ b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/resource/StoreResource.java
@@ -13,7 +13,7 @@
*
* </copyright>
*
- * $Id: StoreResource.java,v 1.19 2007/03/28 13:57:40 mtaal Exp $
+ * $Id: StoreResource.java,v 1.20 2007/04/07 12:42:42 mtaal Exp $
*/
package org.eclipse.emf.teneo.resource;
@@ -55,7 +55,7 @@ import org.eclipse.emf.teneo.StoreValidationException;
* load unloaded elists.
*
* @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
- * @version $Revision: 1.19 $
+ * @version $Revision: 1.20 $
*/
public abstract class StoreResource extends ResourceImpl {
@@ -338,21 +338,13 @@ public abstract class StoreResource extends ResourceImpl {
*/
public void addToContentOrAttach(InternalEObject eObject,
boolean isContainmentLoad) {
- if (loadStrategy.compareTo(ADD_TO_CONTENTS) == 0) {
+ if (loadStrategy.compareTo(ADD_TO_CONTENTS) == 0) { // always add
if (eObject.eResource() == null) { // with lazy load the resource
// can already be set
setEResource(eObject, true);
}
- // note direct access to super member
- if (!contents.contains(eObject)) {
- final NotificationChain notifications = contents.basicAdd(
- eObject, null);
- if (notifications != null && sendNotificationsOnLoad) {
- notifications.dispatch();
- }
- attached(eObject);
- }
- } else if (isContainmentLoad) {
+ attached(eObject);
+ } else if (isContainmentLoad) { // only add if contained
attached(eObject);
}
}

Back to the top