diff options
author | Eike Stepper | 2013-02-11 13:45:01 +0000 |
---|---|---|
committer | Eike Stepper | 2013-02-13 19:58:16 +0000 |
commit | da7d59cf71edbd4b7333b38542072ed7c587224d (patch) | |
tree | b0cedd9000759579dfce2fdefaf7a6790814b4ec /plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java | |
parent | 1de2ed6f432205d8b65580eb54594f34b433b6a3 (diff) | |
download | cdo-da7d59cf71edbd4b7333b38542072ed7c587224d.tar.gz cdo-da7d59cf71edbd4b7333b38542072ed7c587224d.tar.xz cdo-da7d59cf71edbd4b7333b38542072ed7c587224d.zip |
[400388] Integrate the new MinimalEStoreEObjectImpl
https://bugs.eclipse.org/bugs/show_bug.cgi?id=400388
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java | 654 |
1 files changed, 277 insertions, 377 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java index 10dfc8c031..8e79a501a0 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java @@ -18,9 +18,7 @@ import org.eclipse.emf.cdo.CDOObjectHistory; import org.eclipse.emf.cdo.CDOState; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.lock.CDOLockState; -import org.eclipse.emf.cdo.common.model.CDOClassInfo; import org.eclipse.emf.cdo.common.model.CDOModelUtil; -import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl; @@ -42,9 +40,9 @@ import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.NotificationChain; +import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.BasicEMap; -import org.eclipse.emf.common.util.ECollections; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; @@ -55,11 +53,10 @@ import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.BasicEObjectImpl; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.eclipse.emf.ecore.impl.EStoreEObjectImpl; +import org.eclipse.emf.ecore.impl.EStoreEObjectImpl.BasicEStoreFeatureMap; import org.eclipse.emf.ecore.impl.MinimalEStoreEObjectImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.Resource.Internal; -import org.eclipse.emf.ecore.util.DelegatingFeatureMap; -import org.eclipse.emf.ecore.util.EcoreEList; import org.eclipse.emf.ecore.util.EcoreEMap; import org.eclipse.emf.ecore.util.FeatureMap; import org.eclipse.emf.ecore.util.FeatureMapUtil; @@ -73,9 +70,6 @@ import org.eclipse.emf.spi.cdo.InternalCDOView.ViewAndState; import java.util.Collection; import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; /** * The base class of all <em>native</em> {@link CDOObject objects}. @@ -86,7 +80,20 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC { private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_OBJECT, CDOObjectImpl.class); - private static final Object[] CDO_NO_SETTINGS = {}; + private static final EObservableAdapterList.Listener ADAPTERS_LISTENER = new EObservableAdapterList.Listener() + { + public void added(Notifier notifier, Adapter adapter) + { + ((CDOObjectImpl)notifier).adapterAdded(adapter); + } + + public void removed(Notifier notifier, Adapter adapter) + { + ((CDOObjectImpl)notifier).adapterRemoved(adapter); + } + }; + + private InternalCDOClassInfo classInfo; /** * Optimized storage of {@link CDOObject#cdoView()} and {@link CDOObject#cdoState()}. @@ -102,17 +109,6 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC private Object idOrRevision; /** - * Used by CDO instead of eSettings for TRANSIENT objects. - * <p> - * EMF uses eSettings as a cache. - * CDO {@link #eIsCaching() deactivates} this caching but EMF still uses eSettings to store list wrappers. - * List wrappers are the lists returned from the getters of many-valued features. They need to be unique for an object during all CDOStates. - * CDO needs another place to store the real list with the actual data (transient mode) and accessible through EStore. - * This allows CDO to always use the same instance of the list wrapper. - */ - private transient Object[] cdoSettings; - - /** * Don't use the optional slot in MinimalEObject because a CDOObject always needs eSettings to store: * <ul> * <li>the values of all features of transient objects, @@ -124,6 +120,15 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC public CDOObjectImpl() { + initClassInfo(eStaticClass()); + } + + /** + * @since 4.2 + */ + public InternalCDOClassInfo cdoClassInfo() + { + return classInfo; } public final CDOState cdoState() @@ -339,8 +344,6 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC // Only intended to be called by CDOTransactionImpl.removeObject(CDOID, CDOObject). // See bug 383370. - // TODO Rename this method to cdoInternalDetach() - if (resource != null) { throw new IllegalArgumentException( @@ -367,15 +370,13 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC if (eSettings != null) { // Make sure transient features are kept but persisted values are not cached. - CDOClassInfo classInfo = getClassInfo(); - EClass eClass = eClass(); int featureCount = eClass.getFeatureCount(); for (int i = 0; i < featureCount; i++) { // We need to keep the existing list if possible. int index = classInfo.getSettingsFeatureIndex(i); - if (index != CDOClassInfo.NO_SETTING) + if (index != InternalCDOClassInfo.NO_SLOT) { Object value = eSettings[index]; if (value instanceof InternalCDOLoadable) @@ -416,21 +417,30 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC revision.setResourceID(cdoResource.cdoID()); } - if (cdoSettings != null) + if (eSettings != null) { EClass eClass = eClass(); - int featureCount = eClass.getFeatureCount(); - for (int i = 0; i < featureCount; i++) + EStructuralFeature[] allPersistentFeatures = classInfo.getAllPersistentFeatures(); + int length = allPersistentFeatures.length; + for (int i = 0; i < length; i++) { - EStructuralFeature eFeature = eClass.getEStructuralFeature(i); - if (EMFUtil.isPersistent(eFeature)) - { - instanceToRevisionFeature(viewAndState.view, this, eFeature, cdoSettings[i]); - } + EStructuralFeature eFeature = allPersistentFeatures[i]; + int featureID = eClass.getFeatureID(eFeature); + int transientIndex = classInfo.getTransientFeatureIndex(featureID); + Object setting = eSettings[transientIndex]; // Can be safely accessed directly because we come from TRANSIENT + + instanceToRevisionFeature(viewAndState.view, this, eFeature, setting); } cdoRevision().setUnchunked(); - cdoSettings = null; + + int newSize = classInfo.getSettingsFeatureCount(); + if (newSize != eSettings.length) + { + Object[] newSettings = new Object[newSize]; + System.arraycopy(eSettings, 0, newSettings, 0, newSize); + eSettings = newSettings; + } } } @@ -458,21 +468,23 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC eBasicSetContainer(store.getContainer(this)); eBasicSetContainerFeatureID(store.getContainingFeatureID(this)); - // Ensure that the internal cdoSettings array is initialized; - cdoSettings = null; - cdoSettings(); - - InternalCDORevision revision = cdoRevision(); - EClass eClass = eClass(); - int featureCount = eClass.getFeatureCount(); - for (int i = 0; i < featureCount; i++) + if (eSettings != null) { - EStructuralFeature eFeature = eClass.getEStructuralFeature(i); - if (EMFUtil.isPersistent(eFeature)) + int newSize = classInfo.getSettingsFeatureCount() + classInfo.getTransientFeatureCount(); + if (newSize != eSettings.length) { - revisionToInstanceFeature(this, revision, eFeature); + Object[] newSettings = new Object[newSize]; + System.arraycopy(eSettings, 0, newSettings, 0, eSettings.length); + eSettings = newSettings; } } + + InternalCDORevision revision = cdoRevision(); + EStructuralFeature[] allPersistentFeatures = classInfo.getAllPersistentFeatures(); + for (EStructuralFeature eFeature : allPersistentFeatures) + { + revisionToInstanceFeature(this, revision, eFeature); + } } /** @@ -499,68 +511,47 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC throw new UnsupportedOperationException(); } - /** - * @since 4.2 - */ - @Override - protected void eAdapterAdded(Adapter newAdapter) + private CDOStore cdoStore() { - if (!FSMUtil.isTransient(CDOObjectImpl.this)) - { - viewAndState.view.handleAddAdapter(CDOObjectImpl.this, newAdapter); - } + return viewAndState.view.getStore(); } /** - * @since 4.2 + * @since 2.0 */ @Override - protected void eAdapterRemoved(Adapter oldAdapter) + public EStore eStore() { - if (!FSMUtil.isTransient(CDOObjectImpl.this)) + if (FSMUtil.isTransient(this)) { - viewAndState.view.handleRemoveAdapter(CDOObjectImpl.this, oldAdapter); + return TransientStore.INSTANCE; } + + return cdoStore(); } - /** - * @since 2.0 - */ - private Object[] cdoSettings() + @Override + protected EClass eDynamicClass() { - if (cdoSettings == null) + EClass eClass = eClass(); + if (eClass == eStaticClass()) { - int size = eClass().getFeatureCount(); - if (size == 0) - { - cdoSettings = CDO_NO_SETTINGS; - } - else - { - cdoSettings = new Object[size]; - } + return null; } - return cdoSettings; + return eClass; } - private CDOStore cdoStore() + @Override + public final EClass eClass() { - return viewAndState.view.getStore(); + return classInfo.getEClass(); } - /** - * @since 2.0 - */ @Override - public EStore eStore() + public void eSetClass(EClass eClass) { - if (FSMUtil.isTransient(this)) - { - return TransientStore.INSTANCE; - } - - return cdoStore(); + initClassInfo(eClass); } /** @@ -591,8 +582,8 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC @Override public Object dynamicGet(int dynamicFeatureID) { - int index = getClassInfo().getSettingsFeatureIndex(dynamicFeatureID); - if (index == CDOClassInfo.NO_SETTING) + int index = classInfo.getSettingsFeatureIndex(dynamicFeatureID); + if (index == InternalCDOClassInfo.NO_SLOT) { // The feature has no slot in eSettings, i.e., it's persistent or single-valued. // Delegate to the store. TransientStore delegates back to eSettings. @@ -607,7 +598,7 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC if (result == null) { EStructuralFeature eStructuralFeature = eDynamicFeature(dynamicFeatureID); - if (EMFUtil.isPersistent(eStructuralFeature)) + if (classInfo.isPersistent(dynamicFeatureID)) { if (FeatureMapUtil.isFeatureMap(eStructuralFeature)) { @@ -626,8 +617,8 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC @Override public void dynamicSet(int dynamicFeatureID, Object value) { - int index = getClassInfo().getSettingsFeatureIndex(dynamicFeatureID); - if (index == CDOClassInfo.NO_SETTING) + int index = classInfo.getSettingsFeatureIndex(dynamicFeatureID); + if (index == InternalCDOClassInfo.NO_SLOT) { // The feature has no slot in eSettings, i.e., it's persistent or single-valued. // Delegate to the store. TransientStore delegates back to eSettings. @@ -645,8 +636,8 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC @Override public void dynamicUnset(int dynamicFeatureID) { - int index = getClassInfo().getSettingsFeatureIndex(dynamicFeatureID); - if (index == CDOClassInfo.NO_SETTING) + int index = classInfo.getSettingsFeatureIndex(dynamicFeatureID); + if (index == InternalCDOClassInfo.NO_SLOT) { // The feature has no slot in eSettings, i.e., it's persistent or single-valued. // Delegate to the store. TransientStore delegates back to eSettings. @@ -657,9 +648,26 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC else { Object[] eSettings = eBasicSettings(); - eSettings[index] = null; - - // XXX Don't remove the list wrapper for many-valued features!!! + Object oldValue = eSettings[index]; + if (oldValue != null) + { + if (oldValue instanceof InternalEList) + { + InternalEList<?> list = (InternalEList<?>)oldValue; + if (list instanceof InternalEList.Unsettable) + { + ((InternalEList.Unsettable<?>)list).unset(); + } + else + { + list.clear(); + } + } + else + { + eSettings[index] = null; + } + } } } @@ -876,7 +884,7 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC return eOpenIsSet(eFeature); } - if (EMFUtil.isPersistent(eFeature)) + if (classInfo.isPersistent(dynamicFeatureID)) { return eStore().isSet(this, eFeature); } @@ -907,14 +915,16 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC protected int eDynamicFeatureID(EStructuralFeature eStructuralFeature) { // CDOObjectImpl has no static features, so don't subract their count here: - return eClass().getFeatureID(eStructuralFeature); + EClass eClass = eClass(); + return eClass.getFeatureID(eStructuralFeature); } @Override protected EStructuralFeature eDynamicFeature(int dynamicFeatureID) { // CDOObjectImpl has no static features, so don't add their count here: - return eClass().getEStructuralFeature(dynamicFeatureID); + EClass eClass = eClass(); + return eClass.getEStructuralFeature(dynamicFeatureID); } @Override @@ -922,7 +932,12 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC { if (!eHasSettings()) { - int size = getClassInfo().getSettingsFeatureCount(); + int size = classInfo.getSettingsFeatureCount(); + if (FSMUtil.isTransient(this)) + { + size += classInfo.getTransientFeatureCount(); + } + if (size != 0) { eBasicSetSettings(new Object[size]); @@ -959,6 +974,45 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC return false; } + @Override + protected void eBasicSetAdapterArray(Adapter[] adapters) + { + Adapter[] oldAdapters = eBasicAdapterArray(); + if (ObjectUtil.isEmpty(adapters)) + { + adapters = null;// Optimize possibly empty array + if (oldAdapters != null) // Can't be empty array because of the optimization above + { + ((EObservableAdapterList)eAdapters()).removeListener(ADAPTERS_LISTENER); + } + } + else + { + if (oldAdapters == null) // Can't be empty array because of the optimization above + { + ((EObservableAdapterList)eAdapters()).addListener(ADAPTERS_LISTENER); + } + } + + super.eBasicSetAdapterArray(adapters); + } + + private void adapterAdded(Adapter newAdapter) + { + if (!FSMUtil.isTransient(CDOObjectImpl.this)) + { + viewAndState.view.handleAddAdapter(CDOObjectImpl.this, newAdapter); + } + } + + private void adapterRemoved(Adapter oldAdapter) + { + if (!FSMUtil.isTransient(CDOObjectImpl.this)) + { + viewAndState.view.handleRemoveAdapter(CDOObjectImpl.this, oldAdapter); + } + } + /** * Specializing the behaviour of {@link #hashCode()} is not permitted as per {@link EObject} specification. */ @@ -980,13 +1034,16 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC @Override public String toString() { + EClass eClass = eClass(); + String name = eClass.getName(); + CDOID id = cdoID(); if (id == null) { - return eClass().getName() + "?"; //$NON-NLS-1$ + return name + "?"; //$NON-NLS-1$ } - return eClass().getName() + "@" + id; //$NON-NLS-1$ + return name + "@" + id; //$NON-NLS-1$ } @Override @@ -1034,9 +1091,9 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC return eStructuralFeature.getEType().getInstanceClassName() == "java.util.Map$Entry"; //$NON-NLS-1$ } - private CDOClassInfo getClassInfo() + private void initClassInfo(EClass eClass) { - return CDOModelUtil.getClassInfo(eClass()); + classInfo = (InternalCDOClassInfo)CDOModelUtil.getClassInfo(eClass); } /** @@ -1052,18 +1109,18 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC { if (feature.isMany()) { - int index = cdoObject.eStore().indexOf(cdoObject, feature, instance.cdoID()); + EStore eStore = cdoObject.eStore(); + int index = eStore.indexOf(cdoObject, feature, instance.cdoID()); - // TODO Simon Log an error in the new view.getErrors() in the case we are not able to find the object. - // Cannot throw an exception, the detach process is too far. if (index != -1) { - cdoObject.eStore().set(cdoObject, feature, index, instance); + eStore.set(cdoObject, feature, index, instance); } } else { - cdoObject.eStore().set(cdoObject, feature, 0, instance); + EStore eStore = cdoObject.eStore(); + eStore.set(cdoObject, feature, 0, instance); } } else @@ -1091,50 +1148,6 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC } /** - * @since 2.0 - */ - public static void revisionToInstanceFeature(InternalCDOObject instance, InternalCDORevision revision, - EStructuralFeature eFeature) - { - if (TRACER.isEnabled()) - { - TRACER.format("Depopulating feature {0}", eFeature); //$NON-NLS-1$ - } - - EStructuralFeature.Internal internalFeature = (EStructuralFeature.Internal)eFeature; - InternalCDOView view = instance.cdoView(); - EReference oppositeReference = view.isObjectNew(instance.cdoID()) ? null : internalFeature.getEOpposite(); - - CDOStore cdoStore = view.getStore(); - EStore eStore = instance.eStore(); - - if (eFeature.isMany()) - { - int size = cdoStore.size(instance, eFeature); - for (int index = 0; index < size; index++) - { - // Do not trigger events - // Do not trigger inverse updates - Object object = cdoStore.get(instance, eFeature, index); - eStore.add(instance, eFeature, index, object); - if (oppositeReference != null) - { - adjustOppositeReference(instance, (InternalEObject)object, oppositeReference); - } - } - } - else - { - Object object = cdoStore.get(instance, eFeature, EStore.NO_INDEX); - eStore.set(instance, eFeature, EStore.NO_INDEX, object); - if (oppositeReference != null) - { - adjustOppositeReference(instance, (InternalEObject)object, oppositeReference); - } - } - } - - /** * @since 3.0 */ public static void instanceToRevisionFeature(InternalCDOView view, InternalCDOObject object, @@ -1181,6 +1194,50 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC } /** + * @since 2.0 + */ + public static void revisionToInstanceFeature(InternalCDOObject instance, InternalCDORevision revision, + EStructuralFeature eFeature) + { + if (TRACER.isEnabled()) + { + TRACER.format("Depopulating feature {0}", eFeature); //$NON-NLS-1$ + } + + EStructuralFeature.Internal internalFeature = (EStructuralFeature.Internal)eFeature; + InternalCDOView view = instance.cdoView(); + EReference oppositeReference = view.isObjectNew(instance.cdoID()) ? null : internalFeature.getEOpposite(); + + CDOStore cdoStore = view.getStore(); + EStore eStore = instance.eStore(); + + if (eFeature.isMany()) + { + int size = cdoStore.size(instance, eFeature); + for (int index = 0; index < size; index++) + { + // Do not trigger events + // Do not trigger inverse updates + Object object = cdoStore.get(instance, eFeature, index); + eStore.add(instance, eFeature, index, object); + if (oppositeReference != null) + { + adjustOppositeReference(instance, (InternalEObject)object, oppositeReference); + } + } + } + else + { + Object object = cdoStore.get(instance, eFeature, EStore.NO_INDEX); + eStore.set(instance, eFeature, EStore.NO_INDEX, object); + if (oppositeReference != null) + { + adjustOppositeReference(instance, (InternalEObject)object, oppositeReference); + } + } + } + + /** * @since 4.1 */ public static CDOLock createLock(InternalCDOObject object, LockType type) @@ -1225,137 +1282,146 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC { } - private Object getValue(InternalEObject eObject, int dynamicFeatureID) + private Object getValue(InternalEObject eObject, int transientIndex) { - Object settings[] = ((CDOObjectImpl)eObject).cdoSettings(); - return settings[dynamicFeatureID]; + Object[] settings = getSettings(eObject); + return settings[transientIndex]; } - private EList<Object> getValueAsList(InternalEObject eObject, int dynamicFeatureID) + private EList<Object> getValueAsList(InternalEObject eObject, int transientIndex) { - Object settings[] = ((CDOObjectImpl)eObject).cdoSettings(); + Object[] settings = getSettings(eObject); @SuppressWarnings("unchecked") - EList<Object> result = (EList<Object>)settings[dynamicFeatureID]; + EList<Object> result = (EList<Object>)settings[transientIndex]; if (result == null) { result = new BasicEList<Object>(); - settings[dynamicFeatureID] = result; + settings[transientIndex] = result; } return result; } - private Object setValue(InternalEObject eObject, int dynamicFeatureID, Object newValue) + private Object setValue(InternalEObject eObject, int transientIndex, Object newValue) { - Object settings[] = ((CDOObjectImpl)eObject).cdoSettings(); - Object oldValue = settings[dynamicFeatureID]; - settings[dynamicFeatureID] = newValue; + Object[] settings = getSettings(eObject); + Object oldValue = settings[transientIndex]; + settings[transientIndex] = newValue; return oldValue; } - private int eDynamicFeatureID(InternalEObject eObject, EStructuralFeature feature) + private Object[] getSettings(InternalEObject eObject) { - return ((CDOObjectImpl)eObject).eDynamicFeatureID(feature); + CDOObjectImpl object = (CDOObjectImpl)eObject; + object.eSettings(); // Ensure that the array is created + return object.eSettings; + } + + private int getTransientFeatureIndex(InternalEObject eObject, EStructuralFeature feature) + { + CDOObjectImpl object = (CDOObjectImpl)eObject; + int dynamicFeatureID = object.eDynamicFeatureID(feature); + return object.classInfo.getTransientFeatureIndex(dynamicFeatureID); } public Object get(InternalEObject eObject, EStructuralFeature feature, int index) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); + int transientIndex = getTransientFeatureIndex(eObject, feature); if (index != NO_INDEX) { - return getValueAsList(eObject, dynamicFeatureID).get(index); + return getValueAsList(eObject, transientIndex).get(index); } - return getValue(eObject, dynamicFeatureID); + return getValue(eObject, transientIndex); } public Object set(InternalEObject eObject, EStructuralFeature feature, int index, Object value) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); + int transientIndex = getTransientFeatureIndex(eObject, feature); if (index != NO_INDEX) { - return getValueAsList(eObject, dynamicFeatureID).set(index, value); + return getValueAsList(eObject, transientIndex).set(index, value); } - return setValue(eObject, dynamicFeatureID, value); + return setValue(eObject, transientIndex, value); } public void add(InternalEObject eObject, EStructuralFeature feature, int index, Object value) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - getValueAsList(eObject, dynamicFeatureID).add(index, value); + int transientIndex = getTransientFeatureIndex(eObject, feature); + getValueAsList(eObject, transientIndex).add(index, value); } public Object remove(InternalEObject eObject, EStructuralFeature feature, int index) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).remove(index); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).remove(index); } public Object move(InternalEObject eObject, EStructuralFeature feature, int targetIndex, int sourceIndex) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).move(targetIndex, sourceIndex); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).move(targetIndex, sourceIndex); } public void clear(InternalEObject eObject, EStructuralFeature feature) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); + int transientIndex = getTransientFeatureIndex(eObject, feature); if (feature.isMany()) { - getValueAsList(eObject, dynamicFeatureID).clear(); + getValueAsList(eObject, transientIndex).clear(); } - setValue(eObject, dynamicFeatureID, null); + setValue(eObject, transientIndex, null); } public int size(InternalEObject eObject, EStructuralFeature feature) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).size(); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).size(); } public int indexOf(InternalEObject eObject, EStructuralFeature feature, Object value) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).indexOf(value); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).indexOf(value); } public int lastIndexOf(InternalEObject eObject, EStructuralFeature feature, Object value) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).lastIndexOf(value); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).lastIndexOf(value); } public Object[] toArray(InternalEObject eObject, EStructuralFeature feature) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).toArray(); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).toArray(); } public <T> T[] toArray(InternalEObject eObject, EStructuralFeature feature, T[] array) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).toArray(array); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).toArray(array); } public boolean isEmpty(InternalEObject eObject, EStructuralFeature feature) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).isEmpty(); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).isEmpty(); } public boolean contains(InternalEObject eObject, EStructuralFeature feature, Object value) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).contains(value); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).contains(value); } public int hashCode(InternalEObject eObject, EStructuralFeature feature) { - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValueAsList(eObject, dynamicFeatureID).hashCode(); + int transientIndex = getTransientFeatureIndex(eObject, feature); + return getValueAsList(eObject, transientIndex).hashCode(); } public InternalEObject getContainer(InternalEObject eObject) @@ -1387,34 +1453,28 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC return !ObjectUtil.equals(eObject.eGet(feature), feature.getDefaultValue()); } - Object[] settings = ((CDOObjectImpl)eObject).cdoSettings; + Object[] settings = ((CDOObjectImpl)eObject).eSettings; if (settings == null) { return false; } - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return settings[dynamicFeatureID] != null; + int transientIndex = getTransientFeatureIndex(eObject, feature); + return settings[transientIndex] != null; } public void unset(InternalEObject eObject, EStructuralFeature feature) { - Object[] settings = ((CDOObjectImpl)eObject).cdoSettings; + CDOObjectImpl object = (CDOObjectImpl)eObject; + Object[] settings = object.eSettings; if (settings == null) { // Is already unset return; } - int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - if (feature.isUnsettable()) - { - settings[dynamicFeatureID] = null; - } - else - { - settings[dynamicFeatureID] = feature.getDefaultValue(); - } + int transientIndex = getTransientFeatureIndex(eObject, feature); + settings[transientIndex] = null; } } @@ -1424,7 +1484,7 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC * @author Eike Stepper * @since 4.1 */ - public class CDOStoreEcoreEMap extends EcoreEMap<Object, Object> implements InternalCDOLoadable + private final class CDOStoreEcoreEMap extends EcoreEMap<Object, Object> implements InternalCDOLoadable { private static final long serialVersionUID = 1L; @@ -1539,14 +1599,14 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC return super.containsValue(value); } - public void cdoInternalPostLoad() + public void cdoInternalPreLoad() { - entryData = null; - size = delegateEList.size(); } - public void cdoInternalPreLoad() + public void cdoInternalPostLoad() { + entryData = null; + size = delegateEList.size(); } } @@ -1556,7 +1616,7 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC * @author Andras Peteri * @since 4.1 */ - public class CDOStoreUnorderedEList<E> extends EStoreEObjectImpl.BasicEStoreEList<E> + private final class CDOStoreUnorderedEList<E> extends EStoreEObjectImpl.BasicEStoreEList<E> { private static final long serialVersionUID = 1L; @@ -1581,11 +1641,11 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC } /** - * TODO Remove this when EMF has fixed bug 197487 + * For internal use only. * * @author Eike Stepper */ - public class CDOStoreFeatureMap extends DelegatingFeatureMap + private final class CDOStoreFeatureMap extends BasicEStoreFeatureMap { private static final long serialVersionUID = 1L; @@ -1593,165 +1653,5 @@ public class CDOObjectImpl extends MinimalEStoreEObjectImpl implements InternalC { super(CDOObjectImpl.this, eStructuralFeature); } - - @Override - protected List<FeatureMap.Entry> delegateList() - { - throw new UnsupportedOperationException(); - } - - @Override - public EStructuralFeature getEStructuralFeature() - { - return eStructuralFeature; - } - - @Override - protected void delegateAdd(int index, Entry object) - { - eStore().add(owner, eStructuralFeature, index, object); - } - - @Override - protected void delegateAdd(Entry object) - { - delegateAdd(delegateSize(), object); - } - - @Override - protected List<FeatureMap.Entry> delegateBasicList() - { - int size = delegateSize(); - if (size == 0) - { - return ECollections.emptyEList(); - } - - Object[] data = cdoStore().toArray(owner, eStructuralFeature); - return new EcoreEList.UnmodifiableEList<FeatureMap.Entry>(owner, eStructuralFeature, data.length, data); - } - - @Override - protected void delegateClear() - { - eStore().clear(owner, eStructuralFeature); - } - - @Override - protected boolean delegateContains(Object object) - { - return eStore().contains(owner, eStructuralFeature, object); - } - - @Override - protected boolean delegateContainsAll(Collection<?> collection) - { - for (Object o : collection) - { - if (!delegateContains(o)) - { - return false; - } - } - - return true; - } - - @Override - protected Entry delegateGet(int index) - { - return (Entry)eStore().get(owner, eStructuralFeature, index); - } - - @Override - protected int delegateHashCode() - { - return eStore().hashCode(owner, eStructuralFeature); - } - - @Override - protected int delegateIndexOf(Object object) - { - return eStore().indexOf(owner, eStructuralFeature, object); - } - - @Override - protected boolean delegateIsEmpty() - { - return eStore().isEmpty(owner, eStructuralFeature); - } - - @Override - protected Iterator<FeatureMap.Entry> delegateIterator() - { - return iterator(); - } - - @Override - protected int delegateLastIndexOf(Object object) - { - return eStore().lastIndexOf(owner, eStructuralFeature, object); - } - - @Override - protected ListIterator<FeatureMap.Entry> delegateListIterator() - { - return listIterator(); - } - - @Override - protected Entry delegateRemove(int index) - { - return (Entry)eStore().remove(owner, eStructuralFeature, index); - } - - @Override - protected Entry delegateSet(int index, Entry object) - { - return (Entry)eStore().set(owner, eStructuralFeature, index, object); - } - - @Override - protected int delegateSize() - { - return eStore().size(owner, eStructuralFeature); - } - - @Override - protected Object[] delegateToArray() - { - return eStore().toArray(owner, eStructuralFeature); - } - - @Override - protected <T> T[] delegateToArray(T[] array) - { - return eStore().toArray(owner, eStructuralFeature, array); - } - - @Override - protected Entry delegateMove(int targetIndex, int sourceIndex) - { - return (Entry)eStore().move(owner, eStructuralFeature, targetIndex, sourceIndex); - } - - @Override - protected String delegateToString() - { - StringBuffer stringBuffer = new StringBuffer(); - stringBuffer.append("["); //$NON-NLS-1$ - for (int i = 0, size = size(); i < size;) - { - Object value = delegateGet(i); - stringBuffer.append(String.valueOf(value)); - if (++i < size) - { - stringBuffer.append(", "); //$NON-NLS-1$ - } - } - - stringBuffer.append("]"); //$NON-NLS-1$ - return stringBuffer.toString(); - } } } |