Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEsteban Dugueperoux2015-04-14 14:59:38 +0000
committerEike Stepper2015-04-21 15:18:36 +0000
commitef5341796d793607c49d863f8607f3193ceb08ae (patch)
treeba62c35b935d3d0f4dcf8ec6a0435d7bb12f9b0a /plugins
parentaf343604a20443d7e3618bc5e294d1a1c2257a16 (diff)
downloadcdo-ef5341796d793607c49d863f8607f3193ceb08ae.tar.gz
cdo-ef5341796d793607c49d863f8607f3193ceb08ae.tar.xz
cdo-ef5341796d793607c49d863f8607f3193ceb08ae.zip
[464036] Have CDOStaleReferencePolicyTests works also in legacy
- CDOStaleReferencePolicyTests tests failed in legacy because we doesn't call CDOLegacyAdapter.cdoInternalPostDetach(true) for CDOObjects in NEW state whose a direct or indirect parent has been remotely deleted. - The fix consists to call DetachRemoteTransition called for CDOObject in NEW state whose a direct or indirect parent (container or resource) has been remotely detached. - Update CDOStaleReferencePolicyTests to add assertions. Change-Id: Ic5e9b9c120626b195056408d3bc277b2c54e4636 Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=464036 Signed-off-by: Esteban Dugueperoux <esteban.dugueperoux@obeo.fr> Signed-off-by: Eike Stepper <stepper@esc-net.de>
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CDOStaleReferencePolicyTests.java22
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java1
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java35
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java30
4 files changed, 69 insertions, 19 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CDOStaleReferencePolicyTests.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CDOStaleReferencePolicyTests.java
index 79140e80a5..56500ab5a3 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CDOStaleReferencePolicyTests.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CDOStaleReferencePolicyTests.java
@@ -10,11 +10,14 @@
*/
package org.eclipse.emf.cdo.tests;
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.CDOState;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.model1.Category;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
@@ -28,7 +31,6 @@ import org.eclipse.emf.ecore.util.EcoreUtil;
*/
public class CDOStaleReferencePolicyTests extends AbstractCDOTest
{
-
private static final String RESOURCE_NAME = "test1.model1";
/**
@@ -48,8 +50,10 @@ public class CDOStaleReferencePolicyTests extends AbstractCDOTest
CDOTransaction transaction2 = session2.openTransaction();
CDOResource resource2 = transaction2.getResource(getResourcePath(RESOURCE_NAME));
Company companyFromTx2 = (Company)resource2.getContents().get(0);
+ CDOObject companyCDOObjectFromTx2 = CDOUtil.getCDOObject(companyFromTx2);
Category categoryFromTx2 = getModel1Factory().createCategory();
+ // CDOObject categoryCDOObjectFromTx2 = CDOUtil.getCDOObject(categoryFromTx2);
companyFromTx2.getCategories().add(categoryFromTx2);
EcoreUtil.remove(companyFromTx1);
@@ -58,7 +62,12 @@ public class CDOStaleReferencePolicyTests extends AbstractCDOTest
EObject eContainer = categoryFromTx2.eContainer();
assertNull(eContainer);
- // FIXME/TODO : CDOState should be at TRANSIENT and not NEW
+ assertEquals(CDOState.INVALID_CONFLICT, companyCDOObjectFromTx2.cdoState());
+ // assertEquals(CDOState.PROXY, categoryCDOObjectFromTx2.cdoState());
+ // Assert.assertTrue(transaction2.hasConflict());
+ // transaction2.rollback();
+ // assertEquals(CDOState.INVALID, companyCDOObjectFromTx2.cdoState());
+ // assertEquals(CDOState.TRANSIENT, categoryCDOObjectFromTx2.cdoState());
}
/**
@@ -77,6 +86,7 @@ public class CDOStaleReferencePolicyTests extends AbstractCDOTest
CDOResource resource2 = transaction2.getResource(getResourcePath(RESOURCE_NAME));
Company companyFromTx2 = getModel1Factory().createCompany();
+ // CDOObject companyCDOObjectFromTx2 = CDOUtil.getCDOObject(companyFromTx2);
resource2.getContents().add(companyFromTx2);
resource1.delete(null);
@@ -85,7 +95,11 @@ public class CDOStaleReferencePolicyTests extends AbstractCDOTest
Resource resource = companyFromTx2.eResource();
assertNull(resource);
- // FIXME/TODO : CDOState should be at TRANSIENT and not NEW
+ assertEquals(CDOState.INVALID_CONFLICT, resource2.cdoState());
+ // assertEquals(CDOState.PROXY, companyCDOObjectFromTx2.cdoState());
+ // Assert.assertTrue(transaction2.hasConflict());
+ // transaction2.rollback();
+ // assertEquals(CDOState.INVALID, resource2.cdoState());
+ // assertEquals(CDOState.TRANSIENT, companyCDOObjectFromTx2.cdoState());
}
-
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java
index 78f95a979f..c2ad3d0bd5 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDOLegacyWrapper.java
@@ -275,6 +275,7 @@ public abstract class CDOLegacyWrapper extends CDOObjectWrapper
if (remote)
{
setInstanceContainer(null, eContainerFeatureID());
+ setInstanceResource(null);
return;
}
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 4f39d6726b..5fa71a93bb 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
@@ -150,6 +150,7 @@ 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;
import org.eclipse.emf.ecore.impl.EClassImpl.FeatureSubsetSupplier;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.Resource.Internal;
@@ -2466,6 +2467,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
Set<CDOObject> remotelyDetachedObjects = getObjects(allDetachedObjects);
removeCrossReferences(remotelyDetachedObjects, getDirtyObjects().values());
removeCrossReferences(remotelyDetachedObjects, getNewObjects().values());
+ invalidateNewChildrenOfRemotelyDetached(remotelyDetachedObjects);
}
// Bug 290032 - Sticky views
@@ -2488,6 +2490,39 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
return conflicts;
}
+ private void invalidateNewChildrenOfRemotelyDetached(Set<CDOObject> remotelyDetachedObjects)
+ {
+ // Test EObject.eInternalContainer()/eDirectResource() implicit references to have them return null in legacy for
+ // objects in NEW state whose a direct/indirect parent has been remotelly detached
+ for (CDOObject referencer : getNewObjects().values())
+ {
+
+ if (CDOUtil.isLegacyObject(referencer))
+ {
+ InternalEObject referencerInternalEObject = (InternalEObject)referencer;
+ InternalEObject eContainer = referencerInternalEObject.eInternalContainer();
+ if (eContainer != null)
+ {
+ CDOObject containerCDOObject = CDOUtil.getCDOObject(eContainer);
+ if (remotelyDetachedObjects.contains(containerCDOObject))
+ {
+ CDOStateMachine.INSTANCE.invalidate((InternalCDOObject)referencer, referencer.cdoRevision());
+ }
+ }
+
+ Internal eDirectResource = referencerInternalEObject.eDirectResource();
+ if (eDirectResource instanceof CDOResource)
+ {
+ CDOObject cdoResource = (CDOObject)eDirectResource;
+ if (remotelyDetachedObjects.contains(cdoResource))
+ {
+ CDOStateMachine.INSTANCE.invalidate((InternalCDOObject)referencer, referencer.cdoRevision());
+ }
+ }
+ }
+ }
+ }
+
private Set<CDOObject> getObjects(Collection<? extends CDOIdentifiable> identifiables)
{
Set<CDOObject> result = new HashSet<CDOObject>();
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java
index 4804bf4b0c..09465fb490 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java
@@ -121,7 +121,7 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
init(CDOState.NEW, CDOEvent.REATTACH, FAIL);
init(CDOState.NEW, CDOEvent.READ, IGNORE);
init(CDOState.NEW, CDOEvent.WRITE, new WriteNewTransition());
- init(CDOState.NEW, CDOEvent.INVALIDATE, FAIL);
+ init(CDOState.NEW, CDOEvent.INVALIDATE, DetachRemoteTransition.INSTANCE);
init(CDOState.NEW, CDOEvent.DETACH_REMOTE, FAIL);
init(CDOState.NEW, CDOEvent.COMMIT, new CommitTransition(false));
init(CDOState.NEW, CDOEvent.ROLLBACK, FAIL);
@@ -734,8 +734,8 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
*
* @author Caspar De Groot
*/
- private final class ReattachTransition implements
- ITransition<CDOState, CDOEvent, InternalCDOObject, InternalCDOTransaction>
+ private final class ReattachTransition
+ implements ITransition<CDOState, CDOEvent, InternalCDOObject, InternalCDOTransaction>
{
public void execute(InternalCDOObject object, CDOState state, CDOEvent event, InternalCDOTransaction transaction)
{
@@ -834,8 +834,8 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
/**
* @author Eike Stepper
*/
- private static final class DetachTransition implements
- ITransition<CDOState, CDOEvent, InternalCDOObject, List<InternalCDOObject>>
+ private static final class DetachTransition
+ implements ITransition<CDOState, CDOEvent, InternalCDOObject, List<InternalCDOObject>>
{
public void execute(InternalCDOObject object, CDOState state, CDOEvent event,
List<InternalCDOObject> objectsToDetach)
@@ -864,8 +864,8 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
/**
* @author Eike Stepper
*/
- final private class CommitTransition implements
- ITransition<CDOState, CDOEvent, InternalCDOObject, CommitTransactionResult>
+ final private class CommitTransition
+ implements ITransition<CDOState, CDOEvent, InternalCDOObject, CommitTransactionResult>
{
public CommitTransition(boolean useDeltas)
{
@@ -924,8 +924,8 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
/**
* @author Eike Stepper
*/
- private static abstract class AbstractWriteTransition implements
- ITransition<CDOState, CDOEvent, InternalCDOObject, FeatureDeltaAndResult>
+ private static abstract class AbstractWriteTransition
+ implements ITransition<CDOState, CDOEvent, InternalCDOObject, FeatureDeltaAndResult>
{
public void execute(InternalCDOObject object, CDOState state, CDOEvent event,
FeatureDeltaAndResult featureDeltaAndResult)
@@ -952,8 +952,8 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
private final class WriteNewTransition extends AbstractWriteTransition
{
@Override
- protected Object execute(InternalCDOObject object, InternalCDOTransaction transaction,
- CDOFeatureDelta featureDelta, InternalCDORevision revision)
+ protected Object execute(InternalCDOObject object, InternalCDOTransaction transaction, CDOFeatureDelta featureDelta,
+ InternalCDORevision revision)
{
Object result = null;
if (featureDelta != null)
@@ -991,8 +991,8 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
}
@Override
- protected Object execute(InternalCDOObject object, InternalCDOTransaction transaction,
- CDOFeatureDelta featureDelta, InternalCDORevision cleanRevision)
+ protected Object execute(InternalCDOObject object, InternalCDOTransaction transaction, CDOFeatureDelta featureDelta,
+ InternalCDORevision cleanRevision)
{
InternalCDORevision revision = cleanRevision.copy();
@@ -1026,8 +1026,8 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
private final class RewriteTransition extends AbstractWriteTransition
{
@Override
- protected Object execute(InternalCDOObject object, InternalCDOTransaction transaction,
- CDOFeatureDelta featureDelta, InternalCDORevision revision)
+ protected Object execute(InternalCDOObject object, InternalCDOTransaction transaction, CDOFeatureDelta featureDelta,
+ InternalCDORevision revision)
{
Map<InternalCDOObject, InternalCDORevision> cleanRevisions = transaction.getCleanRevisions();
InternalCDORevision cleanRevision = cleanRevisions.get(object);

Back to the top