[352204] [Legacy] Failing event PREPARE in state CLEAN : state machine issue with legacy mode 
https://bugs.eclipse.org/bugs/show_bug.cgi?id=352204
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 88b06ea..6a5f2a2 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
@@ -220,6 +220,7 @@
     testClasses.add(Bugzilla_337587_Test.class);
     testClasses.add(Bugzilla_338779_Test.class);
     testClasses.add(Bugzilla_338884_Test.class);
+    testClasses.add(Bugzilla_338921_Test.class);
     testClasses.add(Bugzilla_339313_Test.class);
     testClasses.add(Bugzilla_339461_Test.class);
     testClasses.add(Bugzilla_339908_Test.class);
@@ -235,18 +236,17 @@
     testClasses.add(Bugzilla_350027_Test.class);
     testClasses.add(Bugzilla_351067_Test.class);
     testClasses.add(Bugzilla_351096_Test.class);
-    testClasses.add(Bugzilla_338921_Test.class);
     testClasses.add(Bugzilla_351393_Test.class);
     testClasses.add(Bugzilla_351921_Test.class);
+    testClasses.add(Bugzilla_352204_Test.class);
     testClasses.add(Bugzilla_352303_Test.class);
     testClasses.add(Bugzilla_352832_Test.class);
     testClasses.add(Bugzilla_354395_Test.class);
     testClasses.add(Bugzilla_355915_Test.class);
     testClasses.add(Bugzilla_357441_Test.class);
-    testClasses.add(Bugzilla_359966_Test.class);
     testClasses.add(Bugzilla_359669_Test.class);
+    testClasses.add(Bugzilla_359966_Test.class);
     testClasses.add(Bugzilla_359992_Test.class);
     testClasses.add(Bugzilla_363287_Test.class);
-    testClasses.add(Bugzilla_352204_Test.class);
   }
 }
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_352204_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_352204_Test.java
index 06ee55a..bf3879f 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_352204_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_352204_Test.java
@@ -36,12 +36,12 @@
 {

   private static final String MODEL_LOCATION_PATH = "myResource";

 

-  public void testChangesImportWithNewLegacyElementsWithCustomFileAndReconstructSavePoints() throws Exception

+  public void testWithReconstructSavepoints() throws Exception

   {

     importWithNewLegacyElements(true);

   }

 

-  public void _testChangesImportWithNewLegacyElementsWithCustomFileAndNotReconstructSavePoints() throws Exception

+  public void testWithoutReconstructSavepoints() throws Exception

   {

     importWithNewLegacyElements(false);

   }

@@ -80,11 +80,6 @@
   {

     CDOSession session = openSession();

     CDOTransaction delegate = session.openTransaction();

-    if (fileForStoringChanges == null)

-    {

-      return new CDOPushTransaction(delegate);

-    }

-

     return new CDOPushTransaction(delegate, fileForStoringChanges, reconstructSavePoints);

   }

 

diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_359966_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_359966_Test.java
index 153f690..af716e1 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_359966_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_359966_Test.java
@@ -63,12 +63,12 @@
     checkDiagramAsCorrectlyBeenModified(transaction);

   }

 

-  public void testChangesImportWithNewLegacyElementsWithCustomFileAndReconstructSavePoints() throws Exception

+  public void testWithReconstructSavepoints() throws Exception

   {

     importWithNewLegacyElements(true);

   }

 

-  public void testChangesImportWithNewLegacyElementsWithCustomFileAndNotReconstructSavePoints() throws Exception

+  public void testWithoutReconstructSavepoints() throws Exception

   {

     importWithNewLegacyElements(false);

   }

@@ -120,11 +120,6 @@
   {

     CDOSession session = openSession();

     CDOTransaction delegate = session.openTransaction();

-    if (fileForStoringChanges == null)

-    {

-      return new CDOPushTransaction(delegate);

-    }

-

     return new CDOPushTransaction(delegate, fileForStoringChanges, reconstructSavePoints);

   }

 

diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java
index 3d8e63c..2abcad2 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java
@@ -1290,14 +1290,16 @@
   {
     if (!FSMUtil.isTransient(this))
     {
-      InternalCDOObject cdoObject = FSMUtil.adapt(object, cdoView());
+      InternalCDOTransaction transaction = cdoView().toTransaction();
+      InternalCDOObject cdoObject = FSMUtil.adapt(object, transaction);
 
-      if (CDOUtil.isLegacyObject(cdoObject) && cdoObject.cdoState() == CDOState.CLEAN)
+      if (CDOUtil.isLegacyObject(cdoObject) && FSMUtil.isClean(cdoObject))
       {
+        // Bug 352204
         return;
       }
 
-      attached(cdoObject, cdoView().toTransaction());
+      attached(cdoObject, transaction);
     }
   }
 
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 5d6cdd2..ec345ed 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
@@ -423,9 +423,9 @@
   protected void revisionToInstanceContainer()
   {
     Object containerID = revision.getContainerID();
-    EObject oldContainer = instance.eContainer();
     InternalEObject container = getEObjectFromPotentialID(view, null, containerID);
 
+    EObject oldContainer = instance.eContainer();
     if (oldContainer != container)
     {
       setInstanceContainer(container, revision.getContainingFeatureID());
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/FSMUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/FSMUtil.java
index 5a3922b..f951eef 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/FSMUtil.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/FSMUtil.java
@@ -63,6 +63,15 @@
     return state == CDOState.NEW;
   }
 
+  /**
+   * @since 4.1
+   */
+  public static boolean isClean(CDOObject object)
+  {
+    CDOState state = object.cdoState();
+    return state == CDOState.CLEAN;
+  }
+
   public static boolean isNative(EObject eObject)
   {
     return eObject instanceof CDOObjectImpl;