Re: svn commit: r881740 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/ main/java/org/apache/cayenne/access/ main/java/org/apache/cayenne/reflect/ main/java/org/apache/cayenne/remote/ test/java/org/apa

From: Andrey Razumovsky (razumovsky.andre..mail.com)
Date: Wed Nov 18 2009 - 13:57:38 EST

  • Next message: Apache Hudson Server: "Hudson build is back to normal: Cayenne-trunk » JDK 1.5 (latest),HSQLDB #40"

    Sorry for that. Missed to check that module.
    Actually what caused the error is breakage in code generation. Need to check
    it first..

    2009/11/18 Ольга Ткачева <tkachovaolg..mail.com>

    > Andrey, after your commit I have this problem:
    >
    > [INFO] Compilation failure
    >
    > /home/olga/cayenne-git/framework/cayenne-tools/src/test/java/org/apache/cayenne/gen/ClientDataMapGeneratedQueryRunTest.java:[59,86]
    > incompatible types
    > found : java.util.List<org.apache.cayenne.testdo.mt.MtTable1>
    > required: java.util.List<org.apache.cayenne.testdo.mt.ClientMtTable1>
    >
    > and reasonable error in cayenne-tools.
    >
    >
    > 2009/11/18 <andre..pache.org>
    >
    > > Author: andrey
    > > Date: Wed Nov 18 12:08:20 2009
    > > New Revision: 881740
    > >
    > > URL: http://svn.apache.org/viewvc?rev=881740&view=rev
    > > Log:
    > > CAY-1312 Allow lifecycle callbacks on ROP client. Only method invokes,
    > i.e.
    > > no configuration for those callbacks yet
    > >
    > > Added:
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java
    > > - copied, changed from r881253,
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java
    > > Removed:
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextDeleteAction.java
    > > Modified:
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java
    > >
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/BaseContext.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -33,6 +33,7 @@
    > > import org.apache.cayenne.graph.GraphEvent;
    > > import org.apache.cayenne.graph.GraphManager;
    > > import org.apache.cayenne.map.EntityResolver;
    > > +import org.apache.cayenne.map.LifecycleEvent;
    > > import org.apache.cayenne.map.ObjEntity;
    > > import org.apache.cayenne.query.ObjectIdQuery;
    > > import org.apache.cayenne.query.Query;
    > >.. -103,8 +104,6 @@
    > >
    > > public abstract void commitChangesToParent();
    > >
    > > - public abstract void deleteObject(Object object) throws
    > > DeleteDenyException;
    > > -
    > > public abstract Collection<?> deletedObjects();
    > >
    > > public DataChannel getChannel() {
    > >.. -381,9 +380,24 @@
    > > }
    > >
    > > /**
    > > - * If ObjEntity qualifier is set, asks it to inject initial value to
    > > an object
    > > + * If ObjEntity qualifier is set, asks it to inject initial value to
    > > an object.
    > > + * Also performs all Persistent initialization operations
    > > */
    > > - protected void injectInitialValue(Object object) {
    > > + protected void injectInitialValue(Object obj) {
    > > + // must follow this exact order of property initialization per
    > > CAY-653, i.e. have
    > > + // the id and the context in place BEFORE setPersistence is
    > called
    > > +
    > > + Persistent object = (Persistent) obj;
    > > +
    > > + object.setObjectContext(this);
    > > + object.setPersistenceState(PersistenceState.NEW);
    > > +
    > > + GraphManager graphManager = getGraphManager();
    > > + synchronized (graphManager) {
    > > + graphManager.registerNode(object.getObjectId(), object);
    > > + graphManager.nodeCreated(object.getObjectId());
    > > + }
    > > +
    > > ObjEntity entity;
    > > try {
    > > entity =
    > > getEntityResolver().lookupObjEntity(object.getClass());
    > >.. -398,5 +412,37 @@
    > > ((ValueInjector)
    > > entity.getDeclaredQualifier()).injectValue(object);
    > > }
    > > }
    > > +
    > > + // invoke callbacks
    > > + getEntityResolver().getCallbackRegistry().performCallbacks(
    > > + LifecycleEvent.POST_ADD,
    > > + object);
    > > + }
    > > +
    > > + /**
    > > + * Schedules an object for deletion on the next commit of this
    > > context. Object's
    > > + * persistence state is changed to PersistenceState.DELETED; objects
    > > related to this
    > > + * object are processed according to delete rules, i.e.
    > relationships
    > > can be unset
    > > + * ("nullify" rule), deletion operation is cascaded (cascade rule).
    > > + *
    > > + *..aram object a persistent object that we want to delete.
    > > + *..hrows DeleteDenyException if a DENY delete rule is applicable
    > for
    > > object
    > > + * deletion.
    > > + *..hrows NullPointerException if object is null.
    > > + */
    > > + public void deleteObject(Object object) {
    > > + new ObjectContextDeleteAction(this).performDelete((Persistent)
    > > object);
    > > + }
    > > +
    > > + public void deleteObjects(Collection<?> objects) throws
    > > DeleteDenyException {
    > > + if (objects.isEmpty())
    > > + return;
    > > +
    > > + // Don't call deleteObject() directly since it would be less
    > > efficient.
    > > + ObjectContextDeleteAction ocda = new
    > > ObjectContextDeleteAction(this);
    > > +
    > > + // Make a copy to iterate over to avoid
    > > ConcurrentModificationException.
    > > + for (Persistent object : (ArrayList<Persistent>) new
    > > ArrayList(objects))
    > > + ocda.performDelete(object);
    > > }
    > > }
    > > \ No newline at end of file
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContext.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -308,27 +308,6 @@
    > > }
    > >
    > > /**
    > > - * Deletes an object locally, scheduling it for future deletion from
    > > the external data
    > > - * store.
    > > - */
    > > - ..verride
    > > - public void deleteObject(Object object) {
    > > - new ObjectContextDeleteAction(this).performDelete((Persistent)
    > > object);
    > > - }
    > > -
    > > - public void deleteObjects(Collection<?> objects) throws
    > > DeleteDenyException {
    > > - if (objects.isEmpty())
    > > - return;
    > > -
    > > - // Don't call deleteObject() directly since it would be less
    > > efficient.
    > > - ObjectContextDeleteAction ocda = new
    > > ObjectContextDeleteAction(this);
    > > -
    > > - // Make a copy to iterate over to avoid
    > > ConcurrentModificationException.
    > > - for (Persistent object : (ArrayList<Persistent>) new
    > > ArrayList(objects))
    > > - ocda.performDelete(object);
    > > - }
    > > -
    > > - /**
    > > * Creates and registers a new Persistent object instance.
    > > */
    > > ..verride
    > >.. -527,16 +506,6 @@
    > > object.setObjectId(id);
    > > }
    > >
    > > - // must follow this exact order of property initialization per
    > > CAY-653, i.e. have
    > > - // the id and the context in place BEFORE setPersistence is
    > called
    > > - object.setObjectContext(this);
    > > - object.setPersistenceState(PersistenceState.NEW);
    > > -
    > > - synchronized (graphManager) {
    > > - graphManager.registerNode(id, object);
    > > - graphManager.nodeCreated(id);
    > > - }
    > > -
    > > injectInitialValue(object);
    > > }
    > >
    > >
    > > Copied:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java
    > > (from r881253,
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java)
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java?p2=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java&p1=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java&r1=881253&r2=881740&rev=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataChannelSyncCallbackAction.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/DataChannelSyncCallbackAction.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -16,14 +16,13 @@
    > > * specific language governing permissions and limitations
    > > * under the License.
    > > ****************************************************************/
    > > -package org.apache.cayenne.access;
    > > +package org.apache.cayenne;
    > >
    > > import java.util.ArrayList;
    > > import java.util.Collection;
    > > import java.util.HashSet;
    > > import java.util.Set;
    > >
    > > -import org.apache.cayenne.DataChannel;
    > > import org.apache.cayenne.graph.GraphChangeHandler;
    > > import org.apache.cayenne.graph.GraphDiff;
    > > import org.apache.cayenne.graph.GraphManager;
    > >.. -32,10 +31,11 @@
    > >
    > > /**
    > > *..ince 3.0
    > > + * note: made public in 3.1 to be used in all tiers
    > > */
    > > -abstract class DataChannelSyncCallbackAction implements
    > GraphChangeHandler
    > > {
    > > +public abstract class DataChannelSyncCallbackAction implements
    > > GraphChangeHandler {
    > >
    > > - static DataChannelSyncCallbackAction getCallbackAction(
    > > + public static DataChannelSyncCallbackAction getCallbackAction(
    > > LifecycleCallbackRegistry callbackRegistry,
    > > GraphManager graphManager,
    > > GraphDiff changes,
    > >.. -73,9 +73,9 @@
    > >
    > > protected abstract boolean hasListeners();
    > >
    > > - abstract void applyPreCommit();
    > > + public abstract void applyPreCommit();
    > >
    > > - abstract void applyPostCommit();
    > > + public abstract void applyPostCommit();
    > >
    > > void apply(LifecycleEvent callbackType, Collection<?> objects) {
    > > if (seenIds != null && objects != null) {
    > >.. -166,13 +166,13 @@
    > > }
    > >
    > > ..verride
    > > - void applyPreCommit() {
    > > + public void applyPreCommit() {
    > > apply(LifecycleEvent.PRE_PERSIST, persisted);
    > > apply(LifecycleEvent.PRE_UPDATE, updated);
    > > }
    > >
    > > ..verride
    > > - void applyPostCommit() {
    > > + public void applyPostCommit() {
    > > apply(LifecycleEvent.POST_UPDATE, updated);
    > > apply(LifecycleEvent.POST_REMOVE, removed);
    > > apply(LifecycleEvent.POST_PERSIST, persisted);
    > >.. -192,12 +192,12 @@
    > > }
    > >
    > > ..verride
    > > - void applyPreCommit() {
    > > + public void applyPreCommit() {
    > > // noop
    > > }
    > >
    > > ..verride
    > > - void applyPostCommit() {
    > > + public void applyPostCommit() {
    > > apply(LifecycleEvent.POST_LOAD, updated);
    > > apply(LifecycleEvent.POST_LOAD, removed);
    > > }
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -23,14 +23,14 @@
    > > import java.util.Collection;
    > > import java.util.Collections;
    > > import java.util.Iterator;
    > > +import java.util.Map;
    > >
    > > import org.apache.cayenne.map.DeleteRule;
    > > -import org.apache.cayenne.map.ObjEntity;
    > > +import org.apache.cayenne.map.LifecycleEvent;
    > > 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.Property;
    > > import org.apache.cayenne.reflect.PropertyVisitor;
    > > import org.apache.cayenne.reflect.ToManyProperty;
    > > import org.apache.cayenne.reflect.ToOneProperty;
    > >.. -54,6 +54,10 @@
    > >
    > > if (oldState == PersistenceState.TRANSIENT
    > > || oldState == PersistenceState.DELETED) {
    > > + // Drop out... especially in case of DELETED we might be
    > about
    > > to get
    > > + // into a horrible recursive loop due to CASCADE delete
    > rules.
    > > + // Assume that everything must have been done correctly
    > > already
    > > + // and *don't* do it again
    > > return false;
    > > }
    > >
    > >.. -69,6 +73,11 @@
    > > + ", context: "
    > > + context);
    > > }
    > > +
    > > + // must resolve HOLLOW objects before delete... needed
    > > + // to process relationships and optimistic locking...
    > > +
    > > + context.prepareForAccess(object, null, false);
    > >
    > > if (oldState == PersistenceState.NEW) {
    > > deleteNew(object);
    > >.. -80,133 +89,148 @@
    > > return true;
    > > }
    > >
    > > - private void deleteNew(Persistent object) {
    > > + private void deleteNew(Persistent object) throws DeleteDenyException
    > {
    > > object.setPersistenceState(PersistenceState.TRANSIENT);
    > > processDeleteRules(object, PersistenceState.NEW);
    > > +
    > > + // if an object was NEW, we must throw it out
    > > context.getGraphManager().unregisterNode(object.getObjectId());
    > > }
    > >
    > > - private void deletePersistent(Persistent object) {
    > > + private void deletePersistent(Persistent object) throws
    > > DeleteDenyException {
    > > +
    > > context.getEntityResolver().getCallbackRegistry().performCallbacks(
    > > + LifecycleEvent.PRE_REMOVE,
    > > + object);
    > > +
    > > int oldState = object.getPersistenceState();
    > > object.setPersistenceState(PersistenceState.DELETED);
    > > processDeleteRules(object, oldState);
    > > context.getGraphManager().nodeRemoved(object.getObjectId());
    > > }
    > >
    > > - private void processDeleteRules(final Persistent object, final int
    > > oldState) {
    > > + private Collection toCollection(Object object) {
    > >
    > > - String entityName = object.getObjectId().getEntityName();
    > > - final ObjEntity entity =
    > > context.getEntityResolver().getObjEntity(entityName);
    > > - ClassDescriptor descriptor =
    > > context.getEntityResolver().getClassDescriptor(
    > > - entityName);
    > > + if (object == null) {
    > > + return Collections.EMPTY_LIST;
    > > + }
    > >
    > > - descriptor.visitProperties(new PropertyVisitor() {
    > > + // create copies of collections to avoid iterator exceptions
    > > + if (object instanceof Collection) {
    > > + return new ArrayList((Collection) object);
    > > + }
    > > + else if (object instanceof Map) {
    > > + return new ArrayList(((Map) object).values());
    > > + }
    > > + else {
    > > + return Collections.singleton(object);
    > > + }
    > > + }
    > >
    > > - public boolean visitToMany(ToManyProperty property) {
    > > - ObjRelationship relationship = (ObjRelationship) entity
    > > - .getRelationship(property.getName());
    > > + private void processDeleteRules(final Persistent object, int
    > oldState)
    > > + throws DeleteDenyException {
    > >
    > > - processRules(object, property,
    > > relationship.getDeleteRule(), oldState);
    > > - return true;
    > > - }
    > > + ClassDescriptor descriptor =
    > > context.getEntityResolver().getClassDescriptor(
    > > + object.getObjectId().getEntityName());
    > >
    > > - public boolean visitToOne(ToOneProperty property) {
    > > - ObjRelationship relationship = (ObjRelationship) entity
    > > - .getRelationship(property.getName());
    > > + for (final ObjRelationship relationship :
    > > descriptor.getEntity().getRelationships()) {
    > >
    > > - processRules(object, property,
    > > relationship.getDeleteRule(), oldState);
    > > - return true;
    > > - }
    > > + boolean processFlattened = relationship.isFlattened()
    > > + && relationship.isToDependentEntity()
    > > + && !relationship.isReadOnly();
    > >
    > > - public boolean visitAttribute(AttributeProperty property) {
    > > - return true;
    > > + // first check for no action... bail out if no flattened
    > > processing is needed
    > > + if (relationship.getDeleteRule() == DeleteRule.NO_ACTION &&
    > > !processFlattened) {
    > > + continue;
    > > }
    > > - });
    > > - }
    > > -
    > > - private void processRules(
    > > - Persistent object,
    > > - ArcProperty property,
    > > - int deleteRule,
    > > - int oldState) {
    > > -
    > > - if (deleteRule == DeleteRule.NO_ACTION) {
    > > - return;
    > > - }
    > > -
    > > - Collection<?> relatedObjects = relatedObjects(object, property);
    > > - if (relatedObjects.isEmpty()) {
    > > - return;
    > > - }
    > >
    > > - switch (deleteRule) {
    > > + ArcProperty property = (ArcProperty)
    > > descriptor.getProperty(relationship
    > > + .getName());
    > > + Collection relatedObjects =
    > > toCollection(property.readProperty(object));
    > > +
    > > + // no related object, bail out
    > > + if (relatedObjects.size() == 0) {
    > > + continue;
    > > + }
    > >
    > > - case DeleteRule.DENY:
    > > + // 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,
    > property.getName(),
    > > message);
    > > -
    > > - case DeleteRule.NULLIFY:
    > > - ArcProperty reverseArc =
    > > property.getComplimentaryReverseArc();
    > > + throw new DeleteDenyException(object,
    > > relationship.getName(), message);
    > > + }
    > >
    > > - if (reverseArc != null) {
    > > + // process flattened with dependent join tables...
    > > + // joins must be removed even if they are non-existent or
    > > ignored in the
    > > + // object graph
    > > + if (processFlattened) {
    > > + Iterator iterator = relatedObjects.iterator();
    > > + while (iterator.hasNext()) {
    > > + Persistent relatedObject = (Persistent)
    > > iterator.next();
    > > +
    > > context.getGraphManager().arcDeleted(object.getObjectId(), relatedObject
    > > + .getObjectId(), relationship.getName());
    > > + }
    > > + }
    > >
    > > - if (reverseArc instanceof ToManyProperty) {
    > > - for (Object relatedObject : relatedObjects) {
    > > - ((ToManyProperty) reverseArc).removeTarget(
    > > - relatedObject,
    > > - object,
    > > - true);
    > > - }
    > > + // 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;
    > > }
    > > - else {
    > > - for (Object relatedObject : relatedObjects) {
    > > - ((ToOneProperty) reverseArc).setTarget(
    > > - relatedObject,
    > > - null,
    > > - true);
    > > - }
    > > - }
    > > - }
    > >
    > > - break;
    > > - case DeleteRule.CASCADE:
    > > + final Collection finalRelatedObjects =
    > relatedObjects;
    > >
    > > - Iterator<?> iterator = relatedObjects.iterator();
    > > - while (iterator.hasNext()) {
    > > - Persistent relatedObject = (Persistent)
    > > iterator.next();
    > > + reverseArc.visit(new PropertyVisitor() {
    > >
    > > - // this action object is stateless, so we can use
    > > 'performDelete'
    > > - // recursively.
    > > - performDelete(relatedObject);
    > > - }
    > > + public boolean visitAttribute(AttributeProperty
    > > property) {
    > > + return false;
    > > + }
    > >
    > > - break;
    > > - default:
    > > - object.setPersistenceState(oldState);
    > > - throw new CayenneRuntimeException("Invalid delete rule:
    > "
    > > + deleteRule);
    > > - }
    > > - }
    > > + public boolean visitToMany(ToManyProperty
    > > property) {
    > > + Iterator iterator =
    > > finalRelatedObjects.iterator();
    > > + while (iterator.hasNext()) {
    > > + Object relatedObject = iterator.next();
    > > + property.removeTarget(relatedObject,
    > > object, true);
    > > + }
    > >
    > > - private Collection<?> relatedObjects(Object object, Property
    > property)
    > > {
    > > - Object related = property.readProperty(object);
    > > + return false;
    > > + }
    > >
    > > - if (related == null) {
    > > - return Collections.EMPTY_LIST;
    > > - }
    > > - // return collections by copy, to allow removal of objects from
    > > the underlying
    > > - // relationship inside the iterator
    > > - else if (property instanceof ToManyProperty) {
    > > - Collection<?> relatedCollection = (Collection<?>) related;
    > > - return relatedCollection.isEmpty()
    > > - ? Collections.EMPTY_LIST
    > > - : new ArrayList<Object>(relatedCollection);
    > > - }
    > > - // TODO: andrus 11/21/2007 - ToManyMapProperty check
    > > - else {
    > > - return Collections.singleton(related);
    > > + 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:
    > > + // Delete all related objects
    > > + Iterator iterator = relatedObjects.iterator();
    > > + while (iterator.hasNext()) {
    > > + Persistent relatedObject = (Persistent)
    > > iterator.next();
    > > + performDelete(relatedObject);
    > > + }
    > > +
    > > + break;
    > > + default:
    > > + object.setPersistenceState(oldState);
    > > + throw new CayenneRuntimeException("Invalid delete
    > rule
    > > "
    > > + + relationship.getDeleteRule());
    > > + }
    > > }
    > > }
    > > }
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -35,7 +35,6 @@
    > > import org.apache.cayenne.DataChannel;
    > > import org.apache.cayenne.DataObject;
    > > import org.apache.cayenne.DataRow;
    > > -import org.apache.cayenne.DeleteDenyException;
    > > import org.apache.cayenne.Fault;
    > > import org.apache.cayenne.ObjectContext;
    > > import org.apache.cayenne.ObjectId;
    > >.. -54,7 +53,6 @@
    > > import org.apache.cayenne.map.DbJoin;
    > > import org.apache.cayenne.map.DbRelationship;
    > > import org.apache.cayenne.map.EntityResolver;
    > > -import org.apache.cayenne.map.LifecycleEvent;
    > > import org.apache.cayenne.map.ObjAttribute;
    > > import org.apache.cayenne.map.ObjEntity;
    > > import org.apache.cayenne.map.ObjRelationship;
    > >.. -629,18 +627,9 @@
    > > // note that the order of initialization of persistence artifacts
    > > below is
    > > // important - do not change it lightly
    > > object.setObjectId(id);
    > > - object.setObjectContext(this);
    > > - object.setPersistenceState(PersistenceState.NEW);
    > > - getObjectStore().registerNode(id, object);
    > > - getObjectStore().nodeCreated(id);
    > >
    > > injectInitialValue(object);
    > >
    > > - // invoke callbacks
    > > - getEntityResolver().getCallbackRegistry().performCallbacks(
    > > - LifecycleEvent.POST_ADD,
    > > - object);
    > > -
    > > return object;
    > > }
    > >
    > >.. -684,21 +673,17 @@
    > > else {
    > > persistent.setObjectId(new ObjectId(entity.getName()));
    > > }
    > > -
    > > - persistent.setObjectContext(this);
    > > - persistent.setPersistenceState(PersistenceState.NEW);
    > > -
    > > - getObjectStore().registerNode(persistent.getObjectId(), object);
    > > - getObjectStore().nodeCreated(persistent.getObjectId());
    > > -
    > > - // now we need to find all arc changes, inject missing value
    > > holders and pull in
    > > - // all transient connected objects
    > > -
    > > +
    > > ClassDescriptor descriptor =
    > > getEntityResolver().getClassDescriptor(
    > > entity.getName());
    > > if (descriptor == null) {
    > > throw new IllegalArgumentException("Invalid entity name: " +
    > > entity.getName());
    > > }
    > > +
    > > + injectInitialValue(object);
    > > +
    > > + // now we need to find all arc changes, inject missing value
    > > holders and pull in
    > > + // all transient connected objects
    > >
    > > descriptor.visitProperties(new PropertyVisitor() {
    > >
    > >.. -752,13 +737,6 @@
    > > return true;
    > > }
    > > });
    > > -
    > > - injectInitialValue(object);
    > > -
    > > - // invoke callbacks
    > > - getEntityResolver().getCallbackRegistry().performCallbacks(
    > > - LifecycleEvent.POST_ADD,
    > > - persistent);
    > > }
    > >
    > > /**
    > >.. -773,48 +751,6 @@
    > > }
    > >
    > > /**
    > > - * Schedules all objects in the collection for deletion on the next
    > > commit of this
    > > - * DataContext. Object's persistence state is changed to
    > > PersistenceState.DELETED;
    > > - * objects related to this object are processed according to delete
    > > rules, i.e.
    > > - * relationships can be unset ("nullify" rule), deletion operation
    > is
    > > cascaded
    > > - * (cascade rule).
    > > - * <p>
    > > - * <i>"Nullify" delete rule side effect: </i> passing a collection
    > > representing
    > > - * to-many relationship with nullify delete rule may result in
    > objects
    > > being removed
    > > - * from collection.
    > > - * </p>
    > > - *
    > > - *..ince 1.2
    > > - */
    > > - public void deleteObjects(Collection objects) {
    > > - if (objects.isEmpty()) {
    > > - return;
    > > - }
    > > -
    > > - // clone object list... this maybe a relationship collection
    > with
    > > nullify delete
    > > - // rule, so modifying
    > > - for (Persistent object : new ArrayList<Persistent>(objects)) {
    > > - deleteObject(object);
    > > - }
    > > - }
    > > -
    > > - /**
    > > - * Schedules an object for deletion on the next commit of this
    > > DataContext. Object's
    > > - * persistence state is changed to PersistenceState.DELETED; objects
    > > related to this
    > > - * object are processed according to delete rules, i.e.
    > relationships
    > > can be unset
    > > - * ("nullify" rule), deletion operation is cascaded (cascade rule).
    > > - *
    > > - *..aram object a persistent object that we want to delete.
    > > - *..hrows DeleteDenyException if a DENY delete rule is applicable
    > for
    > > object
    > > - * deletion.
    > > - *..hrows NullPointerException if object is null.
    > > - */
    > > - ..verride
    > > - public void deleteObject(Object object) throws DeleteDenyException {
    > > - new DataContextDeleteAction(this).performDelete((Persistent)
    > > object);
    > > - }
    > > -
    > > - /**
    > > * If the parent channel is a DataContext, reverts local changes to
    > > make this context
    > > * look like the parent, if the parent channel is a DataDomain,
    > reverts
    > > all changes.
    > > *
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -28,6 +28,7 @@
    > >
    > > import org.apache.cayenne.CayenneRuntimeException;
    > > import org.apache.cayenne.DataChannel;
    > > +import org.apache.cayenne.DataChannelSyncCallbackAction;
    > > import org.apache.cayenne.ObjectContext;
    > > import org.apache.cayenne.QueryResponse;
    > > import org.apache.cayenne.access.jdbc.BatchQueryBuilderFactory;
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/LifecycleCallbackRegistry.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -99,6 +99,7 @@
    > > */
    > > public void addListener(Class<?> entityClass, LifecycleListener
    > > listener) {
    > > addListener(LifecycleEvent.POST_ADD, entityClass, listener,
    > > "postAdd");
    > > + addListener(LifecycleEvent.POST_PERSIST, entityClass, listener,
    > > "prePersist");
    > > addListener(LifecycleEvent.POST_PERSIST, entityClass, listener,
    > > "postPersist");
    > > addListener(LifecycleEvent.PRE_REMOVE, entityClass, listener,
    > > "preRemove");
    > > addListener(LifecycleEvent.POST_REMOVE, entityClass, listener,
    > > "postRemove");
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/ClientChannel.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -24,6 +24,7 @@
    > >
    > > import org.apache.cayenne.CayenneRuntimeException;
    > > import org.apache.cayenne.DataChannel;
    > > +import org.apache.cayenne.DataChannelSyncCallbackAction;
    > > import org.apache.cayenne.ObjectContext;
    > > import org.apache.cayenne.ObjectId;
    > > import org.apache.cayenne.Persistent;
    > >.. -169,6 +170,14 @@
    > > ObjectContext originatingContext,
    > > GraphDiff changes,
    > > int syncType) {
    > > +
    > > + DataChannelSyncCallbackAction callbackAction =
    > > DataChannelSyncCallbackAction
    > > + .getCallbackAction(
    > > + getEntityResolver().getCallbackRegistry(),
    > > + originatingContext.getGraphManager(),
    > > + changes,
    > > + syncType);
    > > + callbackAction.applyPreCommit();
    > >
    > > changes = diffCompressor.compress(changes);
    > >
    > >.. -221,6 +230,7 @@
    > > }
    > > }
    > >
    > > + callbackAction.applyPostCommit();
    > > return replyDiff;
    > > }
    > >
    > >
    > > Added:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java?rev=881740&view=auto
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java
    > > (added)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCallbacksTest.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -0,0 +1,114 @@
    > > +/*****************************************************************
    > > + * Licensed to the Apache Software Foundation (ASF) under one
    > > + * or more contributor license agreements. See the NOTICE file
    > > + * distributed with this work for additional information
    > > + * regarding copyright ownership. The ASF licenses this file
    > > + * to you under the Apache License, Version 2.0 (the
    > > + * "License"); you may not use this file except in compliance
    > > + * with the License. You may obtain a copy of the License at
    > > + *
    > > + * http://www.apache.org/licenses/LICENSE-2.0
    > > + *
    > > + * Unless required by applicable law or agreed to in writing,
    > > + * software distributed under the License is distributed on an
    > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    > > + * KIND, either express or implied. See the License for the
    > > + * specific language governing permissions and limitations
    > > + * under the License.
    > > + ****************************************************************/
    > > +package org.apache.cayenne.remote;
    > > +
    > > +import org.apache.cayenne.LifecycleListener;
    > > +import org.apache.cayenne.ObjectContext;
    > > +import org.apache.cayenne.testdo.mt.ClientMtLifecycles;
    > > +
    > > +public class RemoteCallbacksTest extends RemoteCayenneCase implements
    > > LifecycleListener {
    > > + private int added, loaded, prePersisted, postPersisted, preRemoved,
    > > postRemoved, preUpdated, postUpdated;
    > > +
    > > + ..verride
    > > + public void setUp() throws Exception {
    > > + super.setUp();
    > > + added = 0;
    > > + loaded = 0;
    > > + prePersisted = 0;
    > > + postPersisted = 0;
    > > + preRemoved = 0;
    > > + postRemoved = 0;
    > > + preUpdated = 0;
    > > + postUpdated = 0;
    > > + }
    > > +
    > > + public void testDefault() throws InterruptedException {
    > > + ObjectContext context = createROPContext();
    > > +
    > >
    > context.getEntityResolver().getCallbackRegistry().addListener(ClientMtLifecycles.class,
    > > this);
    > > +
    > > + assertAll(0, 0, 0, 0, 0, 0, 0, 0);
    > > + ClientMtLifecycles l1 =
    > > context.newObject(ClientMtLifecycles.class);
    > > +
    > > + assertAll(1, 0, 0, 0, 0, 0, 0, 0);
    > > + l1.setName("x");
    > > + assertAll(1, 0, 0, 0, 0, 0, 0, 0);
    > > +
    > > + context.commitChanges();
    > > + Thread.sleep(5); //until commit
    > > + assertAll(1, 0, 1, 1, 0, 0, 0, 0);
    > > +
    > > + l1.setName("x2");
    > > + assertAll(1, 0, 1, 1, 0, 0, 0, 0);
    > > +
    > > + context.commitChanges();
    > > + Thread.sleep(5); //until commit
    > > + assertAll(1, 0, 1, 1, 1, 1, 0, 0);
    > > +
    > > + context.deleteObject(l1);
    > > + assertAll(1, 0, 1, 1, 1, 1, 1, 0);
    > > +
    > > + context.commitChanges();
    > > + Thread.sleep(5); //until commit
    > > + assertAll(1, 0, 1, 1, 1, 1, 1, 1);
    > > + }
    > > +
    > > + private void assertAll(int added, int loaded, int prePersisted, int
    > > postPersisted,
    > > + int preUpdated, int postUpdated, int preRemoved, int
    > > postRemoved) {
    > > + assertEquals(this.added, added);
    > > + assertEquals(this.loaded, loaded);
    > > + assertEquals(this.prePersisted, prePersisted);
    > > + assertEquals(this.postPersisted, postPersisted);
    > > + assertEquals(this.preRemoved, preRemoved);
    > > + assertEquals(this.postRemoved, postRemoved);
    > > + assertEquals(this.preUpdated, preUpdated);
    > > + assertEquals(this.postUpdated, postUpdated);
    > > + }
    > > +
    > > + public void postAdd(Object entity) {
    > > + added++;
    > > + }
    > > +
    > > + public void postLoad(Object entity) {
    > > + loaded++;
    > > + }
    > > +
    > > + public void postPersist(Object entity) {
    > > + postPersisted++;
    > > + }
    > > +
    > > + public void postRemove(Object entity) {
    > > + postRemoved++;
    > > + }
    > > +
    > > + public void postUpdate(Object entity) {
    > > + postUpdated++;
    > > + }
    > > +
    > > + public void prePersist(Object entity) {
    > > + prePersisted++;
    > > + }
    > > +
    > > + public void preRemove(Object entity) {
    > > + preRemoved++;
    > > + }
    > > +
    > > + public void preUpdate(Object entity) {
    > > + preUpdated++;
    > > + }
    > > +}
    > >
    > > Added:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java?rev=881740&view=auto
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java
    > > (added)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/ClientMtLifecycles.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -0,0 +1,10 @@
    > > +package org.apache.cayenne.testdo.mt;
    > > +
    > > +import org.apache.cayenne.testdo.mt.auto._ClientMtLifecycles;
    > > +
    > > +/**
    > > + * A persistent class mapped as "MtLifecycles" Cayenne entity.
    > > + */
    > > +public class ClientMtLifecycles extends _ClientMtLifecycles {
    > > +
    > > +}
    > >
    > > Added:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java?rev=881740&view=auto
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java
    > > (added)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/MtLifecycles.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -0,0 +1,7 @@
    > > +package org.apache.cayenne.testdo.mt;
    > > +
    > > +import org.apache.cayenne.testdo.mt.auto._MtLifecycles;
    > > +
    > > +public class MtLifecycles extends _MtLifecycles {
    > > +
    > > +}
    > >
    > > Added:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java?rev=881740&view=auto
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java
    > > (added)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMtLifecycles.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -0,0 +1,37 @@
    > > +package org.apache.cayenne.testdo.mt.auto;
    > > +
    > > +import org.apache.cayenne.PersistentObject;
    > > +
    > > +/**
    > > + * A generated persistent class mapped as "MtLifecycles" Cayenne entity.
    > > It is a good idea to
    > > + * avoid changing this class manually, since it will be overwritten next
    > > time code is
    > > + * regenerated. If you need to make any customizations, put them in a
    > > subclass.
    > > + */
    > > +public abstract class _ClientMtLifecycles extends PersistentObject {
    > > +
    > > + public static final String NAME_PROPERTY = "name";
    > > +
    > > + protected String name;
    > > +
    > > + public String getName() {
    > > + if(objectContext != null) {
    > > + objectContext.prepareForAccess(this, "name", false);
    > > + }
    > > +
    > > + return name;
    > > + }
    > > + public void setName(String name) {
    > > + if(objectContext != null) {
    > > + objectContext.prepareForAccess(this, "name", false);
    > > + }
    > > +
    > > + Object oldValue = this.name;
    > > + this.name = name;
    > > +
    > > + // notify objectContext about simple property change
    > > + if(objectContext != null) {
    > > + objectContext.propertyChanged(this, "name", oldValue, name);
    > > + }
    > > + }
    > > +
    > > +}
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_ClientMultiTier.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -5,7 +5,7 @@
    > > import org.apache.cayenne.ObjectContext;
    > > import org.apache.cayenne.PersistentObject;
    > > import org.apache.cayenne.query.NamedQuery;
    > > -import org.apache.cayenne.testdo.mt.ClientMtTable1;
    > > +import org.apache.cayenne.testdo.mt.MtTable1;
    > >
    > > /**
    > > * This class was generated by Cayenne.
    > >.. -15,15 +15,21 @@
    > > */
    > > public class _ClientMultiTier {
    > >
    > > - public List<ClientMtTable1> performAllMtTable1(ObjectContext context
    > )
    > > {
    > > + public static final String ALL_MT_TABLE1_QUERYNAME = "AllMtTable1";
    > > +
    > > + public static final String MT_QUERY_WITH_LOCAL_CACHE_QUERYNAME =
    > > "MtQueryWithLocalCache";
    > > +
    > > + public static final String
    > > PARAMETERIZED_MT_QUERY_WITH_LOCAL_CACHE_QUERYNAME =
    > > "ParameterizedMtQueryWithLocalCache";
    > > +
    > > + public List<MtTable1> performAllMtTable1(ObjectContext context ) {
    > > return context.performQuery(new NamedQuery("AllMtTable1"));
    > > }
    > >
    > > - public List<ClientMtTable1>
    > performMtQueryWithLocalCache(ObjectContext
    > > context ) {
    > > + public List<MtTable1> performMtQueryWithLocalCache(ObjectContext
    > > context ) {
    > > return context.performQuery(new
    > > NamedQuery("MtQueryWithLocalCache"));
    > > }
    > >
    > > - public List<ClientMtTable1>
    > > performParameterizedMtQueryWithLocalCache(ObjectContext context , String
    > g)
    > > {
    > > + public List<MtTable1>
    > > performParameterizedMtQueryWithLocalCache(ObjectContext context , String
    > g)
    > > {
    > > String[] parameters = {
    > > "g",
    > > };
    > >
    > > Added:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java?rev=881740&view=auto
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java
    > > (added)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MtLifecycles.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -0,0 +1,23 @@
    > > +package org.apache.cayenne.testdo.mt.auto;
    > > +
    > > +import org.apache.cayenne.CayenneDataObject;
    > > +
    > > +/**
    > > + * Class _MtLifecycles was generated by Cayenne.
    > > + * It is probably a good idea to avoid changing this class manually,
    > > + * since it may be overwritten next time code is regenerated.
    > > + * If you need to make any customizations, please use subclass.
    > > + */
    > > +public abstract class _MtLifecycles extends CayenneDataObject {
    > > +
    > > + public static final String NAME_PROPERTY = "name";
    > > +
    > > +
    > > + public void setName(String name) {
    > > + writeProperty("name", name);
    > > + }
    > > + public String getName() {
    > > + return (String)readProperty("name");
    > > + }
    > > +
    > > +}
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/mt/auto/_MultiTier.java
    > > Wed Nov 18 12:08:20 2009
    > >.. -14,6 +14,12 @@
    > > */
    > > public class _MultiTier {
    > >
    > > + public static final String ALL_MT_TABLE1_QUERYNAME = "AllMtTable1";
    > > +
    > > + public static final String MT_QUERY_WITH_LOCAL_CACHE_QUERYNAME =
    > > "MtQueryWithLocalCache";
    > > +
    > > + public static final String
    > > PARAMETERIZED_MT_QUERY_WITH_LOCAL_CACHE_QUERYNAME =
    > > "ParameterizedMtQueryWithLocalCache";
    > > +
    > > public List<MtTable1> performAllMtTable1(ObjectContext context ) {
    > > return context.performQuery(new NamedQuery("AllMtTable1"));
    > > }
    > >
    > > Modified:
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
    > > URL:
    > >
    > http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml?rev=881740&r1=881739&r2=881740&view=diff
    > >
    > >
    > ==============================================================================
    > > ---
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
    > > (original)
    > > +++
    > >
    > cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
    > > Wed Nov 18 12:08:20 2009
    > >.. -29,6 +29,10 @@
    > > <db-attribute name="TABLE4_ID" type="INTEGER"
    > > isPrimaryKey="true" isMandatory="true"/>
    > > <db-attribute name="TABLE5_ID" type="INTEGER"
    > > isPrimaryKey="true" isMandatory="true"/>
    > > </db-entity>
    > > + <db-entity name="MT_LIFECYCLES">
    > > + <db-attribute name="ID" type="INTEGER"
    > isPrimaryKey="true"
    > > isMandatory="true"/>
    > > + <db-attribute name="NAME" type="VARCHAR"
    > isMandatory="true"
    > > length="100"/>
    > > + </db-entity>
    > > <db-entity name="MT_MAP_TO_MANY">
    > > <db-attribute name="ID" type="INTEGER" isPrimaryKey="true"
    > > isMandatory="true"/>
    > > </db-entity>
    > >.. -91,6 +95,9 @@
    > > <obj-entity name="MtDeleteRule"
    > > className="org.apache.cayenne.testdo.mt.MtDeleteRule"
    > > clientClassName="org.apache.cayenne.testdo.mt.ClientMtDeleteRule"
    > > dbEntityName="MT_DELETE_RULE">
    > > <obj-attribute name="name" type="java.lang.String"
    > > db-attribute-path="NAME"/>
    > > </obj-entity>
    > > + <obj-entity name="MtLifecycles"
    > > className="org.apache.cayenne.testdo.mt.MtLifecycles"
    > > clientClassName="org.apache.cayenne.testdo.mt.ClientMtLifecycles"
    > > dbEntityName="MT_LIFECYCLES">
    > > + <obj-attribute name="name" type="java.lang.String"
    > > db-attribute-path="NAME"/>
    > > + </obj-entity>
    > > <obj-entity name="MtMapToMany"
    > > className="org.apache.cayenne.testdo.mt.MtMapToMany"
    > > clientClassName="org.apache.cayenne.testdo.mt.ClientMtMapToMany"
    > > dbEntityName="MT_MAP_TO_MANY">
    > > </obj-entity>
    > > <obj-entity name="MtMapToManyTarget"
    > > className="org.apache.cayenne.testdo.mt.MtMapToManyTarget"
    > > clientClassName="org.apache.cayenne.testdo.mt.ClientMtMapToManyTarget"
    > > dbEntityName="MT_MAP_TO_MANY_TARGET">
    > >
    > >
    > >
    >
    >
    > --
    > Olga Tkacheva
    >

    -- 
    Andrey
    



    This archive was generated by hypermail 2.0.0 : Wed Nov 18 2009 - 13:58:38 EST