You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/02/03 23:04:30 UTC
svn commit: r618101 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src:
main/java/org/apache/cayenne/graph/GraphDiffCompressor.java
test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java
Author: aadamchik
Date: Sun Feb 3 14:04:28 2008
New Revision: 618101
URL: http://svn.apache.org/viewvc?rev=618101&view=rev
Log:
CAY-971 ROP GraphDiff "compressor"
(canceling complimentary arc diffs)
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java?rev=618101&r1=618100&r2=618101&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphDiffCompressor.java Sun Feb 3 14:04:28 2008
@@ -52,10 +52,48 @@
}
public void arcCreated(Object nodeId, Object targetNodeId, Object arcId) {
+
+ if (targetNodeId != null) {
+ List<NodeDiff> diffs = diffsByNode.get(nodeId);
+ if (diffs != null) {
+ for (int i = diffs.size() - 1; i >= 0; i--) {
+ NodeDiff diff = diffs.get(i);
+ if (diff instanceof ArcDeleteOperation) {
+ ArcDeleteOperation arcDiff = (ArcDeleteOperation) diff;
+ if (arcId.equals(arcDiff.getArcId())
+ && targetNodeId.equals(arcDiff.targetNodeId)) {
+ diffs.remove(i);
+ compressed.remove(arcDiff);
+ return;
+ }
+ }
+ }
+ }
+ }
+
registerDiff(new ArcCreateOperation(nodeId, targetNodeId, arcId));
}
public void arcDeleted(Object nodeId, Object targetNodeId, Object arcId) {
+
+ if (targetNodeId != null) {
+ List<NodeDiff> diffs = diffsByNode.get(nodeId);
+ if (diffs != null) {
+ for (int i = diffs.size() - 1; i >= 0; i--) {
+ NodeDiff diff = diffs.get(i);
+ if (diff instanceof ArcCreateOperation) {
+ ArcCreateOperation arcDiff = (ArcCreateOperation) diff;
+ if (arcId.equals(arcDiff.getArcId())
+ && targetNodeId.equals(arcDiff.targetNodeId)) {
+ diffs.remove(i);
+ compressed.remove(arcDiff);
+ return;
+ }
+ }
+ }
+ }
+ }
+
registerDiff(new ArcDeleteOperation(nodeId, targetNodeId, arcId));
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java?rev=618101&r1=618100&r2=618101&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java Sun Feb 3 14:04:28 2008
@@ -25,6 +25,7 @@
import org.apache.cayenne.remote.ClientChannel;
import org.apache.cayenne.remote.service.LocalConnection;
import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
import org.apache.cayenne.unit.AccessStack;
import org.apache.cayenne.unit.CayenneCase;
import org.apache.cayenne.unit.CayenneResources;
@@ -43,19 +44,38 @@
LocalConnection.HESSIAN_SERIALIZATION);
ClientChannel channel = new ClientChannel(connection);
CayenneContext context = new CayenneContext(channel);
-
-
+
ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
o1.setGlobalAttribute1("v1");
o1.setGlobalAttribute1("v2");
-
+
context.commitChanges();
assertEquals(1, serverChannel.nodePropertiesChanged);
assertEquals(1, serverChannel.nodesCreated);
}
+ public void testComplimentaryArcs() {
+ DiffCounter serverChannel = new DiffCounter(getDomain());
+ LocalConnection connection = new LocalConnection(
+ serverChannel,
+ LocalConnection.HESSIAN_SERIALIZATION);
+ ClientChannel channel = new ClientChannel(connection);
+ CayenneContext context = new CayenneContext(channel);
+
+ ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
+ ClientMtTable2 o2 = context.newObject(ClientMtTable2.class);
+ o2.setTable1(o1);
+ o2.setTable1(null);
+
+ context.commitChanges();
+ assertEquals(0, serverChannel.nodePropertiesChanged);
+ assertEquals(2, serverChannel.nodesCreated);
+ assertEquals(0, serverChannel.arcsCreated);
+ assertEquals(0, serverChannel.arcsDeleted);
+ }
+
final class DiffCounter extends ClientServerChannel implements GraphChangeHandler {
-
+
int arcsCreated;
int arcsDeleted;
int nodesCreated;
@@ -66,15 +86,15 @@
public DiffCounter(DataDomain domain) {
super(domain);
}
-
+
@Override
public GraphDiff onSync(
ObjectContext originatingContext,
GraphDiff changes,
int syncType) {
-
+
changes.apply(this);
-
+
return super.onSync(originatingContext, changes, syncType);
}