Author: aadamchik
Date: Mon Sep 25 21:51:20 2006
New Revision: 449903

URL: http://svn.apache.org/viewvc?view=rev&rev=449903
Log:
CAY-663 The fix was to rewrite sync event algorithm 

Modified:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextMergeHandler.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsTst.java

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java?view=diff&rev=449903&r1=449902&r2=449903
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java
 Mon Sep 25 21:51:20 2006
@@ -61,17 +61,7 @@
 
         // relationship property
         if (property instanceof ArcProperty) {
-
-            try {
-                handleArcPropertyChange(
-                        object,
-                        (ArcProperty) property,
-                        oldValue,
-                        newValue);
-            }
-            finally {
-                setArcChangeInProcess(false);
-            }
+            handleArcPropertyChange(object, (ArcProperty) property, oldValue, 
newValue);
         }
         // simple property
         else {
@@ -85,35 +75,36 @@
             Object oldValue,
             Object newValue) {
 
-        boolean arcChangeInProcess = isArchChangeInProcess();
+        if (isArchChangeInProcess()) {
+            return;
+        }
 
         // prevent reverse actions down the stack
         setArcChangeInProcess(true);
 
-        if (oldValue instanceof Persistent) {
-            context.getGraphManager().arcDeleted(
-                    object.getObjectId(),
-                    ((Persistent) oldValue).getObjectId(),
-                    property.getName());
+        try {
+            if (oldValue instanceof Persistent) {
+                context.getGraphManager().arcDeleted(
+                        object.getObjectId(),
+                        ((Persistent) oldValue).getObjectId(),
+                        property.getName());
 
-            if (!arcChangeInProcess) {
                 unsetReverse(property, object, (Persistent) oldValue);
+                markAsDirty(object);
             }
 
-            markAsDirty(object);
-        }
-
-        if (newValue instanceof Persistent) {
-            context.getGraphManager().arcCreated(
-                    object.getObjectId(),
-                    ((Persistent) newValue).getObjectId(),
-                    property.getName());
+            if (newValue instanceof Persistent) {
+                context.getGraphManager().arcCreated(
+                        object.getObjectId(),
+                        ((Persistent) newValue).getObjectId(),
+                        property.getName());
 
-            if (!arcChangeInProcess) {
                 setReverse(property, object, (Persistent) newValue);
+                markAsDirty(object);
             }
-
-            markAsDirty(object);
+        }
+        finally {
+            setArcChangeInProcess(false);
         }
     }
 

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextMergeHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextMergeHandler.java?view=diff&rev=449903&r1=449902&r2=449903
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextMergeHandler.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContextMergeHandler.java
 Mon Sep 25 21:51:20 2006
@@ -24,6 +24,7 @@
 import org.apache.cayenne.graph.GraphEvent;
 import org.apache.cayenne.property.ArcProperty;
 import org.apache.cayenne.property.ClassDescriptor;
+import org.apache.cayenne.property.CollectionProperty;
 import org.apache.cayenne.property.Property;
 import org.apache.cayenne.util.Util;
 
@@ -76,7 +77,6 @@
         // For now we will simply merge the changes, and keep the context dirty
 
         if (shouldProcessEvent(e)) {
-            final boolean hadChanges = 
context.internalGraphManager().hasChanges();
 
             runWithEventsDisabled(new Runnable() {
 
@@ -85,11 +85,6 @@
                     if (e.getDiff() != null) {
                         e.getDiff().apply(CayenneContextMergeHandler.this);
                     }
-
-                    if (!hadChanges) {
-                        
context.internalGraphManager().stateLog.graphCommitted();
-                        context.internalGraphManager().reset();
-                    }
                 }
             });
 
@@ -160,14 +155,11 @@
     }
 
     public void nodeCreated(Object nodeId) {
-        context.createNewObject((ObjectId) nodeId);
+        // ignore
     }
 
     public void nodeRemoved(Object nodeId) {
-        Object object = context.internalGraphManager().getNode(nodeId);
-        if (object != null) {
-            context.deleteObject((Persistent) object);
-        }
+        context.getGraphManager().unregisterNode(nodeId);
     }
 
     public void nodePropertyChanged(
@@ -184,11 +176,6 @@
             if (Util.nullSafeEquals(p.readPropertyDirectly(object), oldValue)) 
{
 
                 p.writePropertyDirectly(object, oldValue, newValue);
-                context.internalGraphAction().handleSimplePropertyChange(
-                        (Persistent) object,
-                        property,
-                        oldValue,
-                        newValue);
             }
         }
     }
@@ -199,7 +186,16 @@
 
         Object source = context.internalGraphManager().getNode(nodeId);
         if (source == null) {
-            source = context.createFault((ObjectId) nodeId);
+            // no need to connect non-existent object
+            return;
+        }
+
+        // TODO (Andrus, 10/17/2005) - check for local modifications to avoid
+        // overwriting...
+
+        ArcProperty p = (ArcProperty) propertyForId(nodeId, arcId.toString());
+        if (p.isFault(source)) {
+            return;
         }
 
         Object target = context.internalGraphManager().getNode(targetNodeId);
@@ -207,17 +203,14 @@
             target = context.createFault((ObjectId) targetNodeId);
         }
 
-        // TODO (Andrus, 10/17/2005) - check for local modifications to avoid
-        // overwriting...
-
-        ArcProperty p = (ArcProperty) propertyForId(nodeId, arcId.toString());
-       
+        context.internalGraphAction().setArcChangeInProcess(true);
         try {
-            context.internalGraphAction().handleArcPropertyChange(
-                    (Persistent) source,
-                    p,
-                    null,
-                    target);
+            if (p instanceof CollectionProperty) {
+                ((CollectionProperty) p).addTarget(source, target, false);
+            }
+            else {
+                p.writePropertyDirectly(source, null, target);
+            }
         }
         finally {
             context.internalGraphAction().setArcChangeInProcess(false);
@@ -231,7 +224,14 @@
 
         Object source = context.internalGraphManager().getNode(nodeId);
         if (source == null) {
-            source = context.createFault((ObjectId) nodeId);
+            // no need to disconnect non-existent object
+            return;
+        }
+
+        // (see "TODO" in 'arcCreated')
+        ArcProperty p = (ArcProperty) propertyForId(nodeId, arcId.toString());
+        if (p.isFault(source)) {
+            return;
         }
 
         Object target = context.internalGraphManager().getNode(targetNodeId);
@@ -239,16 +239,14 @@
             target = context.createFault((ObjectId) targetNodeId);
         }
 
-        // (see "TODO" in 'arcCreated')
-        ArcProperty p = (ArcProperty) propertyForId(nodeId, arcId.toString());
-        p.writePropertyDirectly(source, target, null);
-
+        context.internalGraphAction().setArcChangeInProcess(true);
         try {
-            context.internalGraphAction().handleArcPropertyChange(
-                    (Persistent) source,
-                    p,
-                    target,
-                    null);
+            if (p instanceof CollectionProperty) {
+                ((CollectionProperty) p).removeTarget(source, target, false);
+            }
+            else {
+                p.writePropertyDirectly(source, target, null);
+            }
         }
         finally {
             context.internalGraphAction().setArcChangeInProcess(false);

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsTst.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsTst.java?view=diff&rev=449903&r1=449902&r2=449903
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsTst.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsTst.java
 Mon Sep 25 21:51:20 2006
@@ -44,6 +44,72 @@
                 .getAccessStack(MULTI_TIER_ACCESS_STACK);
     }
 
+    public void testSyncNewObject() throws Exception {
+        // this resets snapshot cache...
+        createDataContext();
+        deleteTestData();
+
+        DataChannel serverChannel = new ClientServerChannel(getDomain());
+        ClientChannel clientChannel = new ClientChannel(
+                new LocalConnection(serverChannel),
+                true);
+
+        CayenneContext c1 = new CayenneContext(clientChannel);
+        CayenneContext c2 = new CayenneContext(clientChannel);
+
+        ClientMtTable1 o1 = (ClientMtTable1) 
c1.newObject(ClientMtTable1.class);
+        o1.setGlobalAttribute1("X");
+        c1.commitChanges();
+
+        ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode(
+                o1.getObjectId());
+
+        assertNull(o2);
+        // now fetch it fresh
+
+        o2 = (ClientMtTable1) c2.performQuery(new 
ObjectIdQuery(o1.getObjectId())).get(0);
+        assertNotNull(o2);
+
+        assertEquals("X", o2.getGlobalAttribute1());
+        assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState());
+        assertFalse(c1.internalGraphManager().hasChanges());
+        assertFalse(c2.internalGraphManager().hasChanges());
+    }
+
+    public void testSyncNewObjectIntoDirtyContext() throws Exception {
+        // this resets snapshot cache...
+        createDataContext();
+        deleteTestData();
+
+        DataChannel serverChannel = new ClientServerChannel(getDomain());
+        ClientChannel clientChannel = new ClientChannel(
+                new LocalConnection(serverChannel),
+                true);
+
+        CayenneContext c1 = new CayenneContext(clientChannel);
+        CayenneContext c2 = new CayenneContext(clientChannel);
+
+        // make sure c2 has uncommitted changes
+        c2.newObject(ClientMtTable1.class);
+
+        ClientMtTable1 o1 = (ClientMtTable1) 
c1.newObject(ClientMtTable1.class);
+        o1.setGlobalAttribute1("X");
+        c1.commitChanges();
+
+        ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode(
+                o1.getObjectId());
+        assertNull(o2);
+
+        // now fetch it fresh
+
+        o2 = (ClientMtTable1) c2.performQuery(new 
ObjectIdQuery(o1.getObjectId())).get(0);
+        assertNotNull(o2);
+        assertEquals("X", o2.getGlobalAttribute1());
+        assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState());
+        assertFalse(c1.internalGraphManager().hasChanges());
+        assertTrue(c2.internalGraphManager().hasChanges());
+    }
+
     public void testSyncSimpleProperty() throws Exception {
         // this resets snapshot cache...
         createDataContext();
@@ -111,6 +177,7 @@
         c1.commitChanges();
 
         assertEquals("g2", o2.getTable1().getGlobalAttribute1());
+        assertEquals(o1r.getObjectId(), o2.getTable1().getObjectId());
         assertFalse(c1.internalGraphManager().hasChanges());
         assertFalse(c2.internalGraphManager().hasChanges());
     }


Reply via email to