Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java45
1 files changed, 44 insertions, 1 deletions
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 df9815fe29..795f0a4c7d 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
@@ -942,7 +942,20 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
{
public void execute(InternalCDOObject object, CDOState state, CDOEvent event, Object NULL)
{
+ // Transfer the EObject values into a CDORevision.
object.cdoInternalPostAttach();
+
+ // Remember a copy of the new revision that can be used in case of a later rollback to reset the object.
+ Map<CDOID, CDORevision> attachedRevisions = ((InternalCDOTransaction)object.cdoView()).options().getAttachedRevisionsMap();
+ if (attachedRevisions != null)
+ {
+ InternalCDORevision revision = object.cdoRevision().copy();
+
+ // This revision copy contains the container reference AFTER the attachment.
+ // At rollback time it may have to be unset if this object is the root of an attached tree!
+ attachedRevisions.put(revision.getID(), revision);
+ }
+
changeState(object, CDOState.NEW);
}
}
@@ -1117,8 +1130,38 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent
{
public void execute(InternalCDOObject object, CDOState state, CDOEvent event, InternalCDOTransaction transaction)
{
- if (transaction.getLastSavepoint().isNewObject(object.cdoID()))
+ CDOID id = object.cdoID();
+ if (transaction.getLastSavepoint().isNewObject(id))
{
+ // Map<CDOID, CDORevision> attachedRevisions = transaction.options().getAttachedRevisionsMap();
+ // if (attachedRevisions != null)
+ // {
+ // InternalCDORevision revision = (InternalCDORevision)attachedRevisions.get(id);
+ // if (revision != null)
+ // {
+ // CDOID containerID = transaction.provideCDOID(revision.getContainerID());
+ // if (!CDOIDUtil.isNull(containerID) && !attachedRevisions.containsKey(containerID))
+ // {
+ // revision.setContainerID(null);
+ // revision.setContainingFeatureID(0);
+ // }
+ //
+ // CDOID resourceID = revision.getResourceID();
+ // if (!CDOIDUtil.isNull(resourceID) && !attachedRevisions.containsKey(resourceID))
+ // {
+ // revision.setResourceID(null);
+ // }
+ //
+ // object.cdoInternalSetRevision(revision);
+ //
+ // if (object instanceof CDOLegacyWrapper)
+ // {
+ // CDOLegacyWrapper wrapper = (CDOLegacyWrapper)object;
+ // wrapper.cdoInternalPostLoad();
+ // }
+ // }
+ // }
+
// postDetach() requires the object to be TRANSIENT, but listeners must not be notified at this point!
CDOState oldState = setStateQuietely(object, CDOState.TRANSIENT);
object.cdoInternalPostDetach(false);

Back to the top