You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by an...@apache.org on 2009/03/18 10:03:48 UTC

svn commit: r755516 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/ main/java/org/apache/cayenne/util/ test/java/org/apache/cayenne/access/ test/java/org/apache/cayenne/remote/ test/java/org/apach...

Author: andrey
Date: Wed Mar 18 09:03:47 2009
New Revision: 755516

URL: http://svn.apache.org/viewvc?rev=755516&view=rev
Log:
CAY-1194 problems with relationships when using nested contexts and ROP
fix & tests & ToManyList refactoring

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/util/ToManyListTest.java   (contents, props changed)
      - copied, changed from r754880, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ToManyListTest.java
Removed:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ToManyListTest.java
Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ToManyList.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/NestedDataContextWriteTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCayenneCase.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ToManyList.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ToManyList.java?rev=755516&r1=755515&r2=755516&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ToManyList.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ToManyList.java Wed Mar 18 09:03:47 2009
@@ -21,16 +21,12 @@
 
 import java.io.Serializable;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.ListIterator;
 
-import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.query.RelationshipQuery;
+import org.apache.cayenne.util.PersistentObjectList;
 
 /**
  * A list that holds objects for to-many relationships. All operations, except for
@@ -38,17 +34,7 @@
  * synchronization is to synchronize on parent ObjectStore.
  * 
  */
-public class ToManyList implements List, Serializable, ValueHolder {
-
-    private Persistent source;
-    private String relationship;
-
-    // wrapped objects list
-    List objectList;
-
-    // track additions/removals in unresolved...
-    LinkedList addedToUnresolved;
-    LinkedList<Object> removedFromUnresolved;
+public class ToManyList extends PersistentObjectList implements Serializable {
 
     /**
      * Creates ToManyList.
@@ -56,296 +42,40 @@
      * @since 1.1
      */
     public ToManyList(Persistent source, String relationship) {
-        if (source == null) {
-            throw new NullPointerException("'source' can't be null.");
-        }
-
-        if (relationship == null) {
-            throw new NullPointerException("'relationship' can't be null.");
-        }
-
-        this.source = source;
-        this.relationship = relationship;
+        super(source, relationship);
 
         // if source is new, set object list right away
-        if (isTransientSource()) {
+        if (isTransientParent()) {
             objectList = new LinkedList();
         }
     }
 
     /**
-     * @since 1.2
-     */
-    public Persistent getRelationshipOwner() {
-        return source;
-    }
-
-    /**
      * Returns a name of relationship for this list.
      * 
      * @since 1.1
+     * @deprecated use {@link #getRelationshipName()} method
      */
+    @Deprecated
     public String getRelationship() {
-        return relationship;
-    }
-
-    public void setObjectList(List objectList) {
-        this.objectList = objectList;
-    }
-
-    public Object getValue() throws CayenneRuntimeException {
-        return resolvedObjectList();
-    }
-
-    public void invalidate() {
-        this.objectList = null;
-    }
-
-    public boolean isFault() {
-        return objectList == null;
-    }
-
-    public Object getValueDirectly() throws CayenneRuntimeException {
-        return objectList;
-    }
-
-    public Object setValueDirectly(Object value) throws CayenneRuntimeException {
-        if (value == null || value instanceof List) {
-            Object old = this.objectList;
-            setObjectList((List) value);
-            return old;
-        }
-        else {
-            throw new CayenneRuntimeException("Value must be a list, got: "
-                    + value.getClass().getName());
-        }
-    }
-
-    public Object setValue(Object value) throws CayenneRuntimeException {
-        resolvedObjectList();
-        return setValueDirectly(objectList);
+        return getRelationshipName();
     }
 
     // ====================================================
     // Standard List Methods.
     // ====================================================
-    public boolean add(Object o) {
-        return (isFault()) ? addLocal(o) : objectList.add(o);
-    }
-
-    public void add(int index, Object element) {
-        resolvedObjectList().add(index, element);
-    }
-
-    public boolean addAll(Collection c) {
-        return resolvedObjectList().addAll(c);
-    }
-
-    public boolean addAll(int index, Collection c) {
-        return resolvedObjectList().addAll(index, c);
-    }
-
-    public void clear() {
-        resolvedObjectList().clear();
-    }
-
-    public boolean contains(Object o) {
-        return resolvedObjectList().contains(o);
-    }
-
-    public boolean containsAll(Collection c) {
-        return resolvedObjectList().containsAll(c);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o == null) {
-            return false;
-        }
-
-        if (!(o instanceof ToManyList)) {
-            return false;
-        }
-
-        return resolvedObjectList().equals(((ToManyList) o).resolvedObjectList());
-    }
-
     @Override
     public int hashCode() {
         return 15 + resolvedObjectList().hashCode();
     }
 
-    public Object get(int index) {
-        return resolvedObjectList().get(index);
-    }
-
-    public int indexOf(Object o) {
-        return resolvedObjectList().indexOf(o);
-    }
-
-    public boolean isEmpty() {
-        return resolvedObjectList().isEmpty();
-    }
-
-    public Iterator iterator() {
-        return resolvedObjectList().iterator();
-    }
-
-    public int lastIndexOf(Object o) {
-        return resolvedObjectList().lastIndexOf(o);
-    }
-
-    public ListIterator listIterator() {
-        return resolvedObjectList().listIterator();
-    }
-
-    public ListIterator listIterator(int index) {
-        return resolvedObjectList().listIterator(index);
-    }
-
-    public Object remove(int index) {
-        return resolvedObjectList().remove(index);
-    }
-
-    public boolean remove(Object o) {
-        return (isFault()) ? removeLocal(o) : objectList.remove(o);
-    }
-
-    public boolean removeAll(Collection c) {
-        return resolvedObjectList().removeAll(c);
-    }
-
-    public boolean retainAll(Collection c) {
-        return resolvedObjectList().retainAll(c);
-    }
-
-    public Object set(int index, Object element) {
-        return resolvedObjectList().set(index, element);
-    }
-
-    public int size() {
-        return resolvedObjectList().size();
-    }
-
-    public List subList(int fromIndex, int toIndex) {
-        return resolvedObjectList().subList(fromIndex, toIndex);
-    }
-
-    public Object[] toArray() {
-        return resolvedObjectList().toArray();
-    }
-
-    public Object[] toArray(Object[] a) {
-        return resolvedObjectList().toArray(a);
-    }
-
     // ====================================================
     // Tracking list modifications, and resolving it
     // on demand
     // ====================================================
 
-    boolean isTransientSource() {
-        int state = source.getPersistenceState();
-        return state == PersistenceState.NEW || state == PersistenceState.TRANSIENT;
-    }
-
-    boolean isUncommittedSource() {
-        int state = source.getPersistenceState();
-        return state == PersistenceState.MODIFIED || state == PersistenceState.DELETED;
-    }
-
-    /**
-     * Returns internal objects list resolving it if needed.
-     */
-    List resolvedObjectList() {
-        if (isFault()) {
-
-            synchronized (this) {
-                // now that we obtained the lock, check
-                // if another thread just resolved the list
-
-                if (isFault()) {
-                    List localList;
-
-                    if (isTransientSource()) {
-                        localList = new LinkedList();
-                    }
-                    else {
-                        localList = source.getObjectContext().performQuery(
-                                new RelationshipQuery(
-                                        source.getObjectId(),
-                                        relationship,
-                                        false));
-                    }
-
-                    mergeLocalChanges(localList);
-                    this.objectList = localList;
-                }
-            }
-        }
-
-        return objectList;
-    }
-
-    void clearLocalChanges() {
-        addedToUnresolved = null;
-        removedFromUnresolved = null;
-    }
-
-    void mergeLocalChanges(List fetchedList) {
-
-        // only merge if an object is in an uncommitted state
-        // any other state means that our local tracking
-        // is invalid...
-        if (isUncommittedSource()) {
-
-            if (removedFromUnresolved != null) {
-                fetchedList.removeAll(removedFromUnresolved);
-            }
-
-            // add only those that are not already on the list
-            // do not include transient objects...
-            if (addedToUnresolved != null && !addedToUnresolved.isEmpty()) {
-                Iterator it = addedToUnresolved.iterator();
-                while (it.hasNext()) {
-                    Object next = it.next();
-
-                    if (next instanceof Persistent) {
-                        Persistent dataObject = (Persistent) next;
-                        if (dataObject.getPersistenceState() == PersistenceState.TRANSIENT) {
-                            continue;
-                        }
-                    }
-
-                    if (!fetchedList.contains(next)) {
-                        fetchedList.add(next);
-                    }
-                }
-            }
-        }
-
-        // clear local information in any event
-        clearLocalChanges();
-    }
-
-    boolean addLocal(Object object) {
-
-        if (removedFromUnresolved != null) {
-            removedFromUnresolved.remove(object);
-        }
-
-        if (addedToUnresolved == null) {
-            addedToUnresolved = new LinkedList();
-        }
-
-        addedToUnresolved.addLast(object);
-
-        // this is really meaningless, since we don't know
-        // if an object was present in the list
-        return true;
-    }
-
-    boolean removeLocal(Object object) {
+    @Override
+    protected boolean removeLocal(Object object) {
         if (addedToUnresolved != null) {
             addedToUnresolved.remove(object);
         }
@@ -378,4 +108,29 @@
     public String toString() {
         return getClass().getName() + "@" + System.identityHashCode(this);
     }
+    
+    @Override
+    protected void postprocessAdd(Collection collection) {
+        //no need for this operation for DataObjects...
+    }
+
+    @Override
+    protected void postprocessRemove(Collection collection) {
+        //no need for this operation for DataObjects...
+    }
+
+    @Override
+    protected void postprocessAdd(Object addedObject) {
+        //no need for this operation for DataObjects...
+    }
+
+    @Override
+    protected void postprocessRemove(Object removedObject) {
+        //no need for this operation for DataObjects...
+    }
+    
+    @Override
+    protected void updateReverse(List resolved) {
+        //no need for this operation for DataObjects...
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java?rev=755516&r1=755515&r2=755516&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/PersistentObjectList.java Wed Mar 18 09:03:47 2009
@@ -308,12 +308,12 @@
         return objectList;
     }
 
-    void clearLocalChanges() {
+    protected void clearLocalChanges() {
         addedToUnresolved = null;
         removedFromUnresolved = null;
     }
 
-    void mergeLocalChanges(List fetchedList) {
+    protected void mergeLocalChanges(List fetchedList) {
 
         // only merge if an object is in an uncommitted state
         // any other state means that our local tracking
@@ -349,7 +349,7 @@
         clearLocalChanges();
     }
 
-    boolean addLocal(Object object) {
+    protected boolean addLocal(Object object) {
 
         if (removedFromUnresolved != null) {
             removedFromUnresolved.remove(object);
@@ -366,7 +366,7 @@
         return true;
     }
 
-    boolean removeLocal(Object object) {
+    protected boolean removeLocal(Object object) {
         if (addedToUnresolved != null) {
             addedToUnresolved.remove(object);
         }
@@ -382,21 +382,21 @@
         return true;
     }
 
-    void postprocessAdd(Collection collection) {
+    protected void postprocessAdd(Collection collection) {
         Iterator it = collection.iterator();
         while (it.hasNext()) {
             postprocessAdd(it.next());
         }
     }
 
-    void postprocessRemove(Collection collection) {
+    protected void postprocessRemove(Collection collection) {
         Iterator it = collection.iterator();
         while (it.hasNext()) {
             postprocessRemove(it.next());
         }
     }
 
-    void postprocessAdd(Object addedObject) {
+    protected void postprocessAdd(Object addedObject) {
 
         // notify ObjectContext
         if (relationshipOwner.getObjectContext() != null) {
@@ -408,7 +408,7 @@
         }
     }
 
-    void postprocessRemove(Object removedObject) {
+    protected void postprocessRemove(Object removedObject) {
 
         // notify ObjectContext
         if (relationshipOwner.getObjectContext() != null) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java?rev=755516&r1=755515&r2=755516&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/RelationshipFault.java Wed Mar 18 09:03:47 2009
@@ -91,13 +91,25 @@
                         relationshipOwner.getObjectId(),
                         relationshipName,
                         false));
+        
+        /**
+         * Duplicating the list (see CAY-1194). Doing that only for RelationshipFault
+         * query results, so only for nested DataContexts
+         */
+        if (resolved instanceof RelationshipFault) {
+            resolved = new ArrayList(resolved);
+        }
 
         if (resolved.isEmpty()) {
             return resolved;
         }
 
-        // see if reverse relationship is to-one and we can connect source to results....
-
+        updateReverse(resolved);
+        return resolved;
+    }
+    
+    // see if reverse relationship is to-one and we can connect source to results....
+    protected void updateReverse(List resolved) {
         EntityResolver resolver = relationshipOwner
                 .getObjectContext()
                 .getEntityResolver();
@@ -118,7 +130,5 @@
                 property.writePropertyDirectly(it.next(), null, relationshipOwner);
             }
         }
-
-        return resolved;
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/NestedDataContextWriteTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/NestedDataContextWriteTest.java?rev=755516&r1=755515&r2=755516&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/NestedDataContextWriteTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/NestedDataContextWriteTest.java Wed Mar 18 09:03:47 2009
@@ -30,6 +30,7 @@
 import org.apache.cayenne.DataObjectUtils;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.Persistent;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.unit.CayenneCase;
 
@@ -569,4 +570,32 @@
         child.commitChangesToParent();
 
     }
+    
+    public void testCAY1194() throws Exception {
+        deleteTestData();
+        
+        DataContext context = createDataContext();
+        
+        Artist artist = context.newObject(Artist.class);
+        artist.setArtistName("111");
+        ObjectContext child = context.createChildContext();
+        
+        Painting painting = child.newObject(Painting.class);
+        painting.setPaintingTitle("222");
+        
+        Artist localParentMt = (Artist) child.localObject(artist.getObjectId(), null);
+        assertEquals(0, artist.getPaintingArray().size());
+        assertEquals(0, localParentMt.getPaintingArray().size());
+        
+        painting.setToArtist(localParentMt);
+        
+        assertEquals(0, artist.getPaintingArray().size());
+        assertEquals(1, localParentMt.getPaintingArray().size());
+        assertEquals(((Persistent) localParentMt.getPaintingArray().get(0)).getObjectContext(), child);
+        
+        child.commitChangesToParent();
+        assertEquals(1, artist.getPaintingArray().size());
+        assertEquals(((Persistent) artist.getPaintingArray().get(0)).getObjectContext(), context);
+        
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java?rev=755516&r1=755515&r2=755516&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/NestedObjectContextTest.java Wed Mar 18 09:03:47 2009
@@ -615,4 +615,29 @@
         //fetching other relationship... this fails per CAY-1183
         childMt2.getTable3();
     }
+    
+    public void testCAY1194() throws Exception {
+        deleteTestData();
+        
+        ClientMtTable1 parentMt = context.newObject(ClientMtTable1.class);        
+        ObjectContext child = context.createChildContext();
+        
+        ClientMtTable2 childMt2 = child.newObject(ClientMtTable2.class);
+        childMt2.setGlobalAttribute("222");
+        
+        ClientMtTable1 localParentMt = (ClientMtTable1) child.localObject(parentMt.getObjectId(), null);
+        assertEquals(0, parentMt.getTable2Array().size());
+        assertEquals(0, localParentMt.getTable2Array().size());
+        
+        childMt2.setTable1(localParentMt);
+        
+        assertEquals(0, parentMt.getTable2Array().size());
+        assertEquals(1, localParentMt.getTable2Array().size());
+        
+        assertEquals(((Persistent) localParentMt.getTable2Array().get(0)).getObjectContext(), child);
+        
+        child.commitChangesToParent();
+        assertEquals(1, parentMt.getTable2Array().size());
+        assertEquals(((Persistent) parentMt.getTable2Array().get(0)).getObjectContext(), context);
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCayenneCase.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCayenneCase.java?rev=755516&r1=755515&r2=755516&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCayenneCase.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/RemoteCayenneCase.java Wed Mar 18 09:03:47 2009
@@ -38,12 +38,16 @@
     @Override
     public void setUp() throws Exception {
         parentDataContext = createDataContext();
+        context = createROPContext();
+    }
+    
+    protected CayenneContext createROPContext() {
         ClientServerChannel clientServerChannel = new ClientServerChannel(parentDataContext);
         UnitLocalConnection connection = new UnitLocalConnection(
                 clientServerChannel,
                 LocalConnection.HESSIAN_SERIALIZATION);
         ClientChannel channel = new ClientChannel(connection);
-        context = new CayenneContext(channel, true, true);
+        return new CayenneContext(channel, true, true);
     }
     
     @Override

Copied: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/util/ToManyListTest.java (from r754880, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ToManyListTest.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/util/ToManyListTest.java?p2=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/util/ToManyListTest.java&p1=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ToManyListTest.java&r1=754880&r2=755516&rev=755516&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/ToManyListTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/util/ToManyListTest.java Wed Mar 18 09:03:47 2009
@@ -17,15 +17,21 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.access;
+package org.apache.cayenne.util;
 
 import java.util.Collections;
+import java.util.List;
 
 import org.apache.art.Artist;
 import org.apache.art.Painting;
 import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.access.ToManyList;
 import org.apache.cayenne.unit.CayenneCase;
 
+/**
+ * Moved to org.apache.cayenne.util package for accessing protected properties we don't need getters for
+ */
 public class ToManyListTest extends CayenneCase {
 
     protected DataContext context;
@@ -94,7 +100,7 @@
         int size = list.size();
         assertFalse("List must be resolved after checking a size...", list.isFault());
         assertEquals(1, size);
-        assertTrue(list.objectList.contains(p2));
+        assertTrue(getValue(list).contains(p2));
     }
 
     public void testSavedUnresolvedMerge() throws Exception {
@@ -127,8 +133,8 @@
         int size = list.size();
         assertFalse("List must be resolved after checking a size...", list.isFault());
         assertEquals(2, size);
-        assertTrue(list.objectList.contains(p2));
-        assertTrue(list.objectList.contains(p1));
+        assertTrue(getValue(list).contains(p2));
+        assertTrue(getValue(list).contains(p1));
     }
 
     public void testThrowOutDeleted() throws Exception {
@@ -173,8 +179,8 @@
         int size = list.size();
         assertFalse("List must be resolved after checking a size...", list.isFault());
         assertEquals("Deleted object must have been purged...", 1, size);
-        assertTrue(list.objectList.contains(p1));
-        assertFalse("Deleted object must have been purged...", list.objectList
+        assertTrue(getValue(list).contains(p1));
+        assertFalse("Deleted object must have been purged...", getValue(list)
                 .contains(p2));
     }
 
@@ -237,4 +243,8 @@
         assertFalse(list.contains(p2));
         assertFalse("List must be resolved...", list.isFault());
     }
+    
+    private List getValue(ToManyList list) {
+        return (List) list.getValueDirectly();
+    }
 }

Propchange: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/util/ToManyListTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/util/ToManyListTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/util/ToManyListTest.java
------------------------------------------------------------------------------
    svn:mergeinfo =