Author: aadamchik
Date: Wed Aug  8 07:57:47 2007
New Revision: 563907

URL: http://svn.apache.org/viewvc?view=rev&rev=563907
Log:
CAY-843 Remove arbitrary reverse relationship mapping limitations 
(preventing FK attributes on entity sync)

Modified:
    
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java?view=diff&rev=563907&r1=563906&r2=563907
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
 Wed Aug  8 07:57:47 2007
@@ -189,6 +189,7 @@
         List missing = new ArrayList();
         Iterator it = objEntity.getDbEntity().getAttributes().iterator();
         Collection rels = objEntity.getDbEntity().getRelationships();
+        Collection incomingRels = 
getIncomingRelationships(objEntity.getDbEntity());
 
         while (it.hasNext()) {
             DbAttribute dba = (DbAttribute) it.next();
@@ -220,11 +221,48 @@
             if (isFK) {
                 continue;
             }
+            
+            // check incoming relationships
+            rit = incomingRels.iterator();
+            while (!isFK && rit.hasNext()) {
+                DbRelationship rel = (DbRelationship) rit.next();
+                Iterator jit = rel.getJoins().iterator();
+                while (jit.hasNext()) {
+                    DbJoin join = (DbJoin) jit.next();
+                    if (join.getTarget() == dba) {
+                        isFK = true;
+                        break;
+                    }
+                }
+            }
+            
+            if (isFK) {
+                continue;
+            }
 
             missing.add(dba);
         }
 
         return missing;
+    }
+    
+    private Collection getIncomingRelationships(DbEntity entity) {
+        
+        Collection incoming = new ArrayList();
+        Iterator entities = entity.getDataMap().getDbEntities().iterator();
+        while(entities.hasNext()) {
+            DbEntity nextEntity = (DbEntity) entities.next();
+            
+            Iterator relationships = nextEntity.getRelationships().iterator();
+            while(relationships.hasNext()) {
+                DbRelationship relationship = (DbRelationship) 
relationships.next();
+                if(entity == relationship.getTargetEntity()) {
+                    incoming.add(relationship);
+                }
+            }
+        }
+        
+        return incoming;
     }
 
     protected List getRelationshipsToAdd(ObjEntity objEntity) {


Reply via email to