You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2009/08/21 13:07:58 UTC

svn commit: r806496 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/ test/java/org/apache/cayenne/access/ test/java/org/apache/cayenne/testdo/inherit/ test/java/org/apache/cayenne/testdo/inherit/au...

Author: aadamchik
Date: Fri Aug 21 11:07:57 2009
New Revision: 806496

URL: http://svn.apache.org/viewvc?rev=806496&view=rev
Log:
CAY-132 Intelligent lazy fault detection

fixing a case when a relationship to a superclass is involved
adding test cases

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java
Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java Fri Aug 21 11:07:57 2009
@@ -38,6 +38,7 @@
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.LifecycleEvent;
+import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.query.EntityResultSegment;
 import org.apache.cayenne.query.ObjectIdQuery;
@@ -219,13 +220,20 @@
             // create a fault
             if (context != null && !relationship.isOptional()) {
 
-                // prevent passing partial snapshots to ObjectResolver per CAY-724. Create
-                // a hollow object right here and skip object conversion downstream
-                this.noObjectConversion = true;
-                Object object = context.localObject(targetId, null);
+                // final check (how do we do it in relationship.isOptional()??) - is
+                // inheritance involved
+                ObjEntity targetEntity = (ObjEntity) relationship.getTargetEntity();
+                if (domain.getEntityResolver().lookupInheritanceTree(targetEntity) == null) {
+
+                    // prevent passing partial snapshots to ObjectResolver per CAY-724.
+                    // Create
+                    // a hollow object right here and skip object conversion downstream
+                    this.noObjectConversion = true;
+                    Object object = context.localObject(targetId, null);
 
-                this.response = new GenericResponse(Collections.singletonList(object));
-                return DONE;
+                    this.response = new GenericResponse(Collections.singletonList(object));
+                    return DONE;
+                }
             }
         }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java Fri Aug 21 11:07:57 2009
@@ -23,6 +23,8 @@
 import java.util.List;
 
 import org.apache.cayenne.DataObjectUtils;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.testdo.inherit.AbstractPerson;
 import org.apache.cayenne.testdo.inherit.Address;
@@ -32,13 +34,13 @@
 import org.apache.cayenne.testdo.inherit.Department;
 import org.apache.cayenne.testdo.inherit.Employee;
 import org.apache.cayenne.testdo.inherit.Manager;
+import org.apache.cayenne.testdo.inherit.PersonNotes;
 import org.apache.cayenne.testdo.inherit.RelatedEntity;
 import org.apache.cayenne.testdo.inherit.SubEntity;
 import org.apache.cayenne.unit.PeopleCase;
 
 /**
  * Testing Cayenne behavior with DataObject inheritance hierarchies.
- * 
  */
 public class InheritanceTest extends PeopleCase {
 
@@ -51,6 +53,23 @@
         context = createDataContext();
     }
 
+    public void testRelationshipToAbstractSuper() {
+        context
+                .performGenericQuery(new SQLTemplate(
+                        AbstractPerson.class,
+                        "INSERT INTO PERSON (PERSON_ID, NAME, PERSON_TYPE) VALUES (1, 'AA', 'EE')"));
+
+        context.performGenericQuery(new SQLTemplate(
+                PersonNotes.class,
+                "INSERT INTO PERSON_NOTES (ID, NOTES, PERSON_ID) VALUES (1, 'AA', 1)"));
+
+        PersonNotes note = DataObjectUtils.objectForPK(context, PersonNotes.class, 1);
+        assertNotNull(note);
+        assertNotNull(note.getPerson());
+        assertTrue(note.getPerson() instanceof Employee);
+
+    }
+
     public void testSave() throws Exception {
         ClientCompany company = context.newObject(ClientCompany.class);
         company.setName("Boeing");
@@ -201,7 +220,7 @@
         // We should still just have the one mapped relationship, but we in fact now have
         // two:
         // DirectToSubEntity -> BaseEntity and DirectToSubEntity -> SubEntity.
-        
+
         // TODO: andrus 2008/03/28 - this fails...
         // assertEquals(1, context.getEntityResolver().getObjEntity("DirectToSubEntity")
         // .getRelationships().size());
@@ -213,8 +232,8 @@
         //
         // assertEquals(1, direct.getSubEntities().size());
         //
-        //        context.deleteObject(sub);
-        //        assertEquals(0, direct.getSubEntities().size());
+        // context.deleteObject(sub);
+        // assertEquals(0, direct.getSubEntities().size());
     }
 
     /**

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java Fri Aug 21 11:07:57 2009
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.testdo.inherit;
 
-public class AbstractPerson extends org.apache.cayenne.testdo.inherit.auto._AbstractPerson {
+public abstract class AbstractPerson extends org.apache.cayenne.testdo.inherit.auto._AbstractPerson {
 
 }
 

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java?rev=806496&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java Fri Aug 21 11:07:57 2009
@@ -0,0 +1,18 @@
+package org.apache.cayenne.testdo.inherit;
+
+import org.apache.cayenne.testdo.inherit.auto._People;
+
+public class People extends _People {
+
+    private static People instance;
+
+    private People() {}
+
+    public static People getInstance() {
+        if(instance == null) {
+            instance = new People();
+        }
+
+        return instance;
+    }
+}

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java?rev=806496&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java Fri Aug 21 11:07:57 2009
@@ -0,0 +1,7 @@
+package org.apache.cayenne.testdo.inherit;
+
+import org.apache.cayenne.testdo.inherit.auto._PersonNotes;
+
+public class PersonNotes extends _PersonNotes {
+
+}

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java Fri Aug 21 11:07:57 2009
@@ -1,6 +1,9 @@
 package org.apache.cayenne.testdo.inherit.auto;
 
+import java.util.List;
+
 import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.testdo.inherit.PersonNotes;
 
 /**
  * Class _AbstractPerson was generated by Cayenne.
@@ -12,6 +15,7 @@
 
     public static final String NAME_PROPERTY = "name";
     public static final String PERSON_TYPE_PROPERTY = "personType";
+    public static final String NOTES_PROPERTY = "notes";
 
     public static final String PERSON_ID_PK_COLUMN = "PERSON_ID";
 
@@ -29,4 +33,16 @@
         return (String)readProperty("personType");
     }
 
+    public void addToNotes(PersonNotes obj) {
+        addToManyTarget("notes", obj, true);
+    }
+    public void removeFromNotes(PersonNotes obj) {
+        removeToManyTarget("notes", obj, true);
+    }
+    @SuppressWarnings("unchecked")
+    public List<PersonNotes> getNotes() {
+        return (List<PersonNotes>)readProperty("notes");
+    }
+
+
 }

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java?rev=806496&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java Fri Aug 21 11:07:57 2009
@@ -0,0 +1,12 @@
+package org.apache.cayenne.testdo.inherit.auto;
+
+
+
+/**
+ * This class 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 _People {
+}
\ No newline at end of file

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java?rev=806496&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java Fri Aug 21 11:07:57 2009
@@ -0,0 +1,35 @@
+package org.apache.cayenne.testdo.inherit.auto;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.testdo.inherit.AbstractPerson;
+
+/**
+ * Class _PersonNotes 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 _PersonNotes extends CayenneDataObject {
+
+    public static final String NOTES_PROPERTY = "notes";
+    public static final String PERSON_PROPERTY = "person";
+
+    public static final String ID_PK_COLUMN = "ID";
+
+    public void setNotes(String notes) {
+        writeProperty("notes", notes);
+    }
+    public String getNotes() {
+        return (String)readProperty("notes");
+    }
+
+    public void setPerson(AbstractPerson person) {
+        setToOneTarget("person", person, true);
+    }
+
+    public AbstractPerson getPerson() {
+        return (AbstractPerson)readProperty("person");
+    }
+
+
+}

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml Fri Aug 21 11:07:57 2009
@@ -36,10 +36,15 @@
 		<db-attribute name="PERSON_TYPE" type="CHAR" isMandatory="true" length="2"/>
 		<db-attribute name="SALARY" type="FLOAT"/>
 	</db-entity>
+	<db-entity name="PERSON_NOTES">
+		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+		<db-attribute name="NOTES" type="VARCHAR" length="255"/>
+		<db-attribute name="PERSON_ID" type="INTEGER"/>
+	</db-entity>
 	<db-entity name="RELATED_ENTITY">
 		<db-attribute name="RELATED_ENTITY_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
 	</db-entity>
-	<obj-entity name="AbstractPerson" className="org.apache.cayenne.testdo.inherit.AbstractPerson" dbEntityName="PERSON">
+	<obj-entity name="AbstractPerson" abstract="true" className="org.apache.cayenne.testdo.inherit.AbstractPerson" dbEntityName="PERSON">
 		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
 		<obj-attribute name="personType" type="java.lang.String" db-attribute-path="PERSON_TYPE"/>
 	</obj-entity>
@@ -70,6 +75,9 @@
 	<obj-entity name="Manager" superEntityName="Employee" className="org.apache.cayenne.testdo.inherit.Manager">
 		<qualifier><![CDATA[personType = "EM"]]></qualifier>
 	</obj-entity>
+	<obj-entity name="PersonNotes" className="org.apache.cayenne.testdo.inherit.PersonNotes" dbEntityName="PERSON_NOTES">
+		<obj-attribute name="notes" type="java.lang.String" db-attribute-path="NOTES"/>
+	</obj-entity>
 	<obj-entity name="RelatedEntity" className="org.apache.cayenne.testdo.inherit.RelatedEntity" dbEntityName="RELATED_ENTITY">
 	</obj-entity>
 	<obj-entity name="SubEntity" superEntityName="BaseEntity" className="org.apache.cayenne.testdo.inherit.SubEntity">
@@ -102,15 +110,22 @@
 	<db-relationship name="managedDepartments" source="PERSON" target="DEPARTMENT" toMany="true">
 		<db-attribute-pair source="PERSON_ID" target="MANAGER_ID"/>
 	</db-relationship>
+	<db-relationship name="notes" source="PERSON" target="PERSON_NOTES" toMany="true">
+		<db-attribute-pair source="PERSON_ID" target="PERSON_ID"/>
+	</db-relationship>
 	<db-relationship name="toClientCompany" source="PERSON" target="CLIENT_COMPANY" toMany="false">
 		<db-attribute-pair source="CLIENT_COMPANY_ID" target="CLIENT_COMPANY_ID"/>
 	</db-relationship>
 	<db-relationship name="toDepartment" source="PERSON" target="DEPARTMENT" toMany="false">
 		<db-attribute-pair source="DEPARTMENT_ID" target="DEPARTMENT_ID"/>
 	</db-relationship>
+	<db-relationship name="person" source="PERSON_NOTES" target="PERSON" toMany="false">
+		<db-attribute-pair source="PERSON_ID" target="PERSON_ID"/>
+	</db-relationship>
 	<db-relationship name="entities" source="RELATED_ENTITY" target="BASE_ENTITY" toMany="true">
 		<db-attribute-pair source="RELATED_ENTITY_ID" target="RELATED_ENTITY_ID"/>
 	</db-relationship>
+	<obj-relationship name="notes" source="AbstractPerson" target="PersonNotes" deleteRule="Nullify" db-relationship-path="notes"/>
 	<obj-relationship name="toEmployee" source="Address" target="Employee" db-relationship-path="toPerson"/>
 	<obj-relationship name="toDirectToSubEntity" source="BaseEntity" target="DirectToSubEntity" deleteRule="Nullify" db-relationship-path="directToSubEntities"/>
 	<obj-relationship name="toRelatedEntity" source="BaseEntity" target="RelatedEntity" deleteRule="Nullify" db-relationship-path="relatedEntities"/>
@@ -122,6 +137,7 @@
 	<obj-relationship name="addresses" source="Employee" target="Address" db-relationship-path="employeeAddresses"/>
 	<obj-relationship name="toDepartment" source="Employee" target="Department" db-relationship-path="toDepartment"/>
 	<obj-relationship name="managedDepartments" source="Manager" target="Department" db-relationship-path="managedDepartments"/>
+	<obj-relationship name="person" source="PersonNotes" target="AbstractPerson" deleteRule="Nullify" db-relationship-path="person"/>
 	<obj-relationship name="baseEntities" source="RelatedEntity" target="BaseEntity" db-relationship-path="entities"/>
 	<obj-relationship name="subEntities" source="RelatedEntity" target="SubEntity" db-relationship-path="entities"/>
 </data-map>