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">


Reply via email to