Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2013-04-17 07:38:09 +0000
committerEike Stepper2013-04-17 07:38:09 +0000
commitf9cd044fd749901b8d5a6a72be95cf341ccbb41e (patch)
treeeae4de7d6318452038a1ed5dde22218185730260 /plugins/org.eclipse.emf.cdo/src
parenta43fe5c2dd9d0c43d4467ba58e8c19a79d196a31 (diff)
downloadcdo-f9cd044fd749901b8d5a6a72be95cf341ccbb41e.tar.gz
cdo-f9cd044fd749901b8d5a6a72be95cf341ccbb41e.tar.xz
cdo-f9cd044fd749901b8d5a6a72be95cf341ccbb41e.zip
[405850] CDORevision.get(feature, -1) should throw an
IndexOutOfBoundsException for many-valued features https://bugs.eclipse.org/bugs/show_bug.cgi?id=405850
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java26
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CommitIntegrityCheck.java14
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStoreImpl.java30
3 files changed, 45 insertions, 25 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
index 9f5a71a99f..91f85438d8 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
@@ -137,7 +137,6 @@ import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
-import org.eclipse.emf.ecore.InternalEObject.EStore;
import org.eclipse.emf.ecore.impl.EClassImpl.FeatureSubsetSupplier;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.Resource.Internal;
@@ -2379,12 +2378,27 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
{
InternalCDORevision cleanRevision = cleanRevisions.get(referencer);
- Object value = cleanRevision.get(reference, EStore.NO_INDEX);
- if (value instanceof CDOObject && value == referencedObject || //
- value instanceof CDOID && value.equals(referencedOID) || //
- value instanceof CDOList && ((CDOList)value).contains(referencedOID))
+ if (reference.isMany())
{
- continue;
+ CDOList list = cleanRevision.getList(reference);
+ if (list != null)
+ {
+ for (Object value : list)
+ {
+ if (value == referencedOID || value == referencedObject)
+ {
+ continue;
+ }
+ }
+ }
+ }
+ else
+ {
+ Object value = cleanRevision.getValue(reference);
+ if (value == referencedOID || value == referencedObject)
+ {
+ continue;
+ }
}
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CommitIntegrityCheck.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CommitIntegrityCheck.java
index 3ecce96036..ce8c6c1d56 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CommitIntegrityCheck.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CommitIntegrityCheck.java
@@ -36,7 +36,6 @@ import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject.EStore;
import org.eclipse.emf.spi.cdo.InternalCDOObject;
import org.eclipse.emf.spi.cdo.InternalCDOTransaction;
import org.eclipse.emf.spi.cdo.InternalCDOTransaction.InternalCDOCommitContext;
@@ -445,18 +444,21 @@ public class CommitIntegrityCheck
{
if (referencerClassInfo.hasPersistentOpposite(reference))
{
- Object value = cleanRev.get(reference, EStore.NO_INDEX);
- if (value != null)
+ if (reference.isMany())
{
- if (reference.isMany())
+ EList<?> list = cleanRev.getList(reference);
+ if (list != null)
{
- EList<?> list = (EList<?>)value;
for (Object element : list)
{
checkBidiRefTargetIncluded(element, referencer, reference.getName(), msgFrag);
}
}
- else
+ }
+ else
+ {
+ Object value = cleanRev.getValue(reference);
+ if (value != null)
{
checkBidiRefTargetIncluded(value, referencer, reference.getName(), msgFrag);
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStoreImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStoreImpl.java
index a40952ea04..504832ed0f 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStoreImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStoreImpl.java
@@ -205,23 +205,27 @@ public final class CDOStoreImpl implements CDOStore
TRACER.format("isSet({0}, {1})", cdoObject, feature); //$NON-NLS-1$
}
- if (!feature.isUnsettable())
+ InternalCDORevision revision = getRevisionForReading(cdoObject);
+ if (feature.isMany())
{
- if (feature.isMany())
- {
- InternalCDORevision revision = getRevisionForReading(cdoObject);
- CDOList list = revision.getList(feature);
- return list != null && !list.isEmpty();
- }
+ CDOList list = revision.getList(feature);
+ return list != null && !list.isEmpty();
+ }
- Object value = eObject.eGet(feature);
- Object defaultValue = feature.getDefaultValue();
- return !ObjectUtil.equals(value, defaultValue);
+ Object value = revision.getValue(feature);
+ if (feature.isUnsettable())
+ {
+ return value != null;
+ }
+
+ if (value == null)
+ {
+ return false;
}
- // TODO This get() may not work for lists, see above
- Object value = get(eObject, feature, NO_INDEX);
- return value != null;
+ value = convertToEMF(eObject, revision, feature, NO_INDEX, value);
+ Object defaultValue = feature.getDefaultValue();
+ return !ObjectUtil.equals(value, defaultValue);
}
}

Back to the top