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());
}