diff options
author | Eike Stepper | 2013-04-17 07:38:09 +0000 |
---|---|---|
committer | Eike Stepper | 2013-04-17 07:38:09 +0000 |
commit | f9cd044fd749901b8d5a6a72be95cf341ccbb41e (patch) | |
tree | eae4de7d6318452038a1ed5dde22218185730260 /plugins/org.eclipse.emf.cdo/src | |
parent | a43fe5c2dd9d0c43d4467ba58e8c19a79d196a31 (diff) | |
download | cdo-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')
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); } } |