diff options
author | Eike Stepper | 2018-07-27 13:04:07 +0000 |
---|---|---|
committer | Eike Stepper | 2018-07-27 13:04:07 +0000 |
commit | 53a0d2faf5f64226aa17775f71ee63de2353895b (patch) | |
tree | bf13d4ab78f777c52a94a7e298a8e36bcdf77c3a /plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo | |
parent | 4fd0c31bf0c5eda3b91234583e335c626209a48d (diff) | |
download | cdo-53a0d2faf5f64226aa17775f71ee63de2353895b.tar.gz cdo-53a0d2faf5f64226aa17775f71ee63de2353895b.tar.xz cdo-53a0d2faf5f64226aa17775f71ee63de2353895b.zip |
[537081] Cannot unset a Reference with external EObject as values
https://bugs.eclipse.org/bugs/show_bug.cgi?id=537081
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo')
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStoreImpl.java | 55 |
1 files changed, 38 insertions, 17 deletions
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 ac9b2cc975..933b658908 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 @@ -329,18 +329,39 @@ public final class CDOStoreImpl implements CDOStore TRACER.format("contains({0}, {1}, {2})", cdoObject, feature, value); //$NON-NLS-1$ } - Object convertedValue = convertToCDO(cdoObject, feature, value); + // Don't use CDORevision.contains() for EReference features because + // CDOIDExternal isn't converted to an EObject and, hence, fails to compare + // properly to an external EObject. InternalCDORevision revision = readRevision(cdoObject); - boolean result = revision.contains(feature, convertedValue); + int size = revision.size(feature); - // Special handling of detached (TRANSIENT) objects, see bug 354395 - if (!result && value != convertedValue && value instanceof EObject) + if (value == null) { - result = revision.contains(feature, value); + for (int i = 0; i < size; i++) + { + Object element = revision.get(feature, i); + Object emfElement = convertToEMF(eObject, revision, feature, i, element); + if (emfElement == null) + { + return true; + } + } + } + else + { + for (int i = 0; i < size; i++) + { + Object element = revision.get(feature, i); + Object emfElement = convertToEMF(eObject, revision, feature, i, element); + if (value.equals(emfElement)) + { + return true; + } + } } - return result; + return false; } finally { @@ -753,26 +774,26 @@ public final class CDOStoreImpl implements CDOStore */ public Object resolveProxy(InternalCDORevision revision, EStructuralFeature feature, int index, Object value) { - synchronized (view.getViewMonitor()) + if (value instanceof CDOElementProxy) { - view.lockView(); - - try + synchronized (view.getViewMonitor()) { - if (value instanceof CDOElementProxy) + view.lockView(); + + try { // Resolve proxy CDOElementProxy proxy = (CDOElementProxy)value; value = view.getSession().resolveElementProxy(revision, feature, index, proxy.getIndex()); } - - return value; - } - finally - { - view.unlockView(); + finally + { + view.unlockView(); + } } } + + return value; } /** |