You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by to...@apache.org on 2008/01/20 00:06:51 UTC

svn commit: r613476 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/merge/ test/java/org/apache/cayenne/merge/

Author: torehalset
Date: Sat Jan 19 15:06:50 2008
New Revision: 613476

URL: http://svn.apache.org/viewvc?rev=613476&view=rev
Log:
CAY-885: merge changes between model and db
 * drop ObjRelationship
 * drop reverse (Db/Obj)relationships

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/AbstractToModelToken.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropRelationshipToModel.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/AbstractToModelToken.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/AbstractToModelToken.java?rev=613476&r1=613475&r2=613476&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/AbstractToModelToken.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/AbstractToModelToken.java Sat Jan 19 15:06:50 2008
@@ -18,6 +18,15 @@
  ****************************************************************/
 package org.apache.cayenne.merge;
 
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.MappingNamespace;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.util.EntityMergeSupport;
+
 /**
  * Common abstract superclass for all {@link MergerToken}s going from the database to the
  * model.
@@ -28,6 +37,24 @@
 
     public final MergeDirection getDirection() {
         return MergeDirection.TO_MODEL;
+    }
+
+    protected void synchronizeWithObjEntity(DbEntity entity) {
+        for (ObjEntity objEntity : objEntitiesMappedToDbEntity(entity)) {
+            new EntityMergeSupport(objEntity.getDataMap())
+                    .synchronizeWithDbEntity(objEntity);
+        }
+    }
+
+    protected Collection<ObjEntity> objEntitiesMappedToDbEntity(DbEntity entity) {
+        Set<ObjEntity> objEntities = new HashSet<ObjEntity>();
+        MappingNamespace mns = entity.getDataMap().getNamespace();
+        for (ObjEntity objEntity : mns.getObjEntities()) {
+            if (objEntity.getDbEntity().equals(entity)) {
+                objEntities.add(objEntity);
+            }
+        }
+        return objEntities;
     }
 
     @Override

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java?rev=613476&r1=613475&r2=613476&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropColumnToModel.java Sat Jan 19 15:06:50 2008
@@ -44,12 +44,10 @@
 
     public void execute(MergerContext mergerContext) {
         // remove ObjAttribute mapped to same column
-        for (ObjEntity objEntity : entity.getDataMap().getObjEntities()) {
-            if (objEntity.getDbEntity().equals(entity)) {
-                ObjAttribute objAttribute = objEntity.getAttributeForDbAttribute(column);
-                if (objAttribute != null) {
-                    objEntity.removeAttribute(objAttribute.getName());
-                }
+        for (ObjEntity objEntity : objEntitiesMappedToDbEntity(entity)) {
+            ObjAttribute objAttribute = objEntity.getAttributeForDbAttribute(column);
+            if (objAttribute != null) {
+                objEntity.removeAttribute(objAttribute.getName());
             }
         }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropRelationshipToModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropRelationshipToModel.java?rev=613476&r1=613475&r2=613476&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropRelationshipToModel.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/merge/DropRelationshipToModel.java Sat Jan 19 15:06:50 2008
@@ -20,6 +20,8 @@
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
 
 public class DropRelationshipToModel extends AbstractToModelToken {
 
@@ -36,8 +38,33 @@
     }
 
     public void execute(MergerContext mergerContext) {
-        // TODO: is this correct?
-        entity.removeRelationship(rel.getName());
+        remove(rel, true);
+    }
+
+    private void remove(DbRelationship rel, boolean reverse) {
+        if (rel == null) {
+            return;
+        }
+        if (reverse) {
+            remove(rel.getReverseRelationship(), false);
+        }
+
+        DbEntity dbEntity = (DbEntity) rel.getSourceEntity();
+        for (ObjEntity objEntity : objEntitiesMappedToDbEntity(dbEntity)) {
+            remove(objEntity.getRelationshipForDbRelationship(rel), true);
+        }
+        
+        rel.getSourceEntity().removeRelationship(rel.getName());
+    }
+
+    private void remove(ObjRelationship rel, boolean reverse) {
+        if (rel == null) {
+            return;
+        }
+        if (reverse) {
+            remove(rel.getReverseRelationship(), false);
+        }
+        rel.getSourceEntity().removeRelationship(rel.getName());
     }
 
     public String getTokenName() {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java?rev=613476&r1=613475&r2=613476&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/DropColumnToModelTest.java Sat Jan 19 15:06:50 2008
@@ -28,6 +28,7 @@
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
 
 public class DropColumnToModelTest extends MergeCase {
 
@@ -136,10 +137,13 @@
         rel2To1.setToMany(false);
         rel2To1.addJoin(new DbJoin(rel2To1, e2col2.getName(), e1col1.getName()));
         dbEntity2.addRelationship(rel2To1);
+        assertSame(rel1To2, rel2To1.getReverseRelationship());
+        assertSame(rel2To1, rel1To2.getReverseRelationship());
 
         assertTokensAndExecute(node, map, 4, 0);
         assertTokensAndExecute(node, map, 0, 0);
 
+        // create ObjEntities
         ObjEntity objEntity1 = new ObjEntity("NewTable");
         objEntity1.setDbEntity(dbEntity1);
         ObjAttribute oatr1 = new ObjAttribute("name");
@@ -147,16 +151,33 @@
         oatr1.setType("java.lang.String");
         objEntity1.addAttribute(oatr1);
         map.addObjEntity(objEntity1);
-
         ObjEntity objEntity2 = new ObjEntity("NewTable2");
         objEntity2.setDbEntity(dbEntity1);
         ObjAttribute o2a1 = new ObjAttribute("name");
         o2a1.setDbAttributePath(e1col2.getName());
         o2a1.setType("java.lang.String");
         objEntity2.addAttribute(o2a1);
-        map.addObjEntity(objEntity1);
+        map.addObjEntity(objEntity2);
+        
+        // create ObjRelationships
+        assertEquals(0, objEntity1.getRelationships().size());
+        assertEquals(0, objEntity2.getRelationships().size());
+        ObjRelationship objRel1To2 = new ObjRelationship("objRel1To2");
+        objRel1To2.addDbRelationship(rel1To2);
+        objRel1To2.setSourceEntity(objEntity1);
+        objRel1To2.setTargetEntity(objEntity2);
+        objEntity1.addRelationship(objRel1To2);
+        ObjRelationship objRel2To1 = new ObjRelationship("objRel2To1");
+        objRel2To1.addDbRelationship(rel2To1);
+        objRel2To1.setSourceEntity(objEntity2);
+        objRel2To1.setTargetEntity(objEntity1);
+        objEntity2.addRelationship(objRel2To1);
+        assertEquals(1, objEntity1.getRelationships().size());
+        assertEquals(1, objEntity2.getRelationships().size());
+        assertSame(objRel1To2, objRel2To1.getReverseRelationship());
+        assertSame(objRel2To1, objRel1To2.getReverseRelationship());
 
-        // remove relationship and fk from model, merge to db and add to model
+        // remove relationship and fk from model, merge to db and read to model
         dbEntity2.removeRelationship(rel2To1.getName());
         dbEntity1.removeRelationship(rel1To2.getName());
         dbEntity2.removeAttribute(e2col2.getName());
@@ -182,12 +203,13 @@
         assertTrue(token1 instanceof DropRelationshipToModel);
         execute(token1);
         execute(token0);
-        assertNull(dbEntity2.getAttribute(e2col2.getName()));
-        // TODO: assertTrue(dbEntity1.getRelationships().isEmpty());
-        assertTrue(dbEntity2.getRelationships().isEmpty());
-        // assertNull(objEntity.getAttribute(oatr1.getName()));
-        // TODO: test that relationship is gone
         
+        // check after merging
+        assertNull(dbEntity2.getAttribute(e2col2.getName()));
+        assertEquals(0, dbEntity1.getRelationships().size());
+        assertEquals(0, dbEntity2.getRelationships().size());
+        assertEquals(0, objEntity1.getRelationships().size());
+        assertEquals(0, objEntity2.getRelationships().size());
 
         // clear up
         DataContext ctxt = createDataContext();