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/09/06 18:36:26 UTC
svn commit: r811834 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne:
access/DataDomainQueryAction.java map/EntityResolver.java
map/ObjRelationship.java
Author: aadamchik
Date: Sun Sep 6 16:36:25 2009
New Revision: 811834
URL: http://svn.apache.org/viewvc?rev=811834&view=rev
Log:
CAY-132 Intelligent lazy fault detection
refactoring
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/main/java/org/apache/cayenne/map/EntityResolver.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjRelationship.java
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=811834&r1=811833&r2=811834&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 Sun Sep 6 16:36:25 2009
@@ -38,7 +38,6 @@
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;
@@ -218,22 +217,18 @@
// check whether a non-null FK is enough to assume non-null target, and if so,
// create a fault
- if (context != null && !relationship.isOptional()) {
+ if (context != null
+ && relationship.isSourceDefiningTargetPrecenseAndType(domain
+ .getEntityResolver())) {
+
+ // 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/main/java/org/apache/cayenne/map/EntityResolver.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java?rev=811834&r1=811833&r2=811834&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java Sun Sep 6 16:36:25 2009
@@ -89,9 +89,10 @@
public EntityResolver() {
init();
}
-
+
/**
- * Initialization of EntityResolver. Used in constructor and in Java deserialization process
+ * Initialization of EntityResolver. Used in constructor and in Java deserialization
+ * process
*/
private void init() {
this.indexedByClass = true;
@@ -394,7 +395,7 @@
return c;
}
-
+
/**
* @since 3.0
*/
@@ -403,7 +404,7 @@
for (DataMap map : getDataMaps()) {
c.addComposited(map.getResults());
}
-
+
return c;
}
@@ -456,7 +457,7 @@
return result;
}
-
+
/**
* @since 3.0
*/
@@ -680,8 +681,19 @@
* known subentities, null is returned.
*/
public EntityInheritanceTree lookupInheritanceTree(ObjEntity entity) {
+ return lookupInheritanceTree(entity.getName());
+ }
+
+ /**
+ * Returns EntityInheritanceTree representing inheritance hierarchy that starts with a
+ * given ObjEntity as root, and includes all its subentities. If ObjEntity has no
+ * known subentities, null is returned.
+ *
+ * @since 3.0
+ */
+ public EntityInheritanceTree lookupInheritanceTree(String entityName) {
- EntityInheritanceTree tree = entityInheritanceCache.get(entity.getName());
+ EntityInheritanceTree tree = entityInheritanceCache.get(entityName);
if (tree == null) {
// since we keep inheritance trees for all entities, null means
@@ -690,7 +702,7 @@
// rebuild cache just in case some of the datamaps
// have changed and now contain the required information
constructCache();
- tree = entityInheritanceCache.get(entity.getName());
+ tree = entityInheritanceCache.get(entityName);
}
// don't return "trivial" trees
@@ -911,10 +923,11 @@
}
/**
- * Java default deserialization seems not to invoke constructor by default -
- * invoking it manually
+ * Java default deserialization seems not to invoke constructor by default - invoking
+ * it manually
*/
- private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ private void readObject(ObjectInputStream in) throws IOException,
+ ClassNotFoundException {
init();
in.defaultReadObject();
}
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=811834&r1=811833&r2=811834&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 Sun Sep 6 16:36:25 2009
@@ -37,7 +37,6 @@
/**
* Describes an association between two Java classes mapped as source and target
* ObjEntity. Maps to a path of DbRelationships.
- *
*/
public class ObjRelationship extends Relationship {
@@ -277,7 +276,7 @@
this.readOnly = false;
this.toMany = false;
}
-
+
/**
* Returns a boolean indicating whether the presence of a non-null source key(s) will
* not guarantee a presence of a target record. PK..FK relationships are all optional,
@@ -312,7 +311,17 @@
return true;
}
-
+
+ /**
+ * Returns true if the relationship is non-optional and target has no subclasses.
+ *
+ * @since 3.0
+ */
+ public boolean isSourceDefiningTargetPrecenseAndType(EntityResolver entityResolver) {
+ return !isOptional()
+ && entityResolver.lookupInheritanceTree(getTargetEntityName()) == null;
+ }
+
/**
* Returns true if the entity or its super entities have a limiting qualifier.
*/
@@ -330,7 +339,6 @@
return isQualifiedEntity(entity);
}
-
/**
* Returns a boolean indicating whether modifying a target of such relationship in any
* way will not change the underlying table row of the source.
@@ -725,8 +733,8 @@
* Returns a property name of a target entity used to create a relationship map. Only
* has effect if collectionType property is set to "java.util.Map".
*
- * @return The attribute name used for the map key or <code>null</code> if the
- * default (PK) is used as the map key.
+ * @return The attribute name used for the map key or <code>null</code> if the default
+ * (PK) is used as the map key.
* @since 3.0
*/
public String getMapKey() {