diff options
author | Simon McDuff | 2009-01-03 14:58:58 +0000 |
---|---|---|
committer | Simon McDuff | 2009-01-03 14:58:58 +0000 |
commit | 0d9b2379d3594badad1609b1f992da178b4b578f (patch) | |
tree | b96a4b400a6cdcb299cc97b86b56475ec250036b /plugins/org.eclipse.emf.cdo | |
parent | a6fdbd5a8cd79603ceacdb6553727b87ac2a4c07 (diff) | |
download | cdo-0d9b2379d3594badad1609b1f992da178b4b578f.tar.gz cdo-0d9b2379d3594badad1609b1f992da178b4b578f.tar.xz cdo-0d9b2379d3594badad1609b1f992da178b4b578f.zip |
[258933] CDORevisionImpl.eIsSet() works incorrectly
https://bugs.eclipse.org/bugs/show_bug.cgi?id=258933
Diffstat (limited to 'plugins/org.eclipse.emf.cdo')
3 files changed, 106 insertions, 81 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 bdf0633457..5c5977a8c2 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 @@ -359,12 +359,9 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec } Object setting = cdoBasicSettings() != null ? cdoSettings()[i] : null; - if (setting == null) - { - setting = eFeature.getDefaultValue(); - } CDOStore cdoStore = cdoStore(); + if (cdoFeature.isMany()) { if (setting != null) @@ -442,7 +439,6 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec EStore eStore = eStore(); if (eFeature.isMany()) { - int size = cdoStore.size(this, eFeature); for (int index = 0; index < size; index++) { @@ -594,7 +590,7 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec public EStoreEcoreEMap() { - super((EClass)eType, eType.getInstanceClass(), null); + super((EClass)eType, BasicEMap.Entry.class, null); delegateEList = new BasicEStoreEList<BasicEMap.Entry<Object, Object>>(CDOObjectImpl.this, eStructuralFeature) { private static final long serialVersionUID = 1L; @@ -635,22 +631,6 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec size = delegateEList.size(); } - // Temporary fix. A fix should be available in EMF for that. - @Override - protected BasicEList<Entry<Object, Object>> newList() - { - return new BasicEList<Entry<Object, Object>>() - { - private static final long serialVersionUID = 1L; - - @Override - public Object[] newData(int listCapacity) - { - return new BasicEMap.Entry[listCapacity]; - } - }; - } - private void checkListForReading() { if (!FSMUtil.isTransient(CDOObjectImpl.this)) @@ -765,6 +745,37 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec * @since 2.0 */ @Override + protected boolean eDynamicIsSet(int dynamicFeatureID, EStructuralFeature eFeature) + { + return dynamicFeatureID < 0 ? eOpenIsSet(eFeature) : eSettingDelegate(eFeature).dynamicIsSet(this, eSettings(), + dynamicFeatureID); + } + + /** + * TODO: TO BE REMOVED once https://bugs.eclipse.org/bugs/show_bug.cgi?id=259855 is available to downloads + */ + @Override + public void dynamicSet(int dynamicFeatureID, Object value) + { + EStructuralFeature eStructuralFeature = eDynamicFeature(dynamicFeatureID); + if (eStructuralFeature.isTransient()) + { + eSettings[dynamicFeatureID] = value; + } + else + { + eStore().set(this, eStructuralFeature, InternalEObject.EStore.NO_INDEX, value); + if (eIsCaching()) + { + eSettings[dynamicFeatureID] = value; + } + } + } + + /** + * @since 2.0 + */ + @Override public InternalEObject.EStore eStore() { if (FSMUtil.isTransient(this)) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java index 6e60c8874f..0a75811fe2 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java @@ -35,8 +35,8 @@ import org.eclipse.emf.cdo.spi.common.InternalCDORevision; import org.eclipse.emf.internal.cdo.bundle.OM; import org.eclipse.emf.internal.cdo.revision.CDOElementProxy; import org.eclipse.emf.internal.cdo.util.FSMUtil; -import org.eclipse.emf.internal.cdo.util.GenUtil; +import org.eclipse.net4j.util.ImplementationError; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.emf.common.util.URI; @@ -46,6 +46,7 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.InternalEObject.EStore; +import org.eclipse.emf.ecore.impl.EStoreEObjectImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.util.FeatureMap; import org.eclipse.emf.ecore.util.FeatureMapUtil; @@ -171,24 +172,19 @@ public final class CDOStore implements EStore view.getFeatureAnalyzer().preTraverseFeature(cdoObject, cdoFeature, index); InternalCDORevision revision = getRevisionForReading(cdoObject); - Object value = revision.get(cdoFeature, index); + + Object value = revision.basicGet(cdoFeature, index); value = convertToEMF(view, eObject, revision, eFeature, cdoFeature, index, value); view.getFeatureAnalyzer().postTraverseFeature(cdoObject, cdoFeature, index, value); return value; } + @Deprecated public boolean isSet(InternalEObject eObject, EStructuralFeature eFeature) { - InternalCDOObject cdoObject = getCDOObject(eObject); - CDOFeature cdoFeature = getCDOFeature(cdoObject, eFeature); - if (TRACER.isEnabled()) - { - TRACER.format("isSet({0}, {1})", cdoObject, cdoFeature); - } - - InternalCDORevision revision = getRevisionForReading(cdoObject); - return revision.isSet(cdoFeature); + // Should not be called + throw new ImplementationError(); } public int size(InternalEObject eObject, EStructuralFeature eFeature) @@ -342,14 +338,13 @@ public final class CDOStore implements EStore InternalCDORevision revision = getRevisionForWriting(cdoObject, delta); if (cdoFeature.isReference()) { - Object oldValue = revision.get(cdoFeature, index); + Object oldValue = revision.basicGet(cdoFeature, index); oldValue = resolveProxy(revision, cdoFeature, index, oldValue); value = cdoObject.cdoView().convertObjectToID(value, true); } - Object oldValue = revision.set(cdoFeature, index, value); + Object oldValue = revision.basicSet(cdoFeature, index, value); oldValue = convertToEMF(cdoObject.cdoView(), eObject, revision, eFeature, cdoFeature, index, oldValue); - return oldValue; } @@ -359,39 +354,47 @@ public final class CDOStore implements EStore public Object convertToEMF(InternalCDOView view, EObject eObject, InternalCDORevision revision, EStructuralFeature eFeature, CDOFeature cdoFeature, int index, Object value) { - if (cdoFeature.isMany() && EStore.NO_INDEX != index) + if (value != null) { - value = resolveProxy(revision, cdoFeature, index, value); - if (cdoFeature.isMany() && value instanceof CDOID) + if (value == InternalCDORevision.NIL) { - CDOID id = (CDOID)value; - CDOList list = revision.getList(cdoFeature); - CDORevisionManagerImpl revisionManager = (CDORevisionManagerImpl)view.getSession().getRevisionManager(); - CDORevisionPrefetchingPolicy policy = view.options().getRevisionPrefetchingPolicy(); - Collection<CDOID> listOfIDs = policy.loadAhead(revisionManager, eObject, eFeature, list, index, id); - if (!listOfIDs.isEmpty()) + return EStoreEObjectImpl.NIL; + } + + if (cdoFeature.isMany() && EStore.NO_INDEX != index) + { + value = resolveProxy(revision, cdoFeature, index, value); + if (cdoFeature.isMany() && value instanceof CDOID) { - revisionManager.getRevisions(listOfIDs, view.getSession().options().getCollectionLoadingPolicy() - .getInitialChunkSize()); + CDOID id = (CDOID)value; + CDOList list = revision.getList(cdoFeature); + CDORevisionManagerImpl revisionManager = (CDORevisionManagerImpl)view.getSession().getRevisionManager(); + CDORevisionPrefetchingPolicy policy = view.options().getRevisionPrefetchingPolicy(); + Collection<CDOID> listOfIDs = policy.loadAhead(revisionManager, eObject, eFeature, list, index, id); + if (!listOfIDs.isEmpty()) + { + revisionManager.getRevisions(listOfIDs, view.getSession().options().getCollectionLoadingPolicy() + .getInitialChunkSize()); + } } } - } - if (cdoFeature.isReference()) - { - value = view.convertIDToObject(value); - } - else if (cdoFeature.getType() == CDOType.CUSTOM) - { - value = EcoreUtil.createFromString((EDataType)eFeature.getEType(), (String)value); - } - else if (cdoFeature.getType() == CDOType.FEATURE_MAP_ENTRY) - { - CDOFeatureMapEntryDataTypeImpl entry = (CDOFeatureMapEntryDataTypeImpl)value; - EStructuralFeature feature = (EStructuralFeature)view.getResourceSet().getEObject(URI.createURI(entry.getURI()), - true); - Object object = view.convertIDToObject(entry.getObject()); - value = FeatureMapUtil.createEntry(feature, object); + if (cdoFeature.isReference()) + { + value = view.convertIDToObject(value); + } + else if (cdoFeature.getType() == CDOType.CUSTOM) + { + value = EcoreUtil.createFromString((EDataType)eFeature.getEType(), (String)value); + } + else if (cdoFeature.getType() == CDOType.FEATURE_MAP_ENTRY) + { + CDOFeatureMapEntryDataTypeImpl entry = (CDOFeatureMapEntryDataTypeImpl)value; + EStructuralFeature feature = (EStructuralFeature)view.getResourceSet().getEObject( + URI.createURI(entry.getURI()), true); + Object object = view.convertIDToObject(entry.getObject()); + value = FeatureMapUtil.createEntry(feature, object); + } } return value; @@ -402,23 +405,26 @@ public final class CDOStore implements EStore */ public Object convertToCDO(InternalCDOView view, EStructuralFeature eFeature, CDOFeature cdoFeature, Object value) { - if (cdoFeature.isReference()) + if (value != null) { - value = view.convertObjectToID(value, true); - } - else if (cdoFeature.getType() == CDOType.FEATURE_MAP_ENTRY) - { - FeatureMap.Entry entry = (FeatureMap.Entry)value; - String uri = EcoreUtil.getURI(entry.getEStructuralFeature()).toString(); - value = CDORevisionUtil.createFeatureMapEntry(uri, entry.getValue()); - } - else if (cdoFeature.getType() == CDOType.CUSTOM) - { - value = EcoreUtil.convertToString((EDataType)eFeature.getEType(), value); - } - else if (value == null && GenUtil.isPrimitiveType(eFeature.getEType())) - { - value = eFeature.getDefaultValue(); + if (value == EStoreEObjectImpl.NIL) + { + value = InternalCDORevision.NIL; + } + else if (cdoFeature.isReference()) + { + value = view.convertObjectToID(value, true); + } + else if (cdoFeature.getType() == CDOType.FEATURE_MAP_ENTRY) + { + FeatureMap.Entry entry = (FeatureMap.Entry)value; + String uri = EcoreUtil.getURI(entry.getEStructuralFeature()).toString(); + value = CDORevisionUtil.createFeatureMapEntry(uri, entry.getValue()); + } + else if (cdoFeature.getType() == CDOType.CUSTOM) + { + value = EcoreUtil.convertToString((EDataType)eFeature.getEType(), value); + } } return value; @@ -435,8 +441,9 @@ public final class CDOStore implements EStore CDOFeatureDelta delta = new CDOUnsetFeatureDeltaImpl(cdoFeature); InternalCDORevision revision = getRevisionForWriting(cdoObject, delta); + // TODO Handle containment remove!!! - revision.unset(cdoFeature); + revision.set(cdoFeature, 0, null); } public void add(InternalEObject eObject, EStructuralFeature eFeature, int index, Object value) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/ModelUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/ModelUtil.java index 8f8a6647a2..bcf23d7c52 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/ModelUtil.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/ModelUtil.java @@ -50,6 +50,7 @@ import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.impl.EPackageImpl; +import org.eclipse.emf.ecore.util.EcoreUtil; /** * @author Eike Stepper @@ -272,7 +273,13 @@ public final class ModelUtil String name = eFeature.getName(); CDOType type = getCDOType(eFeature); boolean many = EMFUtil.isMany(eFeature); - return CDOModelUtil.createAttribute(containingClass, featureID, name, type, many); + Object defaultValue = eFeature.getDefaultValue(); + if (type == CDOType.CUSTOM) + { + defaultValue = EcoreUtil.convertToString((EDataType)eFeature.getEType(), defaultValue); + } + + return CDOModelUtil.createAttribute(containingClass, featureID, name, type, defaultValue, many); } public static EPackage getEPackage(CDOPackage cdoPackage, CDOPackageRegistry packageRegistry) |