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