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/09/22 22:33:08 UTC
svn commit: r817829 - in /cayenne/main/trunk: docs/doc/src/main/resources/
framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/
framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/db1/auto/
framework/cayen...
Author: andrey
Date: Tue Sep 22 20:33:06 2009
New Revision: 817829
URL: http://svn.apache.org/viewvc?rev=817829&view=rev
Log:
CAY-1278 Project with cross-datamap flattenned relationships fails to load
Modified:
cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Entity.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjRelationship.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml
Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=817829&r1=817828&r2=817829&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Tue Sep 22 20:33:06 2009
@@ -49,6 +49,7 @@
CAY-1274 CreateTableToDb should not create existing AUTO_PK_SUPPORT
CAY-1275 Merge set-not-null to Oracle through modeler fails if auto adapter is set
CAY-1277 Prefetching may cause a root object to got from COMMITTED to MODIFIED state
+CAY-1278 Project with cross-datamap flattenned relationships fails to load
----------------------------------
Release: 3.0M6
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Entity.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Entity.java?rev=817829&r1=817828&r2=817829&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Entity.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Entity.java Tue Sep 22 20:33:06 2009
@@ -290,6 +290,7 @@
* @deprecated since 3.0 use {@link #lastPathComponent(Expression, Map)} method that
* supports aliases.
*/
+ @Deprecated
public Object lastPathComponent(Expression path) {
PathComponent<Attribute, Relationship> last = lastPathComponent(
@@ -403,7 +404,7 @@
public CayenneMapEntry next() {
String pathComp = toks.nextToken();
-
+
// see if this is an attribute
Attribute attr = currentEnt.getAttribute(pathComp);
if (attr != null) {
@@ -422,7 +423,9 @@
Relationship rel = currentEnt.getRelationship(pathComp);
if (rel != null) {
currentEnt = rel.getTargetEntity();
- return rel;
+ if (currentEnt != null || !toks.hasMoreTokens()) { //otherwise an exception will be thrown
+ return rel;
+ }
}
// build error message
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java?rev=817829&r1=817828&r2=817829&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java Tue Sep 22 20:33:06 2009
@@ -1078,7 +1078,7 @@
objRelationship.setUsedForLocking(TRUE
.equalsIgnoreCase(atts.getValue("", "lock")));
objRelationship
- .setDbRelationshipPath((atts.getValue("", "db-relationship-path")));
+ .setDeferredDbRelationshipPath((atts.getValue("", "db-relationship-path")));
objRelationship.setCollectionType(collectionType);
objRelationship.setMapKey(mapKey);
source.addRelationship(objRelationship);
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjRelationship.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjRelationship.java?rev=817829&r1=817828&r2=817829&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjRelationship.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjRelationship.java Tue Sep 22 20:33:06 2009
@@ -53,6 +53,12 @@
protected boolean usedForLocking;
protected List<DbRelationship> dbRelationships = new ArrayList<DbRelationship>(2);
+
+ /**
+ * Db-relationships path that is set but not yet parsed (turned into List<DbRelationship>)
+ * Used during map loading
+ */
+ String deferredPath;
/**
* Stores the type of collection mapped by a to-many relationship. Null for to-one
@@ -227,6 +233,7 @@
* Returns an immutable list of underlying DbRelationships.
*/
public List<DbRelationship> getDbRelationships() {
+ refreshFromDeferredPath();
return Collections.unmodifiableList(dbRelationships);
}
@@ -234,6 +241,7 @@
* Appends a DbRelationship to the existing list of DbRelationships.
*/
public void addDbRelationship(DbRelationship dbRel) {
+ refreshFromDeferredPath();
if (dbRel.getName() == null) {
throw new IllegalArgumentException("DbRelationship has no name");
}
@@ -265,6 +273,7 @@
* Removes the relationship <code>dbRel</code> from the list of relationships.
*/
public void removeDbRelationship(DbRelationship dbRel) {
+ refreshFromDeferredPath();
if (dbRelationships.remove(dbRel)) {
this.recalculateReadOnlyValue();
this.recalculateToManyValue();
@@ -272,6 +281,7 @@
}
public void clearDbRelationships() {
+ deferredPath = null;
this.dbRelationships.clear();
this.readOnly = false;
this.toMany = false;
@@ -389,12 +399,14 @@
* @return flag indicating if the relationship is read only or not
*/
public boolean isReadOnly() {
+ refreshFromDeferredPath();
recalculateReadOnlyValue();
return readOnly;
}
@Override
public boolean isToMany() {
+ refreshFromDeferredPath();
recalculateToManyValue();
return super.isToMany();
}
@@ -466,6 +478,8 @@
* @since 1.1
*/
public String getDbRelationshipPath() {
+ refreshFromDeferredPath();
+
// build path on the fly
if (getDbRelationships().isEmpty()) {
return null;
@@ -530,6 +544,26 @@
refreshFromPath(relationshipPath);
}
}
+
+ /**
+ * Sets relationship path, but does not trigger its conversion to List<DbRelationship>
+ * For internal purposes, primarily datamap loading
+ */
+ void setDeferredDbRelationshipPath(String relationshipPath) {
+ if (!Util.nullSafeEquals(getDbRelationshipPath(), relationshipPath)) {
+ deferredPath = relationshipPath;
+ }
+ }
+
+ /**
+ * Loads path from "deferredPath" variable (if specified)
+ */
+ synchronized void refreshFromDeferredPath() {
+ if (deferredPath != null) {
+ refreshFromPath(deferredPath);
+ deferredPath = null;
+ }
+ }
/**
* Returns dot-separated path over DbRelationships, only including components that
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java?rev=817829&r1=817828&r2=817829&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/db1/auto/_CrossdbM1E1.java Tue Sep 22 20:33:06 2009
@@ -2,14 +2,20 @@
import java.util.List;
-/** Class _CrossdbM1E1 was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public class _CrossdbM1E1 extends org.apache.cayenne.CayenneDataObject {
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.testdo.db2.CrossdbM2E1;
+import org.apache.cayenne.testdo.db2.CrossdbM2E2;
+
+/**
+ * Class _CrossdbM1E1 was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _CrossdbM1E1 extends CayenneDataObject {
public static final String NAME_PROPERTY = "name";
+ public static final String FLATTENED_PROPERTY = "flattened";
public static final String LIST_OF_M2E2_PROPERTY = "listOfM2E2";
public static final String ID_PK_COLUMN = "ID";
@@ -20,17 +26,29 @@
public String getName() {
return (String)readProperty("name");
}
-
-
- public void addToListOfM2E2(org.apache.cayenne.testdo.db2.CrossdbM2E2 obj) {
+
+ public void addToFlattened(CrossdbM2E1 obj) {
+ addToManyTarget("flattened", obj, true);
+ }
+ public void removeFromFlattened(CrossdbM2E1 obj) {
+ removeToManyTarget("flattened", obj, true);
+ }
+ @SuppressWarnings("unchecked")
+ public List<CrossdbM2E1> getFlattened() {
+ return (List<CrossdbM2E1>)readProperty("flattened");
+ }
+
+
+ public void addToListOfM2E2(CrossdbM2E2 obj) {
addToManyTarget("listOfM2E2", obj, true);
}
- public void removeFromListOfM2E2(org.apache.cayenne.testdo.db2.CrossdbM2E2 obj) {
+ public void removeFromListOfM2E2(CrossdbM2E2 obj) {
removeToManyTarget("listOfM2E2", obj, true);
}
- public List getListOfM2E2() {
- return (List)readProperty("listOfM2E2");
+ @SuppressWarnings("unchecked")
+ public List<CrossdbM2E2> getListOfM2E2() {
+ return (List<CrossdbM2E2>)readProperty("listOfM2E2");
}
-
-
+
+
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml?rev=817829&r1=817828&r2=817829&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml Tue Sep 22 20:33:06 2009
@@ -14,5 +14,6 @@
<db-relationship name="listOfM2E2" source="CROSSDB_M1E1" target="CROSSDB_M2E2" toMany="true">
<db-attribute-pair source="ID" target="M1E1_ID"/>
</db-relationship>
+ <obj-relationship name="flattened" source="CrossdbM1E1" target="CrossdbM2E1" deleteRule="Deny" db-relationship-path="listOfM2E2.toM2E1"/>
<obj-relationship name="listOfM2E2" source="CrossdbM1E1" target="CrossdbM2E2" db-relationship-path="listOfM2E2"/>
</data-map>