You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/10/15 04:53:01 UTC

svn commit: r464103 - in /incubator/cayenne/main/trunk: assembly/cayenne-generic/src/main/resources/ core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/ core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ core/cayenne-jdk1.4/src/main/java/or...

Author: aadamchik
Date: Sat Oct 14 19:53:00 2006
New Revision: 464103

URL: http://svn.apache.org/viewvc?view=rev&rev=464103
Log:
CAY-693: DataContext should not return HOLLOW objects in response to ObjectIdQuery()
(moving prepareForAccess in context superclass. Note that DataContextDelegate is no longer called on FaultFailures)

Modified:
    incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java

Modified: incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
--- incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt (original)
+++ incubator/cayenne/main/trunk/assembly/cayenne-generic/src/main/resources/UPGRADE.txt Sat Oct 14 19:53:00 2006
@@ -6,10 +6,10 @@
 Date:
 ----------------------------------
 
-UPGRADING FROM 2.0 AND OTHER OBJECTSTYLE RELEASES
-
-....
+UPGRADING FROM 2.0 AND OTHER APACHE RELEASES
 
+* DataContextDelegate.shouldProcessDelete/finishedProcessDelete methods are no longer 
+called on fault resolution failures. A FaultFailreException is thrown, as before. 
 
 UPGRADING FROM 1.2 AND OTHER OBJECTSTYLE RELEASES
 

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/BaseContext.java Sat Oct 14 19:53:00 2006
@@ -23,6 +23,8 @@
 
 import org.apache.cayenne.graph.GraphManager;
 import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.property.Property;
+import org.apache.cayenne.query.ObjectIdQuery;
 import org.apache.cayenne.query.Query;
 
 /**
@@ -75,10 +77,50 @@
         prepareForAccess(object, property, false);
     }
 
-    public abstract void prepareForAccess(
-            Persistent object,
-            String property,
-            boolean lazyFaulting);
+    public void prepareForAccess(Persistent object, String property, boolean lazyFaulting) {
+        if (object.getPersistenceState() == PersistenceState.HOLLOW) {
+
+            ObjectId oid = object.getObjectId();
+            List objects = performQuery(new ObjectIdQuery(oid, false, ObjectIdQuery.CACHE));
+
+            if (objects.size() == 0) {
+                throw new FaultFailureException(
+                        "Error resolving fault, no matching row exists in the database for ObjectId: "
+                                + oid);
+            }
+            else if (objects.size() > 1) {
+                throw new FaultFailureException(
+                        "Error resolving fault, more than one row exists in the database for ObjectId: "
+                                + oid);
+            }
+
+            // sanity check...
+            if (object.getPersistenceState() != PersistenceState.COMMITTED) {
+
+                String state = PersistenceState.persistenceStateName(object
+                        .getPersistenceState());
+
+                // TODO: andrus 4/13/2006, modified and deleted states are possible due to
+                // a race condition, should we handle them here?
+
+                throw new FaultFailureException(
+                        "Error resolving fault for ObjectId: "
+                                + oid
+                                + " and state ("
+                                + state
+                                + "). Possible cause - matching row is missing from the database.");
+            }
+        }
+
+        // resolve relationship fault
+        if (lazyFaulting && property != null) {
+            Property propertyDescriptor = getEntityResolver().getClassDescriptor(
+                    object.getObjectId().getEntityName()).getProperty(property);
+
+            // this should trigger fault resolving
+            propertyDescriptor.readProperty(object);
+        }
+    }
 
     public abstract void propertyChanged(
             Persistent object,

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/CayenneContext.java Sat Oct 14 19:53:00 2006
@@ -32,8 +32,6 @@
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.property.ClassDescriptor;
-import org.apache.cayenne.property.Property;
-import org.apache.cayenne.query.ObjectIdQuery;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.util.EventUtil;
 import org.apache.cayenne.validation.ValidationException;
@@ -426,39 +424,6 @@
         }
 
         // ****** Copied from DataContext - end *******
-    }
-
-    /**
-     * Resolves an object if it is HOLLOW.
-     * 
-     * @since 3.0
-     */
-    public void prepareForAccess(Persistent object, String property, boolean lazyFaulting) {
-        if (object.getPersistenceState() == PersistenceState.HOLLOW) {
-
-            ObjectId gid = object.getObjectId();
-            List objects = performQuery(new ObjectIdQuery(gid));
-
-            if (objects.size() == 0) {
-                throw new FaultFailureException(
-                        "Error resolving fault, no matching row exists in the database for GlobalID: "
-                                + gid);
-            }
-            else if (objects.size() > 1) {
-                throw new FaultFailureException(
-                        "Error resolving fault, more than one row exists in the database for GlobalID: "
-                                + gid);
-            }
-        }
-        
-        // resolve relationship fault
-        if (lazyFaulting && property != null) {
-            Property propertyDescriptor = getEntityResolver().getClassDescriptor(
-                    object.getObjectId().getEntityName()).getProperty(property);
-            
-            // this should trigger fault resolving
-            propertyDescriptor.readProperty(object);
-        }
     }
 
     public void propertyChanged(

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContext.java Sat Oct 14 19:53:00 2006
@@ -39,7 +39,6 @@
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.DeleteDenyException;
 import org.apache.cayenne.Fault;
-import org.apache.cayenne.FaultFailureException;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.PersistenceState;
@@ -1585,43 +1584,6 @@
             // call a setter to ensure EntityResolver is extracted from channel
             setChannel(Configuration.getSharedConfiguration().getDomain(
                     lazyInitParentDomainName));
-        }
-    }
-
-    /**
-     * Resolves object fault if needed.
-     * 
-     * @since 3.0
-     */
-    public void prepareForAccess(Persistent object, String property, boolean lazyFaulting) {
-
-        if (object.getPersistenceState() == PersistenceState.HOLLOW) {
-
-            getObjectStore().resolveHollow(object);
-            if (object.getPersistenceState() != PersistenceState.COMMITTED) {
-
-                String state = PersistenceState.persistenceStateName(object
-                        .getPersistenceState());
-
-                // TODO: andrus 4/13/2006, modified and deleted states are possible due to
-                // a race condition, should we handle them here?
-
-                throw new FaultFailureException(
-                        "Error resolving fault for ObjectId: "
-                                + object.getObjectId()
-                                + " and state ("
-                                + state
-                                + "). Possible cause - matching row is missing from the database.");
-            }
-        }
-        
-        // resolve relationship fault
-        if (lazyFaulting && property != null) {
-            Property propertyDescriptor = getEntityResolver().getClassDescriptor(
-                    object.getObjectId().getEntityName()).getProperty(property);
-            
-            // this should trigger fault resolving
-            propertyDescriptor.readProperty(object);
         }
     }
 

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java Sat Oct 14 19:53:00 2006
@@ -80,6 +80,11 @@
                         oidQuery.getObjectId());
                 if (object != null) {
 
+                    // TODO: andrus, 10/14/2006 - obtaining a row from an object is the
+                    // only piece that makes this method different from the super
+                    // implementation. This is used in NEW objects sorting on insert. It
+                    // would be nice to implement an alternative algorithm that wouldn't
+                    // require this hack.
                     if (oidQuery.isFetchingDataRows()) {
                         object = ((DataContext) actingContext)
                                 .currentSnapshot((DataObject) object);

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/access/ObjectStore.java Sat Oct 14 19:53:00 2006
@@ -651,24 +651,11 @@
      * fully resolved.
      * 
      * @since 1.1
+     * @deprecated since 3.0 use
+     *             {@link ObjectContext#prepareForAccess(Persistent, String, boolean)}.
      */
     public void resolveHollow(Persistent object) {
-        if (object.getPersistenceState() != PersistenceState.HOLLOW) {
-            return;
-        }
-
-        synchronized (this) {
-            ObjectIdQuery query = new ObjectIdQuery(
-                    object.getObjectId(),
-                    false,
-                    ObjectIdQuery.CACHE);
-            List results = context.getChannel().onQuery(context, query).firstList();
-
-            // handle deleted object
-            if (results.size() == 0) {
-                processDeletedID(object.getObjectId());
-            }       
-        }
+        context.prepareForAccess(object, null, false);
     }
 
     void processIdChange(Object nodeId, Object newId) {

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java Sat Oct 14 19:53:00 2006
@@ -25,10 +25,11 @@
 
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.QueryResponse;
-import org.apache.cayenne.cache.QueryCacheEntryFactory;
 import org.apache.cayenne.cache.QueryCache;
+import org.apache.cayenne.cache.QueryCacheEntryFactory;
 import org.apache.cayenne.property.ArcProperty;
 import org.apache.cayenne.property.ClassDescriptor;
 import org.apache.cayenne.query.ObjectIdQuery;
@@ -142,6 +143,12 @@
                 Object object = actingContext.getGraphManager().getNode(
                         oidQuery.getObjectId());
                 if (object != null) {
+                    
+                    // do not return hollow objects
+                    if (((Persistent) object).getPersistenceState() == PersistenceState.HOLLOW) {
+                        return !DONE;
+                    }
+
                     this.response = new ListResponse(object);
                     return DONE;
                 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java?view=diff&rev=464103&r1=464102&r2=464103
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4/src/test/java/org/apache/cayenne/access/DataContextDelegateSharedCacheTst.java Sat Oct 14 19:53:00 2006
@@ -22,10 +22,8 @@
 import java.util.Date;
 
 import org.apache.art.Artist;
-import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.DataObject;
 import org.apache.cayenne.DataRow;
-import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.PersistenceState;
 import org.apache.cayenne.unit.MultiContextTestCase;
 import org.apache.cayenne.unit.util.ThreadedTestHelper;
@@ -217,40 +215,5 @@
         helper.assertWithTimeout(3000);
         assertEquals(PersistenceState.COMMITTED, altArtist.getPersistenceState());
         assertNotNull(altArtist.getObjectContext());
-    }
-
-    /**
-     * Test case to prove that delegate method is invoked on an unsuccessful fault
-     * resolution.
-     */
-    public void testShouldProcessDeleteOnResolveFault() throws Exception {
-
-        final boolean[] methodInvoked = new boolean[1];
-        DataContextDelegate delegate = new MockDataContextDelegate() {
-
-            public boolean shouldProcessDelete(DataObject object) {
-                methodInvoked[0] = true;
-                return true;
-            }
-        };
-        context.setDelegate(delegate);
-
-        // create a fault for artist with a non-existing id
-        ObjectId fakeID = new ObjectId("Artist", Artist.ARTIST_ID_PK_COLUMN, new Integer(
-                -10));
-        Artist noSuchArtist = (Artist) context.localObject(fakeID, null);
-        assertEquals(PersistenceState.HOLLOW, noSuchArtist.getPersistenceState());
-
-        // attempt to resolve
-
-        try {
-            context.prepareForAccess(noSuchArtist, null, false);
-        }
-        catch (CayenneRuntimeException ex) {
-            // expected, as fault resolving failed...
-        }
-
-        assertTrue("Delegate was not consulted", methodInvoked[0]);
-        assertEquals(PersistenceState.TRANSIENT, noSuchArtist.getPersistenceState());
     }
 }