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/08/21 11:42:06 UTC

svn commit: r433204 - in /incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src: main/java/org/apache/cayenne/ main/java/org/apache/cayenne/access/ test/java/org/apache/cayenne/access/

Author: aadamchik
Date: Mon Aug 21 02:42:02 2006
New Revision: 433204

URL: http://svn.apache.org/viewvc?rev=433204&view=rev
Log:
CAY-632 - "refresh all" functionality

Modified:
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java?rev=433204&r1=433203&r2=433204&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java Mon Aug 21 02:42:02 2006
@@ -109,38 +109,34 @@
 
             CayenneContext context = (CayenneContext) actingContext;
 
-            // handle three separate scenarious, but do not combine them as it will be
+            // handle 4 separate scenarious, but do not combine them as it will be
             // unclear how to handle cascading behavior
 
-            // 1. invalidate object collection
+            // 1. refresh all
+            if (refreshQuery.isRefreshAll()) {
+
+                invalidateLocally(context.internalGraphManager(), context
+                        .internalGraphManager()
+                        .registeredNodes()
+                        .iterator());
+                context.getQueryCache().clear();
+
+                // cascade
+                return !DONE;
+            }
+
+            // 2. invalidate object collection
             Collection objects = refreshQuery.getObjects();
             if (objects != null && !objects.isEmpty()) {
 
-                CayenneContextGraphManager graphManager = context.internalGraphManager();
-
-                Iterator it = objects.iterator();
-                while (it.hasNext()) {
-                    Persistent object = (Persistent) it.next();
-
-                    // we don't care about NEW objects,
-                    // but we still do care about HOLLOW, since snapshot might still be
-                    // present
-                    if (object.getPersistenceState() == PersistenceState.NEW) {
-                        continue;
-                    }
-
-                    object.setPersistenceState(PersistenceState.HOLLOW);
-
-                    // remove cached changes
-                    graphManager.changeLog.unregisterNode(object.getObjectId());
-                    graphManager.stateLog.unregisterNode(object.getObjectId());
-                }
+                invalidateLocally(context.internalGraphManager(), objects.iterator());
 
                 // cascade
                 return !DONE;
             }
-            // 2. refresh query - have to do it eagerly to refresh the objects involved
-            else if (refreshQuery.getQuery() != null) {
+
+            // 3. refresh query - have to do it eagerly to refresh the objects involved
+            if (refreshQuery.getQuery() != null) {
                 Query cachedQuery = refreshQuery.getQuery();
 
                 String cacheKey = cachedQuery
@@ -153,8 +149,9 @@
                 // do not cascade to avoid running query twice
                 return DONE;
             }
-            // 3. refresh groups...
-            else if (refreshQuery.getGroupKeys() != null
+
+            // 4. refresh groups...
+            if (refreshQuery.getGroupKeys() != null
                     && refreshQuery.getGroupKeys().length > 0) {
 
                 String[] groups = refreshQuery.getGroupKeys();
@@ -168,5 +165,24 @@
         }
 
         return !DONE;
+    }
+
+    private void invalidateLocally(CayenneContextGraphManager graphManager, Iterator it) {
+        while (it.hasNext()) {
+            Persistent object = (Persistent) it.next();
+
+            // we don't care about NEW objects,
+            // but we still do care about HOLLOW, since snapshot might still be
+            // present
+            if (object.getPersistenceState() == PersistenceState.NEW) {
+                continue;
+            }
+
+            object.setPersistenceState(PersistenceState.HOLLOW);
+
+            // remove cached changes
+            graphManager.changeLog.unregisterNode(object.getObjectId());
+            graphManager.stateLog.unregisterNode(object.getObjectId());
+        }
     }
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java?rev=433204&r1=433203&r2=433204&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataContextQueryAction.java Mon Aug 21 02:42:02 2006
@@ -146,38 +146,39 @@
 
             DataContext context = (DataContext) actingContext;
 
-            // handle three separate scenarious, but do not combine them as it will be
+            // handle four separate cases, but do not combine them as it will be
             // unclear how to handle cascading behavior
 
-            // 1. invalidate object collection
-            Collection objects = refreshQuery.getObjects();
-            if (objects != null && !objects.isEmpty()) {
+            // 1. refresh all
+            if (refreshQuery.isRefreshAll()) {
+                synchronized (context.getObjectStore()) {
+
+                    invalidateLocally(context.getObjectStore(), context
+                            .getObjectStore()
+                            .getObjectIterator());
 
-                Map diffMap = context.getObjectStore().getChangesByObjectId();
+                    context.getQueryCache().clear();
+                }
 
-                Iterator it = objects.iterator();
-                while (it.hasNext()) {
-                    Persistent object = (Persistent) it.next();
-
-                    // we don't care about NEW objects,
-                    // but we still do care about HOLLOW, since snapshot might still be
-                    // present
-                    if (object.getPersistenceState() == PersistenceState.NEW) {
-                        continue;
-                    }
+                // cascade
+                return !DONE;
+            }
 
-                    object.setPersistenceState(PersistenceState.HOLLOW);
+            // 2. invalidate object collection
+            Collection objects = refreshQuery.getObjects();
+            if (objects != null && !objects.isEmpty()) {
 
-                    // remove cached changes
-                    diffMap.remove(object.getObjectId());
+                synchronized (context.getObjectStore()) {
+                    invalidateLocally(context.getObjectStore(), objects.iterator());
                 }
 
                 // cascade
                 return !DONE;
             }
-            // 2. refresh query - have to do it eagerly to refresh the objects involved
-            else if (refreshQuery.getQuery() != null) {
-                Query cachedQuery = refreshQuery.getQuery();
+
+            // 3. refresh query - have to do it eagerly to refresh the objects involved
+            Query cachedQuery = refreshQuery.getQuery();
+            if (cachedQuery != null) {
 
                 String cacheKey = cachedQuery
                         .getMetaData(context.getEntityResolver())
@@ -189,11 +190,11 @@
                 // do not cascade to avoid running query twice
                 return DONE;
             }
-            // 3. refresh groups...
-            else if (refreshQuery.getGroupKeys() != null
-                    && refreshQuery.getGroupKeys().length > 0) {
 
-                String[] groups = refreshQuery.getGroupKeys();
+            // 4. refresh groups...
+            String[] groups = refreshQuery.getGroupKeys();
+            if (groups != null && groups.length > 0) {
+
                 for (int i = 0; i < groups.length; i++) {
                     context.getQueryCache().removeGroup(groups[i]);
                 }
@@ -201,8 +202,35 @@
                 // cascade group invalidation
                 return !DONE;
             }
+
+            // shouldn't ever happen
+            return DONE;
         }
 
         return !DONE;
+    }
+
+    private void invalidateLocally(ObjectStore objectStore, Iterator it) {
+        Map diffMap = objectStore.getChangesByObjectId();
+
+        while (it.hasNext()) {
+            Persistent object = (Persistent) it.next();
+
+            int state = object.getPersistenceState();
+
+            // we don't care about NEW objects,
+            // but we still do care about HOLLOW, since snapshot might still
+            // be present
+            if (state == PersistenceState.NEW) {
+                continue;
+            }
+
+            if (state == PersistenceState.MODIFIED || state == PersistenceState.DELETED) {
+                // remove cached changes
+                diffMap.remove(object.getObjectId());
+            }
+
+            object.setPersistenceState(PersistenceState.HOLLOW);
+        }
     }
 }

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java?rev=433204&r1=433203&r2=433204&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java Mon Aug 21 02:42:02 2006
@@ -243,6 +243,18 @@
         if (query instanceof RefreshQuery) {
             RefreshQuery refreshQuery = (RefreshQuery) query;
 
+            if (refreshQuery.isRefreshAll()) {
+
+                // not sending any events - peer contexts will not get refreshed
+                domain.getSharedSnapshotCache().clear();
+                context.getQueryCache().clear();
+
+                GenericResponse response = new GenericResponse();
+                response.addUpdateCount(1);
+                this.response = response;
+                return DONE;
+            }
+
             Collection objects = refreshQuery.getObjects();
             if (objects != null && !objects.isEmpty()) {
 
@@ -268,9 +280,10 @@
                 this.response = response;
                 return DONE;
             }
-            // 2. refresh query - this shouldn't normally happen as child datacontext
+
+            // 3. refresh query - this shouldn't normally happen as child datacontext
             // usually does a cascading refresh
-            else if (refreshQuery.getQuery() != null) {
+            if (refreshQuery.getQuery() != null) {
                 Query cachedQuery = refreshQuery.getQuery();
 
                 String cacheKey = cachedQuery
@@ -281,8 +294,9 @@
                 this.response = domain.onQuery(context, cachedQuery);
                 return DONE;
             }
-            // 3. refresh groups...
-            else if (refreshQuery.getGroupKeys() != null
+
+            // 4. refresh groups...
+            if (refreshQuery.getGroupKeys() != null
                     && refreshQuery.getGroupKeys().length > 0) {
 
                 String[] groups = refreshQuery.getGroupKeys();

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java?rev=433204&r1=433203&r2=433204&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/access/RefreshQueryInContextTst.java Mon Aug 21 02:42:02 2006
@@ -221,7 +221,7 @@
         assertEquals("c", p1.getToArtist().getArtistName());
         assertEquals("b", p2.getToArtist().getArtistName());
     }
-    
+
     public void testRefreshQueryResultsSharedCache() throws Exception {
         deleteTestData();
         createTestData("testRefreshCollection");
@@ -347,5 +347,63 @@
         assertNotSame(a1, p2.getToArtist());
         assertEquals("c", p1.getToArtist().getArtistName());
         assertEquals("b", p2.getToArtist().getArtistName());
+    }
+
+    public void testRefreshAll() throws Exception {
+        deleteTestData();
+        createTestData("testRefreshCollection");
+
+        DataContext context = createDataContext();
+
+        SelectQuery q = new SelectQuery(Artist.class);
+        q.addOrdering("db:ARTIST_ID", true);
+        List artists = context.performQuery(q);
+
+        Artist a1 = (Artist) artists.get(0);
+        Artist a2 = (Artist) artists.get(1);
+        Painting p1 = (Painting) a1.getPaintingArray().get(0);
+        Painting p2 = (Painting) a1.getPaintingArray().get(0);
+
+        assertNotNull(context
+                .getParentDataDomain()
+                .getSharedSnapshotCache()
+                .getCachedSnapshot(a1.getObjectId()));
+        assertNotNull(context
+                .getParentDataDomain()
+                .getSharedSnapshotCache()
+                .getCachedSnapshot(a2.getObjectId()));
+        assertNotNull(context
+                .getParentDataDomain()
+                .getSharedSnapshotCache()
+                .getCachedSnapshot(p1.getObjectId()));
+        assertNotNull(context
+                .getParentDataDomain()
+                .getSharedSnapshotCache()
+                .getCachedSnapshot(p2.getObjectId()));
+
+        RefreshQuery refresh = new RefreshQuery();
+        context.performQuery(refresh);
+
+        assertNull(context
+                .getParentDataDomain()
+                .getSharedSnapshotCache()
+                .getCachedSnapshot(a1.getObjectId()));
+        assertNull(context
+                .getParentDataDomain()
+                .getSharedSnapshotCache()
+                .getCachedSnapshot(a2.getObjectId()));
+        assertNull(context
+                .getParentDataDomain()
+                .getSharedSnapshotCache()
+                .getCachedSnapshot(p1.getObjectId()));
+        assertNull(context
+                .getParentDataDomain()
+                .getSharedSnapshotCache()
+                .getCachedSnapshot(p2.getObjectId()));
+
+        assertEquals(PersistenceState.HOLLOW, a1.getPersistenceState());
+        assertEquals(PersistenceState.HOLLOW, a2.getPersistenceState());
+        assertEquals(PersistenceState.HOLLOW, p1.getPersistenceState());
+        assertEquals(PersistenceState.HOLLOW, p2.getPersistenceState());
     }
 }