continue;
}
List relatedObjects = Collections.EMPTY_LIST;
ArcProperty property = (ArcProperty) descriptor.getProperty(relationship
.getName());
Object related = property.readProperty(object);
if (relationship.isToMany()) {
List toMany = (List) related;
if (toMany.size() > 0) {
// Get a copy of the list so that deleting objects doesn't
// result in concurrent modification exceptions
relatedObjects = new ArrayList(toMany);
}
}
else {
if (related != null) {
relatedObjects = Collections.singletonList(related);
}
}
// no related object, bail out
if (relatedObjects.size() == 0) {
continue;
}
// process DENY rule first...
if (relationship.getDeleteRule() == DeleteRule.DENY) {
object.setPersistenceState(oldState);
String message = relatedObjects.size() == 1
? "1 related object"
: relatedObjects.size() + " related objects";
throw new DeleteDenyException(object, relationship.getName(), message);
}
// process flattened with dependent join tables...
// joins must be removed even if they are non-existent or ignored in the
// object graph
if (processFlattened) {
ObjectStore objectStore = dataContext.getObjectStore();
Iterator iterator = relatedObjects.iterator();
while (iterator.hasNext()) {
Persistent relatedObject = (Persistent) iterator.next();
objectStore.arcDeleted(object.getObjectId(), relatedObject
.getObjectId(), relationship.getName());
}
}
// process remaining rules
switch (relationship.getDeleteRule()) {
case DeleteRule.NO_ACTION:
break;
case DeleteRule.NULLIFY:
ArcProperty reverseArc = property.getComplimentaryReverseArc();
if (reverseArc == null) {
// nothing we can do here
break;
}
final Collection finalRelatedObjects = relatedObjects;
reverseArc.visit(new PropertyVisitor() {
public boolean visitAttribute(AttributeProperty property) {
return false;
}