Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2013-01-22 01:16:05 -0500
committerEike Stepper2013-01-22 01:16:05 -0500
commit4eec187d7acae81e8b2355741feee86f073cfd5c (patch)
tree1cb01623ad0ebc84d58f178869d424c43df01565
parent6f194b34c6732fccf4f3903744f47b5935d5f494 (diff)
downloadcdo-4eec187d7acae81e8b2355741feee86f073cfd5c.tar.gz
cdo-4eec187d7acae81e8b2355741feee86f073cfd5c.tar.xz
cdo-4eec187d7acae81e8b2355741feee86f073cfd5c.zip
[397822] [Legacy] REMOVE_MANY events are not transferred correctly to
CDORevision https://bugs.eclipse.org/bugs/show_bug.cgi?id=397822
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_397822_Test.java75
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyAdapter.java55
2 files changed, 111 insertions, 19 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_397822_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_397822_Test.java
index 5c5e41fb5a..5074548343 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_397822_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_397822_Test.java
@@ -7,6 +7,7 @@
*
* Contributors:
* Eike Stepper - initial API and implementation
+ * Christian W. Damus (CEA) - additional tests for REMOVE_MANY notifications
*/
package org.eclipse.emf.cdo.tests.bugzilla;
@@ -16,16 +17,19 @@ import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDOListFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.internal.common.revision.delta.CDOClearFeatureDeltaImpl;
import org.eclipse.emf.cdo.internal.common.revision.delta.CDORemoveFeatureDeltaImpl;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
-import org.eclipse.emf.cdo.tests.config.IModelConfig;
+import org.eclipse.emf.cdo.tests.model5.GenListOfInt;
import org.eclipse.emf.cdo.tests.model6.UnorderedList;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
import java.util.Arrays;
import java.util.List;
@@ -37,8 +41,7 @@ import java.util.List;
*/
public class Bugzilla_397822_Test extends AbstractCDOTest
{
- @Skips(IModelConfig.CAPABILITY_LEGACY)
- public void testRemoveAll() throws Exception
+ public void testRemoveAll_containment() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
@@ -65,7 +68,7 @@ public class Bugzilla_397822_Test extends AbstractCDOTest
CDORevisionDelta revisionDelta = transaction.getRevisionDeltas().get(id);
EReference reference = getModel6Package().getUnorderedList_Contained();
- assertRevisionDeltaContainsListChanges(revisionDelta //
+ assertRevisionDeltaContainsListChanges(revisionDelta, reference //
// removal of elem4 at index 3
, new CDORemoveFeatureDeltaImpl(reference, 3)
@@ -79,11 +82,69 @@ public class Bugzilla_397822_Test extends AbstractCDOTest
);
}
- private void assertRevisionDeltaContainsListChanges(CDORevisionDelta revisionDelta,
+ public void testRemoveAll_attribute() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("/resource1"));
+
+ GenListOfInt intHolder = getModel5Factory().createGenListOfInt();
+ CDOObject cdoObject = CDOUtil.getCDOObject(intHolder);
+
+ EList<Integer> list = intHolder.getElements();
+ list.addAll(Arrays.asList(1, 2, 3, 4, 5));
+
+ resource.getContents().add(intHolder);
+ transaction.commit();
+
+ list.removeAll(Arrays.asList(2, 4));
+
+ CDOID id = cdoObject.cdoID();
+ CDORevisionDelta revisionDelta = transaction.getRevisionDeltas().get(id);
+ EAttribute attribute = getModel5Package().getGenListOfInt_Elements();
+
+ assertRevisionDeltaContainsListChanges(revisionDelta, attribute //
+ // removal of '4' at index 3
+ , new CDORemoveFeatureDeltaImpl(attribute, 3)
+
+ // removal of '2' at index 1
+ , new CDORemoveFeatureDeltaImpl(attribute, 1)
+
+ );
+ }
+
+ public void testClear_attribute() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("/resource1"));
+
+ GenListOfInt intHolder = getModel5Factory().createGenListOfInt();
+ CDOObject cdoObject = CDOUtil.getCDOObject(intHolder);
+
+ EList<Integer> list = intHolder.getElements();
+ list.addAll(Arrays.asList(1, 2, 3, 4, 5));
+
+ resource.getContents().add(intHolder);
+ transaction.commit();
+
+ list.clear();
+
+ CDOID id = cdoObject.cdoID();
+ CDORevisionDelta revisionDelta = transaction.getRevisionDeltas().get(id);
+ EAttribute attribute = getModel5Package().getGenListOfInt_Elements();
+
+ assertRevisionDeltaContainsListChanges(revisionDelta, attribute //
+ // entire list was cleared
+ , new CDOClearFeatureDeltaImpl(attribute)
+
+ );
+ }
+
+ private void assertRevisionDeltaContainsListChanges(CDORevisionDelta revisionDelta, EStructuralFeature feature,
CDOFeatureDelta... expectedListChanges)
{
- EReference unorderedList_Contained = getModel6Package().getUnorderedList_Contained();
- CDOFeatureDelta featureDelta = revisionDelta.getFeatureDelta(unorderedList_Contained);
+ CDOFeatureDelta featureDelta = revisionDelta.getFeatureDelta(feature);
assertInstanceOf(CDOListFeatureDelta.class, featureDelta);
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyAdapter.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyAdapter.java
index 010142d1bd..5fd93bef6f 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyAdapter.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyAdapter.java
@@ -8,6 +8,7 @@
* Contributors:
* Eike Stepper - initial API and implementation
* Martin Fluegge - bug 247226: Transparently support legacy models
+ * Christian W. Damus (CEA) - bug 397822: handling of REMOVE_MANY notifications
*/
package org.eclipse.emf.internal.cdo.object;
@@ -122,7 +123,14 @@ public class CDOLegacyAdapter extends CDOLegacyWrapper implements Adapter.Intern
break;
case Notification.REMOVE_MANY:
- notifyRemoveMany(feature, oldValue);
+ // newValue will be null if the entire list was cleared.
+ // Otherwise it is the array of indices that were removed
+ if (newValue != null && !(newValue instanceof int[]))
+ {
+ throw new IllegalArgumentException("New value of REMOVE_MANY notification is not an array of indices.");
+ }
+
+ notifyRemoveMany(feature, (int[])newValue);
break;
}
@@ -239,24 +247,47 @@ public class CDOLegacyAdapter extends CDOLegacyWrapper implements Adapter.Intern
}
}
- protected void notifyRemoveMany(EStructuralFeature feature, Object oldValue)
+ protected void notifyRemoveMany(EStructuralFeature feature, int[] positions)
{
CDOStore store = view.getStore();
- @SuppressWarnings("unchecked")
- List<Object> list = (List<Object>)oldValue;
- for (int i = list.size() - 1; i >= 0; --i)
+ if (positions == null)
+ {
+ // The list was cleared
+ Object[] oldChildren = store.toArray(instance, feature);
+ store.clear(instance, feature);
+ if (feature instanceof EReference)
+ {
+ EReference reference = (EReference)feature;
+ if (reference.isContainment())
+ {
+ for (int i = 0; i < oldChildren.length; i++)
+ {
+ Object oldChild = oldChildren[i];
+ if (oldChild instanceof InternalEObject)
+ {
+ setContainer(store, (InternalEObject)oldChild, null, 0);
+ }
+ }
+ }
+ }
+ }
+ else
{
- Object oldChild = store.remove(instance, feature, i);
- if (oldChild instanceof InternalEObject)
+ // Select indices were removed from the list
+ for (int i = positions.length - 1; i >= 0; --i)
{
- if (feature instanceof EReference)
+ Object oldChild = store.remove(instance, feature, positions[i]);
+ if (oldChild instanceof InternalEObject)
{
- EReference reference = (EReference)feature;
- if (reference.isContainment())
+ if (feature instanceof EReference)
{
- InternalEObject oldChildEObject = (InternalEObject)oldChild;
- setContainer(store, oldChildEObject, null, 0);
+ EReference reference = (EReference)feature;
+ if (reference.isContainment())
+ {
+ InternalEObject oldChildEObject = (InternalEObject)oldChild;
+ setContainer(store, oldChildEObject, null, 0);
+ }
}
}
}

Back to the top