Author: aadamchik
Date: Sat Nov 25 21:51:01 2006
New Revision: 479283

URL: http://svn.apache.org/viewvc?view=rev&rev=479283
Log:
CAY-686: Weed out DataObject references from the access stack classes, 
replacing them with Persistent and ClassDescriptor
(cleaned up DeleteAction)

Modified:
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextDeleteAction.java
    
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DeleteRulesTest.java

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextDeleteAction.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextDeleteAction.java?view=diff&rev=479283&r1=479282&r2=479283
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextDeleteAction.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextDeleteAction.java
 Sat Nov 25 21:51:01 2006
@@ -20,18 +20,23 @@
 package org.apache.cayenne.access;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
 import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.DataObject;
 import org.apache.cayenne.DeleteDenyException;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.map.DeleteRule;
 import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.reflect.ArcProperty;
+import org.apache.cayenne.reflect.AttributeProperty;
 import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.reflect.PropertyVisitor;
+import org.apache.cayenne.reflect.ToManyProperty;
+import org.apache.cayenne.reflect.ToOneProperty;
 
 /**
  * Helper class that implements DataObject deletion strategy.
@@ -109,7 +114,7 @@
         object.setObjectContext(null);
     }
 
-    private void processDeleteRules(Persistent object, int oldState)
+    private void processDeleteRules(final Persistent object, int oldState)
             throws DeleteDenyException {
 
         ClassDescriptor descriptor = 
dataContext.getEntityResolver().getClassDescriptor(
@@ -129,8 +134,9 @@
 
             List relatedObjects = Collections.EMPTY_LIST;
 
-            Object related = 
descriptor.getProperty(relationship.getName()).readProperty(
-                    object);
+            ArcProperty property = (ArcProperty) 
descriptor.getProperty(relationship
+                    .getName());
+            Object related = property.readProperty(object);
 
             if (relationship.isToMany()) {
 
@@ -180,34 +186,42 @@
                 case DeleteRule.NO_ACTION:
                     break;
                 case DeleteRule.NULLIFY:
-                    ObjRelationship inverseRelationship = relationship
-                            .getReverseRelationship();
+                    ArcProperty reverseArc = 
property.getComplimentaryReverseArc();
 
-                    if (inverseRelationship == null) {
+                    if (reverseArc == null) {
                         // nothing we can do here
                         break;
                     }
 
-                    if (inverseRelationship.isToMany()) {
-                        Iterator iterator = relatedObjects.iterator();
-                        while (iterator.hasNext()) {
-                            DataObject relatedObject = (DataObject) 
iterator.next();
-                            
relatedObject.removeToManyTarget(inverseRelationship
-                                    .getName(), (DataObject) object, true);
+                    final Collection finalRelatedObjects = relatedObjects;
+
+                    reverseArc.visit(new PropertyVisitor() {
+
+                        public boolean visitAttribute(AttributeProperty 
property) {
+                            return false;
                         }
-                    }
-                    else {
-                        // Inverse is to-one - find all related objects and
-                        // nullify the reverse relationship
-                        Iterator iterator = relatedObjects.iterator();
-                        while (iterator.hasNext()) {
-                            DataObject relatedObject = (DataObject) 
iterator.next();
-                            relatedObject.setToOneTarget(
-                                    inverseRelationship.getName(),
-                                    null,
-                                    true);
+
+                        public boolean visitToMany(ToManyProperty property) {
+                            Iterator iterator = finalRelatedObjects.iterator();
+                            while (iterator.hasNext()) {
+                                Object relatedObject = iterator.next();
+                                property.removeTarget(relatedObject, object, 
true);
+                            }
+
+                            return false;
                         }
-                    }
+
+                        public boolean visitToOne(ToOneProperty property) {
+                            // Inverse is to-one - find all related objects and
+                            // nullify the reverse relationship
+                            Iterator iterator = finalRelatedObjects.iterator();
+                            while (iterator.hasNext()) {
+                                Object relatedObject = iterator.next();
+                                property.setTarget(relatedObject, null, true);
+                            }
+                            return false;
+                        }
+                    });
 
                     break;
                 case DeleteRule.CASCADE:

Modified: 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DeleteRulesTest.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DeleteRulesTest.java?view=diff&rev=479283&r1=479282&r2=479283
==============================================================================
--- 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DeleteRulesTest.java
 (original)
+++ 
incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DeleteRulesTest.java
 Sat Nov 25 21:51:01 2006
@@ -331,6 +331,10 @@
 
         if (reverse != null) {
             reverse.getSourceEntity().removeRelationship(reverse.getName());
+            
context.getEntityResolver().getClassDescriptorMap().removeDescriptor(
+                    "DeleteRuleFlatA");
+            
context.getEntityResolver().getClassDescriptorMap().removeDescriptor(
+                    "DeleteRuleFlatB");
         }
 
         return reverse;
@@ -343,6 +347,10 @@
         ObjRelationship relationship = (ObjRelationship) entity
                 .getRelationship(DeleteRuleFlatA.FLAT_B_PROPERTY);
         relationship.getTargetEntity().addRelationship(reverse);
+        context.getEntityResolver().getClassDescriptorMap().removeDescriptor(
+                "DeleteRuleFlatA");
+        context.getEntityResolver().getClassDescriptorMap().removeDescriptor(
+                "DeleteRuleFlatB");
     }
 
     private void assertJoinDeleted(DeleteRuleFlatA a, DeleteRuleFlatB b) {


Reply via email to