diff options
author | Eike Stepper | 2009-12-24 09:25:44 +0000 |
---|---|---|
committer | Eike Stepper | 2009-12-24 09:25:44 +0000 |
commit | 9cd16f2959f5c13ab7916ffd951e84336f5115dc (patch) | |
tree | da554e62c9a7cee3d9b0daca71559a59c2cff895 | |
parent | 1903a820cb3f0330d95a7783c4683cc0d5b06c3b (diff) | |
download | cdo-9cd16f2959f5c13ab7916ffd951e84336f5115dc.tar.gz cdo-9cd16f2959f5c13ab7916ffd951e84336f5115dc.tar.xz cdo-9cd16f2959f5c13ab7916ffd951e84336f5115dc.zip |
[296450] isSet method returns incorrect value after load
https://bugs.eclipse.org/bugs/show_bug.cgi?id=296450
10 files changed, 230 insertions, 212 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionData.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionData.java index 58289c4ff7..ad1605a0b8 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionData.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionData.java @@ -4,7 +4,7 @@ * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html - * + * * Contributors: * Eike Stepper - initial API and implementation */ @@ -21,6 +21,13 @@ import org.eclipse.emf.ecore.EStructuralFeature; public interface CDORevisionData { /** + * The equivalent of <code>EStructuralFeatureImpl.NIL</code> (i.e. explicit <code>null</code>). + * + * @since 3.0 + */ + public static final Nil NIL = new Nil(); + + /** * @since 2.0 */ public CDORevision revision(); @@ -78,4 +85,23 @@ public interface CDORevisionData * @since 2.0 */ public int hashCode(EStructuralFeature feature); + + /** + * A singleton marker class that is only used in {@link CDORevisionData#NIL} for better recognition while debugging. + * + * @author Eike Stepper + * @since 3.0 + */ + public static final class Nil + { + private Nil() + { + } + + @Override + public String toString() + { + return "<NIL>"; + } + } } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java index 011e7d4452..61feacec16 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java @@ -322,14 +322,6 @@ public abstract class CDODataInputImpl extends ExtendedDataInput.Delegating impl public Object readCDOFeatureValue(EStructuralFeature feature) throws IOException { CDOType type = CDOModelUtil.getType(feature); - if (type.canBeNull() && !feature.isMany()) - { - if (readBoolean()) - { - return InternalCDORevision.NIL; - } - } - return type.readValue(this); } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java index 2dc0850202..d6fc4bbbfb 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java @@ -258,33 +258,7 @@ public abstract class CDODataOutputImpl extends ExtendedDataOutput.Delegating im public void writeCDOFeatureValue(EStructuralFeature feature, Object value) throws IOException { - // TODO We could certainly optimized this: When a feature is a reference, NIL is only possible in the case where - // unsettable == true. (TO be verified) - CDOType type = CDOModelUtil.getType(feature); - if (type.canBeNull()) - { - if (!feature.isMany()) - { - if (value == InternalCDORevision.NIL) - { - writeBoolean(true); - return; - } - else - { - writeBoolean(false); - } - } - } - else - { - if (value == null) - { - value = feature.getDefaultValue(); - } - } - type.writeValue(this, value); } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java index bd1d3ba4cc..2a8f051608 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java @@ -33,7 +33,6 @@ import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDeltaUtil; import org.eclipse.emf.cdo.internal.common.bundle.OM; import org.eclipse.emf.cdo.internal.common.messages.Messages; -import org.eclipse.net4j.util.collection.MoveableList; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.net4j.util.om.trace.PerfTracer; @@ -61,6 +60,12 @@ public abstract class AbstractCDORevision implements InternalCDORevision private static final PerfTracer WRITING = new PerfTracer(OM.PERF_REVISION_WRITING, AbstractCDORevision.class); + private static final byte UNSET = 0; + + private static final byte SET_NULL = 1; + + private static final byte SET_NOT_NULL = 2; + private CDOClassInfo classInfo; private CDOID id; @@ -449,16 +454,6 @@ public abstract class AbstractCDORevision implements InternalCDORevision return getValue(feature); } - public Object basicGet(EStructuralFeature feature, int index) - { - if (feature.isMany()) - { - return getList(feature).get(index); - } - - return basicGet(feature); - } - public boolean contains(EStructuralFeature feature, Object value) { return getList(feature).contains(value); @@ -534,16 +529,6 @@ public abstract class AbstractCDORevision implements InternalCDORevision return setValue(feature, value); } - public Object basicSet(EStructuralFeature feature, int index, Object value) - { - if (feature.isMany()) - { - return getList(feature).set(index, value); - } - - return basicSet(feature, value); - } - public void unset(EStructuralFeature feature) { setValue(feature, null); @@ -590,40 +575,11 @@ public abstract class AbstractCDORevision implements InternalCDORevision public Object getValue(EStructuralFeature feature) { - return convertValue(feature, basicGet(feature)); - } - - public Object setValue(EStructuralFeature feature, Object value) - { - return convertValue(feature, basicSet(feature, value)); - } - - protected Object convertValue(EStructuralFeature feature, Object value) - { - if (value == null) - { - value = feature.getDefaultValue(); - if (value != null) - { - CDOType type = CDOModelUtil.getType(feature); - value = type.convertToCDO(feature.getEType(), value); - } - } - else if (value == InternalCDORevision.NIL) - { - value = null; - } - - return value; - } - - protected Object basicGet(EStructuralFeature feature) - { int featureIndex = classInfo.getFeatureIndex(feature); return getValue(featureIndex); } - protected Object basicSet(EStructuralFeature feature, Object value) + public Object setValue(EStructuralFeature feature, Object value) { int featureIndex = classInfo.getFeatureIndex(feature); @@ -645,6 +601,32 @@ public abstract class AbstractCDORevision implements InternalCDORevision return getList(feature, 0); } + /** + * @since 3.0 + */ + public Object getValue(EStructuralFeature feature, int index) + { + if (feature.isMany()) + { + return getList(feature).get(index); + } + + return getValue(feature); + } + + /** + * @since 3.0 + */ + public Object setValue(EStructuralFeature feature, int index, Object value) + { + if (feature.isMany()) + { + return getList(feature).set(index, value); + } + + return setValue(feature, value); + } + public CDOList getList(EStructuralFeature feature, int size) { int featureIndex = classInfo.getFeatureIndex(feature); @@ -664,15 +646,6 @@ public abstract class AbstractCDORevision implements InternalCDORevision setValue(featureIndex, list); } - public void setListSize(EStructuralFeature feature, int size) - { - MoveableList<Object> list = getList(feature, size); - for (int j = list.size(); j < size; j++) - { - list.add(InternalCDOList.UNINITIALIZED); - } - } - protected abstract void initValues(EStructuralFeature[] allPersistentFeatures); protected abstract Object getValue(int featureIndex); @@ -684,60 +657,88 @@ public abstract class AbstractCDORevision implements InternalCDORevision return (CDOList)getValue(i); } - private void readValues(CDODataInput in) throws IOException + private void writeValues(CDODataOutput out, int referenceChunk) throws IOException { EClass owner = getEClass(); EStructuralFeature[] features = classInfo.getAllPersistentFeatures(); - initValues(features); for (int i = 0; i < features.length; i++) { - Object value; EStructuralFeature feature = features[i]; + Object value = getValue(i); + if (value == null) + { + // Feature is NOT set + out.writeByte(UNSET); + continue; + } + + // Feature IS set + if (value == CDORevisionData.NIL) + { + // Feature IS null + out.writeByte(SET_NULL); + continue; + } + + // Feature is NOT null + out.writeByte(SET_NOT_NULL); if (feature.isMany()) { - value = in.readCDOList(owner, feature); + CDOList list = (CDOList)value; + out.writeCDOList(owner, feature, list, referenceChunk); } else { - value = in.readCDOFeatureValue(feature); + checkNoFeatureMap(feature); + if (value != null && feature instanceof EReference) + { + value = out.getIDProvider().provideCDOID(value); + } + if (TRACER.isEnabled()) { - TRACER.format("Read feature {0}: {1}", feature.getName(), value); + TRACER.format("Writing feature {0}: {1}", feature.getName(), value); } - } - setValue(i, value); + out.writeCDOFeatureValue(feature, value); + } } } - private void writeValues(CDODataOutput out, int referenceChunk) throws IOException + private void readValues(CDODataInput in) throws IOException { EClass owner = getEClass(); EStructuralFeature[] features = classInfo.getAllPersistentFeatures(); + initValues(features); for (int i = 0; i < features.length; i++) { + Object value; EStructuralFeature feature = features[i]; + byte unsetState = in.readByte(); + switch (unsetState) + { + case UNSET: + continue; + + case SET_NULL: + setValue(i, CDORevisionData.NIL); + continue; + } + if (feature.isMany()) { - CDOList list = getValueAsList(i); - out.writeCDOList(owner, feature, list, referenceChunk); + value = in.readCDOList(owner, feature); } else { - checkNoFeatureMap(feature); - Object value = getValue(i); - if (value != null && feature instanceof EReference) - { - value = out.getIDProvider().provideCDOID(value); - } - + value = in.readCDOFeatureValue(feature); if (TRACER.isEnabled()) { - TRACER.format("Writing feature {0}: {1}", feature.getName(), value); + TRACER.format("Read feature {0}: {1}", feature.getName(), value); } - - out.writeCDOFeatureValue(feature, value); } + + setValue(i, value); } } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevision.java index bfd3fc1f75..878b2cf3b2 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevision.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevision.java @@ -32,11 +32,6 @@ import java.io.IOException; public interface InternalCDORevision extends CDORevision, CDORevisionData, CDOReferenceAdjustable { /** - * The equivalent of <code>EStructuralFeatureImpl.NIL</code> (i.e. explicit <code>null</code>). - */ - public static final Object NIL = new Object(); - - /** * @since 3.0 */ public CDOClassInfo getClassInfo(); @@ -80,16 +75,14 @@ public interface InternalCDORevision extends CDORevision, CDORevisionData, CDORe public Object setValue(EStructuralFeature feature, Object value); /** - * Use this method to retrieved {@link InternalCDORevision#NIL} object in some cases. - * - * @since 2.0 + * @since 3.0 */ - public Object basicGet(EStructuralFeature feature, int index); + public Object getValue(EStructuralFeature feature, int index); /** - * Use this method to retrieved {@link InternalCDORevision#NIL} object in some cases. + * @since 3.0 */ - public Object basicSet(EStructuralFeature feature, int index, Object value); + public Object setValue(EStructuralFeature feature, int index, Object value); public void setList(EStructuralFeature feature, InternalCDOList list); @@ -102,9 +95,6 @@ public interface InternalCDORevision extends CDORevision, CDORevisionData, CDORe */ public CDOList getList(EStructuralFeature feature, int size); - @Deprecated - public void setListSize(EStructuralFeature feature, int size); - /** * @since 3.0 */ diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java index f746d1ce97..653a459c2e 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java @@ -286,12 +286,6 @@ public class CDORevisionProxy implements HibernateProxy, InternalCDORevision, Se return li.getRevision().set(feature, index, value); } - @SuppressWarnings("deprecation") - public void setListSize(EStructuralFeature feature, int size) - { - li.getRevision().setListSize(feature, size); - } - public Object setValue(EStructuralFeature feature, Object value) { return li.getRevision().setValue(feature, value); @@ -317,14 +311,14 @@ public class CDORevisionProxy implements HibernateProxy, InternalCDORevision, Se li.getRevision().unset(feature); } - public Object basicGet(EStructuralFeature feature, int index) + public Object getValue(EStructuralFeature feature, int index) { - return li.getRevision().basicGet(feature, index); + return li.getRevision().getValue(feature, index); } - public Object basicSet(EStructuralFeature feature, int index, Object value) + public Object setValue(EStructuralFeature feature, int index, Object value) { - return li.getRevision().basicSet(feature, index, value); + return li.getRevision().setValue(feature, index, value); } public int hashCode(EStructuralFeature feature) diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java index 802eaaad15..de74d21eb5 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java @@ -546,12 +546,12 @@ public class RevisionHolderTest extends AbstractCDOTest throw new UnsupportedOperationException(); } - public Object basicGet(EStructuralFeature feature, int index) + public Object getValue(EStructuralFeature feature, int index) { throw new UnsupportedOperationException(); } - public Object basicSet(EStructuralFeature feature, int index, Object value) + public Object setValue(EStructuralFeature feature, int index, Object value) { throw new UnsupportedOperationException(); } diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_258933_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_258933_Test.java index 54a2601f98..4af89b028e 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_258933_Test.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_258933_Test.java @@ -44,12 +44,12 @@ public class Bugzilla_258933_Test extends AbstractCDOTest public void testBugzilla_258933() throws Exception { - testWithValue("level", NIL, false); + testWithValue("level", NIL, true); } public void testBugzilla_258933_SetToDefaultValue() throws Exception { - testWithValue("level", new Integer(10), false); + testWithValue("level", new Integer(10), true); } public void testBugzilla_258933_String() throws Exception @@ -59,7 +59,7 @@ public class Bugzilla_258933_Test extends AbstractCDOTest public void testBugzilla_258933_String_SetToDefaultValue() throws Exception { - testWithValue("settable", "Simon", false); + testWithValue("settable", "Simon", true); } public void testBugzilla_258933_String_SetToNull() throws Exception @@ -69,7 +69,7 @@ public class Bugzilla_258933_Test extends AbstractCDOTest public void testBugzilla_258933_String_unsettable() throws Exception { - testWithValue("settable", NIL, false); + testWithValue("settable", NIL, true); } public void testBugzilla_258933_String_SetToDefaultValue_unsettable() throws Exception @@ -133,26 +133,29 @@ public class Bugzilla_258933_Test extends AbstractCDOTest transaction.getResource("/test1").getContents().remove(0); assertEquals(isSet, instance.eIsSet(feature)); - instance.eUnset(feature); - assertEquals(false, instance.eIsSet(feature)); + if (feature.isUnsettable()) + { + instance.eUnset(feature); + assertEquals(false, instance.eIsSet(feature)); + } } public void testBugzilla_258278_List() throws Exception { { + Order order = getModel1Factory().createOrder(); + assertEquals(true, order.eIsSet(getModel1Package().getOrder_OrderDetails())); + CDOSession session = openSession(); session.getPackageRegistry().putEPackage(getModel1Package()); CDOTransaction transaction = session.openTransaction(); - Order order = getModel1Factory().createOrder(); - assertFalse(order.eIsSet(getModel1Package().getOrder_OrderDetails())); - CDOResource resource = transaction.createResource("/test1"); resource.getContents().add(order); - assertFalse(order.eIsSet(getModel1Package().getOrder_OrderDetails())); + assertEquals(true, order.eIsSet(getModel1Package().getOrder_OrderDetails())); transaction.commit(); - assertFalse(order.eIsSet(getModel1Package().getOrder_OrderDetails())); + assertEquals(true, order.eIsSet(getModel1Package().getOrder_OrderDetails())); session.close(); } @@ -162,10 +165,10 @@ public class Bugzilla_258933_Test extends AbstractCDOTest CDOTransaction transaction = session.openTransaction(); Order instance = (Order)transaction.getResource("/test1").getContents().get(0); - assertFalse(instance.eIsSet(getModel1Package().getOrder_OrderDetails())); + assertEquals(true, instance.eIsSet(getModel1Package().getOrder_OrderDetails())); transaction.getResource("/test1").getContents().remove(0); - assertFalse(instance.eIsSet(getModel1Package().getOrder_OrderDetails())); + assertEquals(true, instance.eIsSet(getModel1Package().getOrder_OrderDetails())); instance.getOrderDetails().add(getModel1Factory().createOrderDetail()); } @@ -193,14 +196,14 @@ public class Bugzilla_258933_Test extends AbstractCDOTest EAttribute level = efactory.createEAttribute(); level.setName("level"); level.setEType(epackage.getEInt()); - // level.setUnsettable(true); + level.setUnsettable(false); level.setDefaultValue(new Integer(10)); schoolBookEClass.getEStructuralFeatures().add(level); EAttribute settable = efactory.createEAttribute(); settable.setName("settable"); settable.setEType(epackage.getEString()); - // level.setUnsettable(true); + level.setUnsettable(false); settable.setDefaultValue(new String("Simon")); schoolBookEClass.getEStructuralFeatures().add(settable); 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 4639e9ce25..261d7350ec 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 @@ -325,18 +325,20 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec revision.setResourceID(cdoResource.cdoID()); } - EClass eClass = eClass(); - for (int i = 0; i < eClass.getFeatureCount(); i++) + if (cdoSettings != null) { - EStructuralFeature eFeature = cdoInternalDynamicFeature(i); - if (EMFUtil.isPersistent(eFeature)) + EClass eClass = eClass(); + for (int i = 0; i < eClass.getFeatureCount(); i++) { - Object setting = cdoBasicSettings() != null ? cdoSettings()[i] : null; - instanceToRevisionFeature(view, this, eFeature, setting); + EStructuralFeature eFeature = cdoInternalDynamicFeature(i); + if (EMFUtil.isPersistent(eFeature)) + { + instanceToRevisionFeature(view, this, eFeature, cdoSettings[i]); + } } - } - cdoSettings = null; + cdoSettings = null; + } } /** @@ -541,8 +543,8 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec @Override protected boolean eDynamicIsSet(int dynamicFeatureID, EStructuralFeature eFeature) { - return dynamicFeatureID < 0 ? eOpenIsSet(eFeature) : eSettingDelegate(eFeature).dynamicIsSet(this, eSettings(), - dynamicFeatureID); + return dynamicFeatureID < 0 ? eOpenIsSet(eFeature) : !EMFUtil.isPersistent(eFeature) ? eSettingDelegate(eFeature) + .dynamicIsSet(this, eSettings(), dynamicFeatureID) : eStore().isSet(this, eFeature); } /** @@ -772,7 +774,14 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec if (cdoSettings == null) { int size = eClass().getFeatureCount() - eStaticFeatureCount(); - cdoSettings = size == 0 ? ENO_SETTINGS : new Object[size]; + if (size == 0) + { + cdoSettings = ENO_SETTINGS; + } + else + { + cdoSettings = new Object[size]; + } } return cdoSettings; @@ -1223,7 +1232,8 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec protected Object getValue(InternalEObject eObject, int dynamicFeatureID) { - return ((CDOObjectImpl)eObject).cdoSettings()[dynamicFeatureID]; + Object value = ((CDOObjectImpl)eObject).cdoSettings()[dynamicFeatureID]; + return value; } protected EList<Object> getValueAsList(InternalEObject eObject, int dynamicFeatureID) @@ -1241,16 +1251,10 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec protected Object setValue(InternalEObject eObject, int dynamicFeatureID, Object newValue) { - Object eSettings[] = ((CDOObjectImpl)eObject).cdoSettings(); - - try - { - return eSettings[dynamicFeatureID]; - } - finally - { - eSettings[dynamicFeatureID] = newValue; - } + Object settings[] = ((CDOObjectImpl)eObject).cdoSettings(); + Object oldSetting = settings[dynamicFeatureID]; + settings[dynamicFeatureID] = newValue; + return oldSetting; } protected int eDynamicFeatureID(InternalEObject eObject, EStructuralFeature feature) @@ -1364,8 +1368,7 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec public EStructuralFeature getContainingFeature(InternalEObject eObject) { - // This should never be called. - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException("Should never be called"); } public EObject create(EClass eClass) @@ -1375,14 +1378,39 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec public boolean isSet(InternalEObject eObject, EStructuralFeature feature) { + if (!feature.isUnsettable()) + { + return true; + } + + Object[] settings = ((CDOObjectImpl)eObject).cdoBasicSettings(); + if (settings == null) + { + return false; + } + int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - return getValue(eObject, dynamicFeatureID) != null; + return settings[dynamicFeatureID] != null; } public void unset(InternalEObject eObject, EStructuralFeature feature) { + Object[] settings = ((CDOObjectImpl)eObject).cdoBasicSettings(); + if (settings == null) + { + // Is already unset + return; + } + int dynamicFeatureID = eDynamicFeatureID(eObject, feature); - setValue(eObject, dynamicFeatureID, null); + if (feature.isUnsettable()) + { + settings[dynamicFeatureID] = null; + } + else + { + settings[dynamicFeatureID] = feature.getDefaultValue(); + } } } 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 59bde6a455..5eefb6c953 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 @@ -19,6 +19,7 @@ import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOType; import org.eclipse.emf.cdo.common.revision.CDOList; import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionData; import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta; import org.eclipse.emf.cdo.eresource.CDOResource; @@ -37,7 +38,6 @@ import org.eclipse.emf.cdo.view.CDORevisionPrefetchingPolicy; import org.eclipse.emf.internal.cdo.bundle.OM; import org.eclipse.emf.internal.cdo.util.FSMUtil; -import org.eclipse.net4j.util.ImplementationError; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.emf.ecore.EClass; @@ -171,18 +171,30 @@ public final class CDOStore implements EStore view.getFeatureAnalyzer().preTraverseFeature(cdoObject, feature, index); InternalCDORevision revision = getRevisionForReading(cdoObject); - Object value = revision.basicGet(feature, index); + Object value = revision.getValue(feature, index); value = convertToEMF(eObject, revision, feature, index, value); view.getFeatureAnalyzer().postTraverseFeature(cdoObject, feature, index, value); return value; } - @Deprecated public boolean isSet(InternalEObject eObject, EStructuralFeature feature) { - // Should not be called - throw new ImplementationError(); + if (!feature.isUnsettable()) + { + return true; + } + + InternalCDOObject cdoObject = getCDOObject(eObject); + if (TRACER.isEnabled()) + { + TRACER.format("isSet({0}, {1})", cdoObject, feature); //$NON-NLS-1$ + } + + InternalCDORevision revision = getRevisionForReading(cdoObject); + + Object value = revision.getValue(feature, NO_INDEX); + return value != null; } public int size(InternalEObject eObject, EStructuralFeature feature) @@ -333,12 +345,12 @@ public final class CDOStore implements EStore // TODO Clarify feature maps if (feature instanceof EReference) { - Object oldValue = revision.basicGet(feature, index); + Object oldValue = revision.getValue(feature, index); oldValue = resolveProxy(revision, feature, index, oldValue); value = cdoObject.cdoView().convertObjectToID(value, true); } - Object oldValue = revision.basicSet(feature, index, value); + Object oldValue = revision.setValue(feature, index, value); oldValue = convertToEMF(eObject, revision, feature, index, oldValue); return oldValue; } @@ -354,8 +366,15 @@ public final class CDOStore implements EStore CDOFeatureDelta delta = new CDOUnsetFeatureDeltaImpl(feature); InternalCDORevision revision = getRevisionForWriting(cdoObject, delta); - // TODO Handle containment remove!!! - revision.set(feature, 0, null); + if (feature.isUnsettable()) + { + revision.unset(feature); + } + else + { + Object defaultValue = convertToCDO(cdoObject, feature, feature.getDefaultValue()); + revision.set(feature, NO_INDEX, defaultValue); + } } public void add(InternalEObject eObject, EStructuralFeature feature, int index, Object value) @@ -449,26 +468,18 @@ public final class CDOStore implements EStore */ public Object convertToCDO(InternalCDOObject object, EStructuralFeature feature, Object value) { + if (value == EStoreEObjectImpl.NIL) + { + return CDORevisionData.NIL; + } + if (value != null) { - if (value == EStoreEObjectImpl.NIL) - { - value = InternalCDORevision.NIL; - } - else if (feature instanceof EReference) + if (feature instanceof EReference) { // The EReference condition should be in the CDOType.convertToCDO. Since common package do not have access to // InternalCDOView I kept it here. value = view.convertObjectToID(value, true); - // TTT if (value instanceof InternalEObject) - // { - // CDOIDDangling id = view.convertDanglingObjectToID(object, feature, (InternalEObject)value); - // if (id != null) - // { - // // TODO assign at once from convertDanglingObjectToID() if dangling IDs are fully implemented - // value = id; - // } - // } } else if (FeatureMapUtil.isFeatureMap(feature)) { @@ -500,13 +511,13 @@ public final class CDOStore implements EStore public Object convertToEMF(EObject eObject, InternalCDORevision revision, EStructuralFeature feature, int index, Object value) { - if (value != null) + if (value == CDORevisionData.NIL) { - if (value == InternalCDORevision.NIL) - { - return EStoreEObjectImpl.NIL; - } + return EStoreEObjectImpl.NIL; + } + if (value != null) + { if (feature.isMany() && index != EStore.NO_INDEX) { value = resolveProxy(revision, feature, index, value); @@ -525,7 +536,6 @@ public final class CDOStore implements EStore } } - // TODO Clarify feature maps if (feature instanceof EReference) { value = convertIdToObject(view, eObject, feature, index, value); |