diff options
author | mtaal | 2007-04-07 12:42:42 +0000 |
---|---|---|
committer | mtaal | 2007-04-07 12:42:42 +0000 |
commit | 2292ea6497374c1d678713304e402338d92d028d (patch) | |
tree | c8716ce4c9eec01d1b3112f89548628b19872291 | |
parent | 35c6a7cbe41a10b7000dfb628fb71d18dc1b91d2 (diff) | |
download | org.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.
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); } } |