Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2009-12-24 09:25:44 +0000
committerEike Stepper2009-12-24 09:25:44 +0000
commit9cd16f2959f5c13ab7916ffd951e84336f5115dc (patch)
treeda554e62c9a7cee3d9b0daca71559a59c2cff895
parent1903a820cb3f0330d95a7783c4683cc0d5b06c3b (diff)
downloadcdo-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
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionData.java28
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataInputImpl.java8
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/io/CDODataOutputImpl.java26
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java163
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevision.java18
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java14
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_258933_Test.java33
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java80
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java68
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);

Back to the top