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 2007/12/23 17:34:57 UTC

svn commit: r606572 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access: DataDomainDBDiffBuilder.java DataDomainInsertBucket.java DataDomainSyncBucket.java

Author: aadamchik
Date: Sun Dec 23 08:34:56 2007
New Revision: 606572

URL: http://svn.apache.org/viewvc?rev=606572&view=rev
Log:
CAY-948 Implement flattened attributes in Cayenne
(generics, also fix for an NPE when inserting entities with flattened attributes)

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java?rev=606572&r1=606571&r2=606572&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainDBDiffBuilder.java Sun Dec 23 08:34:56 2007
@@ -27,7 +27,7 @@
 import org.apache.cayenne.access.DataDomainSyncBucket.PropagatedValueFactory;
 import org.apache.cayenne.graph.GraphChangeHandler;
 import org.apache.cayenne.graph.GraphDiff;
-import org.apache.cayenne.map.Attribute;
+import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
@@ -100,11 +100,12 @@
                         .getKey()
                         .toString());
 
-                // this takes care of the flattened attributes, as 'getDbAttributeName'
-                // returns the last path component...
-                Attribute dbAttribute = dbEntity.getAttribute(attribute
-                        .getDbAttributeName());
-                dbDiff.put(dbAttribute.getName(), entry.getValue());
+                // in case of a flattened attribute, ensure that it belongs to this
+                // bucket...
+                DbAttribute dbAttribute = attribute.getDbAttribute();
+                if (dbAttribute.getEntity() == dbEntity) {
+                    dbDiff.put(dbAttribute.getName(), entry.getValue());
+                }
             }
         }
     }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java?rev=606572&r1=606571&r2=606572&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java Sun Dec 23 08:34:56 2007
@@ -36,6 +36,7 @@
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.query.InsertBatchQuery;
+import org.apache.cayenne.query.Query;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
 /**
@@ -48,23 +49,21 @@
         super(parent);
     }
 
-    void appendQueriesInternal(Collection queries) {
+    @Override
+    void appendQueriesInternal(Collection<Query> queries) {
 
         DataDomainDBDiffBuilder diffBuilder = new DataDomainDBDiffBuilder();
 
         EntitySorter sorter = parent.getDomain().getEntitySorter();
         sorter.sortDbEntities(dbEntities, false);
 
-        Iterator i = dbEntities.iterator();
-        while (i.hasNext()) {
-            DbEntity dbEntity = (DbEntity) i.next();
-            List objEntitiesForDbEntity = (List) descriptorsByDbEntity.get(dbEntity);
+        for (DbEntity dbEntity : dbEntities) {
 
-            InsertBatchQuery batch = new InsertBatchQuery(dbEntity, 27);
+            Collection<ClassDescriptor> objEntitiesForDbEntity = descriptorsByDbEntity
+                    .get(dbEntity);
 
-            Iterator j = objEntitiesForDbEntity.iterator();
-            while (j.hasNext()) {
-                ClassDescriptor descriptor = (ClassDescriptor) j.next();
+            InsertBatchQuery batch = new InsertBatchQuery(dbEntity, 27);
+            for (ClassDescriptor descriptor : objEntitiesForDbEntity) {
 
                 diffBuilder.reset(descriptor.getEntity(), dbEntity);
 
@@ -72,8 +71,8 @@
 
                 // remove object set for dependent entity, so that it does not show up
                 // on post processing
-                List objects = (List) (isMasterDbEntity ? objectsByDescriptor
-                        .get(descriptor) : objectsByDescriptor.remove(descriptor));
+                List<Persistent> objects = isMasterDbEntity ? objectsByDescriptor
+                        .get(descriptor) : objectsByDescriptor.remove(descriptor);
 
                 if (objects.isEmpty()) {
                     continue;
@@ -86,11 +85,10 @@
                     sorter.sortObjectsForEntity(descriptor.getEntity(), objects, false);
                 }
 
-                for (Iterator k = objects.iterator(); k.hasNext();) {
-                    Persistent o = (Persistent) k.next();
+                for (Persistent o : objects) {
 
-                    Map snapshot = diffBuilder.buildDBDiff(parent.objectDiff(o
-                            .getObjectId()));
+                    Map<Object, Object> snapshot = diffBuilder.buildDBDiff(parent
+                            .objectDiff(o.getObjectId()));
 
                     batch.add(snapshot, o.getObjectId());
                 }
@@ -100,9 +98,11 @@
         }
     }
 
-    void createPermIdsForObjEntity(ClassDescriptor descriptor, List dataObjects) {
+    void createPermIdsForObjEntity(
+            ClassDescriptor descriptor,
+            Collection<Persistent> objects) {
 
-        if (dataObjects.isEmpty()) {
+        if (objects.isEmpty()) {
             return;
         }
 
@@ -110,25 +110,21 @@
         DbEntity dbEntity = objEntity.getDbEntity();
         DataNode node = parent.getDomain().lookupDataNode(dbEntity.getDataMap());
         boolean supportsGeneratedKeys = node.getAdapter().supportsGeneratedKeys();
-        
-        PkGenerator pkGenerator = node.getAdapter().getPkGenerator();
 
-        Iterator i = dataObjects.iterator();
-        while (i.hasNext()) {
+        PkGenerator pkGenerator = node.getAdapter().getPkGenerator();
 
-            Persistent object = (Persistent) i.next();
+        for (Persistent object : objects) {
             ObjectId id = object.getObjectId();
             if (id == null || !id.isTemporary()) {
                 continue;
             }
 
             // modify replacement id directly...
-            Map idMap = id.getReplacementIdMap();
+            Map<String, Object> idMap = id.getReplacementIdMap();
 
             boolean autoPkDone = false;
-            Iterator it = dbEntity.getPrimaryKeys().iterator();
-            while (it.hasNext()) {
-                DbAttribute dbAttr = (DbAttribute) it.next();
+
+            for (DbAttribute dbAttr : dbEntity.getPrimaryKeys()) {
                 String dbAttrName = dbAttr.getName();
 
                 if (idMap.containsKey(dbAttrName)) {
@@ -136,7 +132,7 @@
                 }
 
                 // handle meaningful PK
-                ObjAttribute objAttr = (ObjAttribute) objEntity.getAttributeForDbAttribute(dbAttr);
+                ObjAttribute objAttr = objEntity.getAttributeForDbAttribute(dbAttr);
                 if (objAttr != null) {
 
                     Object value = descriptor
@@ -144,7 +140,7 @@
                             .readPropertyDirectly(object);
 
                     if (value != null) {
-                        Class javaClass = objAttr.getJavaClass();
+                        Class<?> javaClass = objAttr.getJavaClass();
                         if (javaClass.isPrimitive()
                                 && value instanceof Number
                                 && ((Number) value).intValue() == 0) {
@@ -158,7 +154,7 @@
                         }
                     }
                 }
-                
+
                 // skip db-generated
                 if (supportsGeneratedKeys && dbAttr.isGenerated()) {
                     continue;
@@ -168,7 +164,7 @@
                 if (isPropagated(dbAttr)) {
                     continue;
                 }
-                
+
                 // only a single key can be generated from DB... if this is done already
                 // in this loop, we must bail out.
                 if (autoPkDone) {
@@ -192,7 +188,7 @@
 
     // TODO, andrus 4/12/2006 - move to DbAttribute in 2.0+
     boolean isPropagated(DbAttribute attribute) {
-        Iterator it = attribute.getEntity().getRelationships().iterator();
+        Iterator<?> it = attribute.getEntity().getRelationships().iterator();
         while (it.hasNext()) {
 
             DbRelationship dbRel = (DbRelationship) it.next();
@@ -200,9 +196,7 @@
                 continue;
             }
 
-            Iterator joins = dbRel.getJoins().iterator();
-            while (joins.hasNext()) {
-                DbJoin join = (DbJoin) joins.next();
+            for (DbJoin join : dbRel.getJoins()) {
                 if (attribute.getName().equals(join.getSourceName())) {
                     return true;
                 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java?rev=606572&r1=606571&r2=606572&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java Sun Dec 23 08:34:56 2007
@@ -53,14 +53,14 @@
  */
 abstract class DataDomainSyncBucket {
 
-    final Map<ClassDescriptor, Collection<Object>> objectsByDescriptor;
+    final Map<ClassDescriptor, List<Persistent>> objectsByDescriptor;
     final DataDomainFlushAction parent;
 
     List<DbEntity> dbEntities;
     Map<DbEntity, Collection<ClassDescriptor>> descriptorsByDbEntity;
 
     DataDomainSyncBucket(DataDomainFlushAction parent) {
-        this.objectsByDescriptor = new HashMap<ClassDescriptor, Collection<Object>>();
+        this.objectsByDescriptor = new HashMap<ClassDescriptor, List<Persistent>>();
         this.parent = parent;
     }
 
@@ -152,12 +152,12 @@
         }
     }
 
-    void addDirtyObject(Object object, ClassDescriptor descriptor) {
+    void addDirtyObject(Persistent object, ClassDescriptor descriptor) {
 
-        Collection<Object> objects = objectsByDescriptor.get(descriptor);
+        List<Persistent> objects = objectsByDescriptor.get(descriptor);
         if (objects == null) {
 
-            objects = new ArrayList<Object>();
+            objects = new ArrayList<Persistent>();
             objectsByDescriptor.put(descriptor, objects);
         }