You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by an...@apache.org on 2009/02/24 10:03:36 UTC

svn commit: r747310 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/util/ test/java/org/apache/cayenne/remote/ test/java/org/apache/cayenne/testdo/mt/auto/ test/resources/

Author: andrey
Date: Tue Feb 24 09:03:35 2009
New Revision: 747310

URL: http://svn.apache.org/viewvc?rev=747310&view=rev
Log:
CAY-1183 commitToParent() makes object persistence state committed, produces exception when using object in parent context (ROP)

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable2.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable3.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java?rev=747310&r1=747309&r2=747310&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java Tue Feb 24 09:03:35 2009
@@ -23,6 +23,7 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.cayenne.BaseContext;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.PersistenceState;
@@ -45,7 +46,7 @@
  * <p>
  * <i>Intended for internal use only.</i>
  * </p>
- * 
+ *
  * @since 1.2
  */
 public abstract class ObjectContextQueryAction {
@@ -226,6 +227,22 @@
                             return DONE;
 
                         }
+
+                        /**
+                         * Workaround for CAY-1183. If a Relationship query is being sent from
+                         * child context, we assure that local object is not NEW and relationship - unresolved
+                         * (this way exception will occur). This helps when faulting objects that
+                         * were committed to parent context (this), but not to database.
+                         *
+                         * Checking type of context's channel is the only way to ensure that we are
+                         * on the top level of context hierarchy (there might be more than one-level-deep
+                         * nested contexts).
+                         */
+                        if (((Persistent) object).getPersistenceState() == PersistenceState.NEW
+                            && !(actingContext.getChannel() instanceof BaseContext)) {
+                            this.response = new ListResponse();
+                            return DONE;
+                        }
                     }
                 }
             }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java?rev=747310&r1=747309&r2=747310&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java Tue Feb 24 09:03:35 2009
@@ -158,7 +158,6 @@
         blockQueries();
 
         try {
-
             ClientMtTable2 child2 = (ClientMtTable2) child.localObject(_new2.getObjectId(), _new2);
             assertEquals(PersistenceState.COMMITTED, child2.getPersistenceState());
             assertNotNull(child2.getTable1());
@@ -597,4 +596,23 @@
         assertEquals(PersistenceState.MODIFIED, parentA.getPersistenceState());
         assertEquals(0, parentA.getTable2Array().size());
     }
+
+    public void testCAY1183() throws Exception {
+        deleteTestData();
+
+        ClientMtTable1 parentMt = context.newObject(ClientMtTable1.class);
+        context.commitChanges();
+
+        ObjectContext child = context.createChildContext();
+        ClientMtTable1 childMt = (ClientMtTable1) DataObjectUtils.objectForPK(child, parentMt.getObjectId());
+        childMt.setGlobalAttribute1("1183");
+        ClientMtTable2 childMt2 = child.newObject(ClientMtTable2.class);
+        childMt2.setGlobalAttribute("1183");
+        childMt2.setTable1(childMt);
+
+        child.commitChangesToParent();
+
+        //fetching other relationship... this fails per CAY-1183
+        childMt2.getTable3();
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable2.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable2.java?rev=747310&r1=747309&r2=747310&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable2.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable2.java Tue Feb 24 09:03:35 2009
@@ -3,6 +3,7 @@
 import org.apache.cayenne.PersistentObject;
 import org.apache.cayenne.ValueHolder;
 import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable3;
 
 /**
  * A generated persistent class mapped as "MtTable2" Cayenne entity. It is a good idea to
@@ -13,9 +14,11 @@
 
     public static final String GLOBAL_ATTRIBUTE_PROPERTY = "globalAttribute";
     public static final String TABLE1_PROPERTY = "table1";
+    public static final String TABLE3_PROPERTY = "table3";
 
     protected String globalAttribute;
     protected ValueHolder table1;
+    protected ValueHolder table3;
 
     public String getGlobalAttribute() {
         if(objectContext != null) {
@@ -53,4 +56,19 @@
         this.table1.setValue(table1);
     }
 
+    public ClientMtTable3 getTable3() {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "table3", true);
+        }
+
+        return (ClientMtTable3) table3.getValue();
+    }
+    public void setTable3(ClientMtTable3 table3) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "table3", true);
+        }
+
+        this.table3.setValue(table3);
+    }
+
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable3.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable3.java?rev=747310&r1=747309&r2=747310&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable3.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtTable3.java Tue Feb 24 09:03:35 2009
@@ -1,6 +1,9 @@
 package org.apache.cayenne.testdo.mt.auto;
 
+import java.util.List;
+
 import org.apache.cayenne.PersistentObject;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
 
 /**
  * A generated persistent class mapped as "MtTable3" Cayenne entity. It is a good idea to
@@ -12,10 +15,12 @@
     public static final String BINARY_COLUMN_PROPERTY = "binaryColumn";
     public static final String CHAR_COLUMN_PROPERTY = "charColumn";
     public static final String INT_COLUMN_PROPERTY = "intColumn";
+    public static final String TABLE2ARRAY_PROPERTY = "table2Array";
 
     protected byte[] binaryColumn;
     protected String charColumn;
     protected Integer intColumn;
+    protected List<ClientMtTable2> table2Array;
 
     public byte[] getBinaryColumn() {
         if(objectContext != null) {
@@ -80,4 +85,26 @@
         }
     }
 
+    public List<ClientMtTable2> getTable2Array() {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "table2Array", true);
+        }
+
+        return table2Array;
+    }
+    public void addToTable2Array(ClientMtTable2 object) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "table2Array", true);
+        }
+
+        this.table2Array.add(object);
+    }
+    public void removeFromTable2Array(ClientMtTable2 object) {
+        if(objectContext != null) {
+            objectContext.prepareForAccess(this, "table2Array", true);
+        }
+
+        this.table2Array.remove(object);
+    }
+
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java?rev=747310&r1=747309&r2=747310&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable2.java Tue Feb 24 09:03:35 2009
@@ -2,6 +2,7 @@
 
 import org.apache.cayenne.CayenneDataObject;
 import org.apache.cayenne.testdo.mt.MtTable1;
+import org.apache.cayenne.testdo.mt.MtTable3;
 
 /**
  * Class _MtTable2 was generated by Cayenne.
@@ -13,6 +14,7 @@
 
     public static final String GLOBAL_ATTRIBUTE_PROPERTY = "globalAttribute";
     public static final String TABLE1_PROPERTY = "table1";
+    public static final String TABLE3_PROPERTY = "table3";
 
     public static final String TABLE2_ID_PK_COLUMN = "TABLE2_ID";
 
@@ -32,4 +34,13 @@
     }
 
 
+    public void setTable3(MtTable3 table3) {
+        setToOneTarget("table3", table3, true);
+    }
+
+    public MtTable3 getTable3() {
+        return (MtTable3)readProperty("table3");
+    }
+
+
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java?rev=747310&r1=747309&r2=747310&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtTable3.java Tue Feb 24 09:03:35 2009
@@ -1,6 +1,9 @@
 package org.apache.cayenne.testdo.mt.auto;
 
+import java.util.List;
+
 import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.testdo.mt.MtTable2;
 
 /**
  * Class _MtTable3 was generated by Cayenne.
@@ -13,6 +16,7 @@
     public static final String BINARY_COLUMN_PROPERTY = "binaryColumn";
     public static final String CHAR_COLUMN_PROPERTY = "charColumn";
     public static final String INT_COLUMN_PROPERTY = "intColumn";
+    public static final String TABLE2ARRAY_PROPERTY = "table2Array";
 
     public static final String TABLE3_ID_PK_COLUMN = "TABLE3_ID";
 
@@ -37,4 +41,16 @@
         return (Integer)readProperty("intColumn");
     }
 
+    public void addToTable2Array(MtTable2 obj) {
+        addToManyTarget("table2Array", obj, true);
+    }
+    public void removeFromTable2Array(MtTable2 obj) {
+        removeToManyTarget("table2Array", obj, true);
+    }
+    @SuppressWarnings("unchecked")
+    public List<MtTable2> getTable2Array() {
+        return (List<MtTable2>)readProperty("table2Array");
+    }
+
+
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml?rev=747310&r1=747309&r2=747310&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml Tue Feb 24 09:03:35 2009
@@ -51,6 +51,7 @@
 		<db-attribute name="GLOBAL_ATTRIBUTE" type="VARCHAR" length="100"/>
 		<db-attribute name="TABLE1_ID" type="INTEGER"/>
 		<db-attribute name="TABLE2_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+		<db-attribute name="TABLE3_ID" type="INTEGER"/>
 	</db-entity>
 	<db-entity name="MT_TABLE3">
 		<db-attribute name="BINARY_COLUMN" type="VARBINARY" length="100"/>
@@ -157,6 +158,12 @@
 	<db-relationship name="table1" source="MT_TABLE2" target="MT_TABLE1" toMany="false">
 		<db-attribute-pair source="TABLE1_ID" target="TABLE1_ID"/>
 	</db-relationship>
+	<db-relationship name="table3" source="MT_TABLE2" target="MT_TABLE3" toMany="false">
+		<db-attribute-pair source="TABLE3_ID" target="TABLE3_ID"/>
+	</db-relationship>
+	<db-relationship name="table2Array" source="MT_TABLE3" target="MT_TABLE2" toMany="true">
+		<db-attribute-pair source="TABLE3_ID" target="TABLE3_ID"/>
+	</db-relationship>
 	<db-relationship name="joins" source="MT_TABLE4" target="MT_JOIN45" toDependentPK="true" toMany="true">
 		<db-attribute-pair source="ID" target="TABLE4_ID"/>
 	</db-relationship>
@@ -175,6 +182,8 @@
 	<obj-relationship name="toParent" source="MtReflexive" target="MtReflexive" db-relationship-path="toParent"/>
 	<obj-relationship name="table2Array" source="MtTable1" target="MtTable2" db-relationship-path="table2Array"/>
 	<obj-relationship name="table1" source="MtTable2" target="MtTable1" db-relationship-path="table1"/>
+	<obj-relationship name="table3" source="MtTable2" target="MtTable3" deleteRule="Nullify" db-relationship-path="table3"/>
+	<obj-relationship name="table2Array" source="MtTable3" target="MtTable2" deleteRule="Deny" db-relationship-path="table2Array"/>
 	<obj-relationship name="table5s" source="MtTable4" target="MtTable5" db-relationship-path="joins.toTable5"/>
 	<obj-relationship name="table4s" source="MtTable5" target="MtTable4" db-relationship-path="joins.toTable4"/>
 	<query name="AllMtTable1" factory="org.apache.cayenne.map.SelectQueryBuilder" root="obj-entity" root-name="MtTable1">