Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon McDuff2009-01-03 14:58:58 +0000
committerSimon McDuff2009-01-03 14:58:58 +0000
commit0d9b2379d3594badad1609b1f992da178b4b578f (patch)
treeb96a4b400a6cdcb299cc97b86b56475ec250036b /plugins/org.eclipse.emf.cdo
parenta6fdbd5a8cd79603ceacdb6553727b87ac2a4c07 (diff)
downloadcdo-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')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java55
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java123
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/ModelUtil.java9
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)

Back to the top