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) {