diff options
author | Esteban Dugueperoux | 2015-04-14 14:59:38 +0000 |
---|---|---|
committer | Eike Stepper | 2015-04-21 15:18:36 +0000 |
commit | ef5341796d793607c49d863f8607f3193ceb08ae (patch) | |
tree | ba62c35b935d3d0f4dcf8ec6a0435d7bb12f9b0a /plugins | |
parent | af343604a20443d7e3618bc5e294d1a1c2257a16 (diff) | |
download | cdo-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')
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); |