Author: dkazimirchyk
Date: Wed Oct  9 09:14:02 2013
New Revision: 1530540

URL: http://svn.apache.org/r1530540
Log:
CAY-1798 ROP: Reverse relationships of prefetched entity objects are not filled 
during server to client objects conversion.

Modified:
    
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java

Modified: 
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java?rev=1530540&r1=1530539&r2=1530540&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
 Wed Oct  9 09:14:02 2013
@@ -30,6 +30,7 @@ import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.PrefetchTreeNode;
+import org.apache.cayenne.reflect.ArcProperty;
 import org.apache.cayenne.reflect.AttributeProperty;
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.reflect.PropertyDescriptor;
@@ -98,6 +99,20 @@ public class ObjectDetachOperation {
 
         descriptor.visitProperties(new PropertyVisitor() {
 
+               private void fillReverseRelationship(Object destinationTarget, 
ArcProperty property) {
+                               ArcProperty reverseProperty = 
property.getComplimentaryReverseArc();
+
+                               if (reverseProperty != null && reverseProperty 
instanceof ToOneProperty) {
+
+                                       ClassDescriptor desc = 
targetResolver.getClassDescriptor(
+                                                       
reverseProperty.getRelationship().getSourceEntity().getName());
+
+                                       ToOneProperty targetReverseProperty =
+                                                       (ToOneProperty) 
desc.getProperty(reverseProperty.getName());
+                                       
targetReverseProperty.writeProperty(destinationTarget, null, target);
+                               }
+               }
+
             public boolean visitToOne(ToOneProperty property) {
                 if (prefetchTree != null) {
 
@@ -110,6 +125,10 @@ public class ObjectDetachOperation {
                                 destinationSource,
                                 property.getTargetDescriptor(),
                                 child) : null;
+                                
+                        if (destinationTarget != null) {
+                            fillReverseRelationship(destinationTarget, 
property);
+                        }
 
                         ToOneProperty targetProperty = (ToOneProperty) 
targetDescriptor
                                 .getProperty(property.getName());
@@ -142,6 +161,10 @@ public class ObjectDetachOperation {
                                     ? detach(destinationSource, property
                                         .getTargetDescriptor(), child)
                                         : null;
+                                
+                                if (destinationTarget != null) {
+                                    fillReverseRelationship(destinationTarget, 
property);
+                                }
 
                                 targetMap.put(entry.getKey(), 
destinationTarget);
                             }
@@ -156,7 +179,11 @@ public class ObjectDetachOperation {
                                         ? detach(destinationSource, property
                                                 .getTargetDescriptor(), child)
                                         : null;
-    
+                                        
+                                if (destinationTarget != null) {
+                                       
fillReverseRelationship(destinationTarget, property);
+                                }
+                                
                                 targetCollection.add(destinationTarget);
                             }
                             targetValue = targetCollection;


Reply via email to