Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2018-07-27 13:04:07 +0000
committerEike Stepper2018-07-27 13:04:07 +0000
commit53a0d2faf5f64226aa17775f71ee63de2353895b (patch)
treebf13d4ab78f777c52a94a7e298a8e36bcdf77c3a /plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo
parent4fd0c31bf0c5eda3b91234583e335c626209a48d (diff)
downloadcdo-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.java55
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;
}
/**

Back to the top