diff options
author | Martin Fluegge | 2011-08-31 13:03:57 +0000 |
---|---|---|
committer | Martin Fluegge | 2011-08-31 13:03:57 +0000 |
commit | 1837d87cc1f72263d0ab4223ab6c96b455936028 (patch) | |
tree | 6ca347471376157fd56e02e220af4a3e3b4e8b58 | |
parent | 900ef951fadcbff547149e6d6e03b5ba506c7e9f (diff) | |
download | cdo-drops/R20110913-0010.tar.gz cdo-drops/R20110913-0010.tar.xz cdo-drops/R20110913-0010.zip |
[355923] [Legacy] Adapter notified with CDOLegacyAdapter drops/S20110907-0210drops/R20110913-0010drops/M20110909-0410drops/M20110902-0951drops/M20110826-0411
https://bugs.eclipse.org/bugs/show_bug.cgi?id=355923
4 files changed, 201 insertions, 142 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java index 42bfd49ed6..c564ab4eea 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java @@ -238,5 +238,6 @@ public abstract class AllConfigs extends ConfigTestSuite testClasses.add(Bugzilla_351393_Test.class); testClasses.add(Bugzilla_352303_Test.class); testClasses.add(Bugzilla_354395_Test.class); + testClasses.add(Bugzilla_355915_Test.class); } } diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_355915_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_355915_Test.java new file mode 100644 index 0000000000..669c1a13c0 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_355915_Test.java @@ -0,0 +1,184 @@ +/**
+ * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.bugzilla;
+
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.tests.AbstractCDOTest;
+import org.eclipse.emf.cdo.tests.model1.Customer;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.util.CDOUtil;
+import org.eclipse.emf.cdo.util.CommitException;
+import org.eclipse.emf.cdo.view.CDOAdapterPolicy;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.ecore.resource.Resource;
+
+import java.util.Collections;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Martin Fluegge
+ */
+public class Bugzilla_355915_Test extends AbstractCDOTest
+{
+ private static final String RESOURCE_PATH = "/test1";
+
+ private CountDownLatch latch;
+
+ @Override
+ protected void doSetUp() throws Exception
+ {
+ super.doSetUp();
+ latch = new CountDownLatch(1);
+ }
+
+ @CleanRepositoriesBefore
+ public void testInvalidationNotification() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOUtil.setLegacyModeDefault(true);
+
+ CDOTransaction transaction1 = session.openTransaction();
+ transaction1.options().setInvalidationNotificationEnabled(true);
+
+ CDOResource resource1 = transaction1.createResource(getResourcePath(RESOURCE_PATH));
+
+ // 1. Create a example model
+ Customer customer1 = getModel1Factory().createCustomer();
+ customer1.setName("Martin Fluegge");
+ customer1.setStreet("ABC Street 7");
+ customer1.setCity("Berlin");
+
+ TestAdapter adapter = new TestAdapter();
+ customer1.eAdapters().add(adapter);
+
+ resource1.getContents().add(customer1);
+ resource1.save(Collections.emptyMap());
+
+ Thread thread = new Thread(new Runnable()
+ {
+ public void run()
+ {
+ CDOSession session = openSession();
+ CDOUtil.setLegacyModeDefault(true);
+
+ CDOTransaction transaction2 = session.openTransaction();
+
+ Resource resource2 = transaction2.getResource(getResourcePath(RESOURCE_PATH));
+ Customer customer2 = (Customer)resource2.getContents().get(0);
+ customer2.setName("newName");
+
+ try
+ {
+ transaction2.commit();
+ }
+ catch (CommitException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ });
+
+ thread.start();
+ thread.join();
+
+ latch.await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
+ assertEquals(true, adapter.notified());
+ assertEquals(true, adapter.assertCorrectNotification());
+ }
+
+ @CleanRepositoriesBefore
+ public void testDeltaNotification() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOUtil.setLegacyModeDefault(true);
+
+ CDOTransaction transaction1 = session.openTransaction();
+ transaction1.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL);
+
+ CDOResource resource1 = transaction1.createResource(getResourcePath(RESOURCE_PATH));
+
+ // 1. Create a example model
+ Customer customer1 = getModel1Factory().createCustomer();
+ customer1.setName("Martin Fluegge");
+ customer1.setStreet("ABC Street 7");
+ customer1.setCity("Berlin");
+
+ TestAdapter adapter = new TestAdapter();
+ customer1.eAdapters().add(adapter);
+
+ resource1.getContents().add(customer1);
+ resource1.save(Collections.emptyMap());
+
+ Thread thread = new Thread(new Runnable()
+ {
+ public void run()
+ {
+ CDOSession session = openSession();
+ CDOUtil.setLegacyModeDefault(true);
+
+ CDOTransaction transaction2 = session.openTransaction();
+
+ Resource resource2 = transaction2.getResource(getResourcePath(RESOURCE_PATH));
+ Customer customer2 = (Customer)resource2.getContents().get(0);
+ customer2.setName("newName");
+
+ try
+ {
+ transaction2.commit();
+ }
+ catch (CommitException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ });
+
+ thread.start();
+ thread.join();
+
+ latch.await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
+ assertEquals(true, adapter.notified());
+ assertEquals(true, adapter.assertCorrectNotification());
+ }
+
+ /**
+ * @author Martin Fluegge
+ */
+ class TestAdapter extends AdapterImpl
+ {
+ private boolean assertCorrectNotification;
+
+ private boolean notified;
+
+ @Override
+ public void notifyChanged(Notification notification)
+ {
+ notified = true;
+ Object notifier = notification.getNotifier();
+ assertCorrectNotification = notifier instanceof Customer;
+ latch.countDown();
+ }
+
+ public boolean notified()
+ {
+ return notified;
+ }
+
+ public boolean assertCorrectNotification()
+ {
+ return assertCorrectNotification;
+ }
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDODeltaNotificationImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDODeltaNotificationImpl.java index 15dbd44a7e..87f9be731c 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDODeltaNotificationImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDODeltaNotificationImpl.java @@ -14,10 +14,12 @@ package org.eclipse.emf.internal.cdo.object; import org.eclipse.emf.cdo.CDODeltaNotification; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; +import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.util.ObjectNotFoundException; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.util.ECollections; +import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; @@ -33,152 +35,21 @@ public class CDODeltaNotificationImpl extends ENotificationImpl implements CDODe private CDORevisionDelta revisionDelta; public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, EStructuralFeature feature, Object oldValue, - Object newValue, boolean isSetChange) - { - super(notifier, eventType, feature, oldValue, newValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, EStructuralFeature feature, Object oldValue, - Object newValue, int position, boolean wasSet) - { - super(notifier, eventType, feature, oldValue, newValue, position, wasSet); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, EStructuralFeature feature, Object oldValue, - Object newValue, int position) - { - super(notifier, eventType, feature, oldValue, newValue, position); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, EStructuralFeature feature, Object oldValue, Object newValue) { - super(notifier, eventType, feature, oldValue, newValue); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, boolean oldBooleanValue, - boolean newBooleanValue, boolean isSetChange) - { - super(notifier, eventType, featureID, oldBooleanValue, newBooleanValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, boolean oldBooleanValue, - boolean newBooleanValue) - { - super(notifier, eventType, featureID, oldBooleanValue, newBooleanValue); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, byte oldByteValue, - byte newByteValue, boolean isSetChange) - { - super(notifier, eventType, featureID, oldByteValue, newByteValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, byte oldByteValue, - byte newByteValue) - { - super(notifier, eventType, featureID, oldByteValue, newByteValue); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, char oldCharValue, - char newCharValue, boolean isSetChange) - { - super(notifier, eventType, featureID, oldCharValue, newCharValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, char oldCharValue, - char newCharValue) - { - super(notifier, eventType, featureID, oldCharValue, newCharValue); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, double oldDoubleValue, - double newDoubleValue, boolean isSetChange) - { - super(notifier, eventType, featureID, oldDoubleValue, newDoubleValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, double oldDoubleValue, - double newDoubleValue) - { - super(notifier, eventType, featureID, oldDoubleValue, newDoubleValue); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, float oldFloatValue, - float newFloatValue, boolean isSetChange) - { - super(notifier, eventType, featureID, oldFloatValue, newFloatValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, float oldFloatValue, - float newFloatValue) - { - super(notifier, eventType, featureID, oldFloatValue, newFloatValue); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, int oldIntValue, - int newIntValue, boolean isSetChange) - { - super(notifier, eventType, featureID, oldIntValue, newIntValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, int oldIntValue, - int newIntValue) - { - super(notifier, eventType, featureID, oldIntValue, newIntValue); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, long oldLongValue, - long newLongValue, boolean isSetChange) - { - super(notifier, eventType, featureID, oldLongValue, newLongValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, long oldLongValue, - long newLongValue) - { - super(notifier, eventType, featureID, oldLongValue, newLongValue); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, Object oldValue, - Object newValue, boolean isSetChange) - { - super(notifier, eventType, featureID, oldValue, newValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, Object oldValue, - Object newValue, int position, boolean wasSet) - { - super(notifier, eventType, featureID, oldValue, newValue, position, wasSet); + super(getEObject(notifier), eventType, feature, oldValue, newValue); } public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, Object oldValue, Object newValue, int position) { - super(notifier, eventType, featureID, oldValue, newValue, position); + super(getEObject(notifier), eventType, featureID, oldValue, newValue, position); } public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, Object oldValue, Object newValue) { - super(notifier, eventType, featureID, oldValue, newValue); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, short oldShortValue, - short newShortValue, boolean isSetChange) - { - super(notifier, eventType, featureID, oldShortValue, newShortValue, isSetChange); - } - - public CDODeltaNotificationImpl(InternalEObject notifier, int eventType, int featureID, short oldShortValue, - short newShortValue) - { - super(notifier, eventType, featureID, oldShortValue, newShortValue); - } - - private InternalCDOObject getCDOObject() - { - return (InternalCDOObject)getNotifier(); + super(getEObject(notifier), eventType, featureID, oldValue, newValue); } @Override @@ -248,13 +119,15 @@ public class CDODeltaNotificationImpl extends ENotificationImpl implements CDODe { // Do not merge at all. See bug 317144. return false; + } - // if (eventType == REMOVE_MANY && newValue == null) - // { - // // Means that clear all was executed and no merging can appear - // return false; - // } - // - // return super.merge(notification); + private InternalCDOObject getCDOObject() + { + return (InternalCDOObject)CDOUtil.getCDOObject((EObject)getNotifier()); + } + + private static InternalEObject getEObject(InternalEObject notifier) + { + return (InternalEObject)CDOUtil.getEObject(notifier); } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOInvalidationNotificationImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOInvalidationNotificationImpl.java index 274121376f..6677cd406b 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOInvalidationNotificationImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOInvalidationNotificationImpl.java @@ -12,6 +12,7 @@ package org.eclipse.emf.internal.cdo.object; import org.eclipse.emf.cdo.CDOInvalidationNotification; +import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; @@ -25,7 +26,7 @@ public class CDOInvalidationNotificationImpl implements CDOInvalidationNotificat public CDOInvalidationNotificationImpl(EObject eObject) { - this.eObject = eObject; + this.eObject = CDOUtil.getEObject(eObject); } public Object getNotifier() |