You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2009/09/15 16:16:25 UTC

svn commit: r815340 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/ main/java/org/apache/jackrabbit/core/data/ test/java/org/apache/jackrabbit/core/data/

Author: thomasm
Date: Tue Sep 15 14:16:24 2009
New Revision: 815340

URL: http://svn.apache.org/viewvc?rev=815340&view=rev
Log:
JCR-1865 Add the Data Store to the Jackrabbit API

Added:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryManagerImpl.java
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryFactoryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransientRepository.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/ScanEventListener.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCConcurrentTest.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCEventListenerTest.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCThread.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GarbageCollectorTest.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryFactoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryFactoryImpl.java?rev=815340&r1=815339&r2=815340&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryFactoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryFactoryImpl.java Tue Sep 15 14:16:24 2009
@@ -16,20 +16,23 @@
  */
 package org.apache.jackrabbit.core;
 
+import java.util.HashSet;
 import java.util.Map;
 import java.util.HashMap;
+import java.util.Set;
 
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 
-import javax.jcr.RepositoryFactory;
 import org.apache.jackrabbit.api.JackrabbitRepository;
+import org.apache.jackrabbit.api.JackrabbitRepositoryFactory;
+import org.apache.jackrabbit.api.management.RepositoryManager;
 
 /**
  * <code>RepositoryFactoryImpl</code> implements a repository factory that
  * creates a {@link TransientRepository} on {@link #getRepository(Map)}.
  */
-public class RepositoryFactoryImpl implements RepositoryFactory {
+public class RepositoryFactoryImpl implements JackrabbitRepositoryFactory {
 
     /**
      * Name of the repository home parameter.
@@ -49,6 +52,11 @@
      */
     private static final Map<String, JackrabbitRepository> REPOSITORY_INSTANCES = new HashMap<String, JackrabbitRepository>();
 
+    /**
+     * The repository instances that were created by this factory.
+     */
+    private final Set<TransientRepository> ownRepositories = new HashSet<TransientRepository>();
+
     public Repository getRepository(Map parameters) throws RepositoryException {
         JackrabbitRepository repo;
         synchronized (REPOSITORY_INSTANCES) {
@@ -91,8 +99,19 @@
                 tr = new TransientRepository(conf, home);
             }
             REPOSITORY_INSTANCES.put(tr.getHomeDir(), tr);
+            ownRepositories.add(tr);
             repo = tr;
         }
         return repo;
     }
+
+    public RepositoryManager getRepositoryManager(JackrabbitRepository repo) throws RepositoryException {
+        if (repo instanceof TransientRepository) {
+            throw new RepositoryException("The repository was not created in this factory");
+        }
+        if (!ownRepositories.contains(repo)) {
+            throw new RepositoryException("The repository was not created in this factory");
+        }
+        return new RepositoryManagerImpl((TransientRepository) repo);
+    }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?rev=815340&r1=815339&r2=815340&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java Tue Sep 15 14:16:24 2009
@@ -34,8 +34,6 @@
 import java.util.Properties;
 import java.util.Set;
 import java.util.Iterator;
-import java.util.concurrent.Executors;
-import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -1181,7 +1179,7 @@
         // wake up threads waiting on this instance's monitor (e.g. workspace janitor)
         notifyAll();
 
-        // Shut down the executor service 
+        // Shut down the executor service
         executor.shutdown();
         try {
             // Wait for all remaining background threads to terminate

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryManagerImpl.java?rev=815340&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryManagerImpl.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryManagerImpl.java Tue Sep 15 14:16:24 2009
@@ -0,0 +1,86 @@
+/*
+ * 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.jackrabbit.core;
+
+import java.util.ArrayList;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.jackrabbit.api.management.DataStoreGarbageCollector;
+import org.apache.jackrabbit.api.management.RepositoryManager;
+import org.apache.jackrabbit.core.RepositoryImpl.WorkspaceInfo;
+import org.apache.jackrabbit.core.data.GarbageCollector;
+import org.apache.jackrabbit.core.persistence.IterablePersistenceManager;
+import org.apache.jackrabbit.core.persistence.PersistenceManager;
+import org.apache.jackrabbit.core.version.InternalVersionManagerImpl;
+
+/**
+ * The repository manager implementation.
+ */
+public class RepositoryManagerImpl implements RepositoryManager {
+
+    private final TransientRepository tr;
+
+    RepositoryManagerImpl(TransientRepository tr) {
+        this.tr = tr;
+    }
+
+    public DataStoreGarbageCollector createDataStoreGarbageCollector() throws RepositoryException {
+        RepositoryImpl rep = tr.getRepository();
+        if (rep == null) {
+            throw new RepositoryException("Repository is stopped");
+        }
+        ArrayList<PersistenceManager> pmList = new ArrayList<PersistenceManager>();
+        InternalVersionManagerImpl vm = (InternalVersionManagerImpl) rep.getVersionManager();
+        PersistenceManager pm = vm.getPersistenceManager();
+        pmList.add(pm);
+        String[] wspNames = rep.getWorkspaceNames();
+        Session[] sessions = new Session[wspNames.length];
+        for (int i = 0; i < wspNames.length; i++) {
+            String wspName = wspNames[i];
+            WorkspaceInfo wspInfo = rep.getWorkspaceInfo(wspName);
+            // this will initialize the workspace if required
+            SessionImpl session = SystemSession.create(rep, wspInfo.getConfig());
+            // mark this session as 'active' so the workspace does not get disposed
+            // by the workspace-janitor until the garbage collector is done
+            rep.onSessionCreated(session);
+            // the workspace could be disposed again, so re-initialize if required
+            // afterwards it will not be disposed because a session is registered
+            wspInfo.initialize();
+            sessions[i] = session;
+            pm = wspInfo.getPersistenceManager();
+            pmList.add(pm);
+        }
+        IterablePersistenceManager[] ipmList = new IterablePersistenceManager[pmList.size()];
+        for (int i = 0; i < pmList.size(); i++) {
+            pm = pmList.get(i);
+            if (!(pm instanceof IterablePersistenceManager)) {
+                ipmList = null;
+                break;
+            }
+            ipmList[i] = (IterablePersistenceManager) pm;
+        }
+        GarbageCollector gc = new GarbageCollector(null, ipmList, sessions);
+        return gc;
+    }
+
+    public void stop() {
+        tr.shutdown();
+    }
+
+}

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransientRepository.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransientRepository.java?rev=815340&r1=815339&r2=815340&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransientRepository.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TransientRepository.java Tue Sep 15 14:16:24 2009
@@ -418,4 +418,13 @@
     public void loggingOut(SessionImpl session) {
     }
 
+    /**
+     * Get the current repository.
+     *
+     * @return the repository
+     */
+    RepositoryImpl getRepository() {
+        return repository;
+    }
+
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java?rev=815340&r1=815339&r2=815340&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java Tue Sep 15 14:16:24 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.core.data;
 
+import org.apache.jackrabbit.api.management.DataStoreGarbageCollector;
+import org.apache.jackrabbit.api.management.MarkEventListener;
 import org.apache.jackrabbit.core.id.NodeId;
 import org.apache.jackrabbit.core.id.PropertyId;
 import org.apache.jackrabbit.core.RepositoryImpl;
@@ -32,7 +34,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -64,20 +65,25 @@
  * <p>
  * Example code to run the data store garbage collection:
  * <pre>
- * GarbageCollector gc = ((SessionImpl)session).createDataStoreGarbageCollector();
- * gc.scan();
- * gc.stopScan();
- * gc.deleteUnused();
+ * JackrabbitRepositoryFactory jf = (JackrabbitRepositoryFactory) factory;
+ * RepositoryManager m = factory.getRepositoryManager((JackrabbitRepository) rep);
+ * GarbageCollector gc = m.createDataStoreGarbageCollector();
+ * try {
+ *     gc.mark();
+ *     gc.sweep();
+ * } finally {
+ *     gc.close();
+ * }
  * </pre>
  */
-public class GarbageCollector {
+public class GarbageCollector implements DataStoreGarbageCollector {
 
     /** logger instance */
     private static final Logger LOG = LoggerFactory.getLogger(GarbageCollector.class);
 
-    private ScanEventListener callback;
+    private MarkEventListener callback;
 
-    private int sleepBetweenNodes;
+    private long sleepBetweenNodes;
 
     private int testDelay;
 
@@ -90,14 +96,12 @@
     private final IterablePersistenceManager[] pmList;
 
     private final Session[] sessionList;
-    private final SessionListener sessionListener;
+    private SessionListener sessionListener;
 
     private final AtomicBoolean closed = new AtomicBoolean();
 
     private boolean persistenceManagerScan;
 
-    // TODO It should be possible to stop and restart a garbage collection scan.
-
     /**
      * Create a new garbage collector.
      * This method is usually not called by the application, it is called
@@ -114,28 +118,27 @@
         this.persistenceManagerScan = list != null;
         this.sessionList = sessionList;
 
-        // Auto-close if the main session logs out
-        this.sessionListener = new SessionListener() {
-            public void loggedOut(SessionImpl session) {
-            }
-            public void loggingOut(SessionImpl session) {
-                close();
-            }
-        };
-        session.addListener(sessionListener);
+        if (session != null) {
+            // Auto-close if the main session logs out
+            this.sessionListener = new SessionListener() {
+                public void loggedOut(SessionImpl session) {
+                }
+                public void loggingOut(SessionImpl session) {
+                    close();
+                }
+            };
+            session.addListener(sessionListener);
+        }
     }
 
-    /**
-     * Set the delay between scanning items.
-     * The main scan loop sleeps this many milliseconds after
-     * scanning a node. The default is 0, meaning the scan should run at full speed.
-     *
-     * @param millis the number of milliseconds to sleep
-     */
-    public void setSleepBetweenNodes(int millis) {
+    public void setSleepBetweenNodes(long millis) {
         this.sleepBetweenNodes = millis;
     }
 
+    public long getSleepBetweenNodes() {
+        return sleepBetweenNodes;
+    }
+
     /**
      * When testing the garbage collection, a delay is used instead of simulating concurrent access.
      *
@@ -146,29 +149,24 @@
     }
 
     /**
-     * Set the event listener. If set, the event listener will be called
-     * for each item that is scanned. This mechanism can be used
-     * to display the progress.
-     *
-     * @param callback if set, this is called while scanning
+     * @deprecated use setMarkEventListener().
      */
     public void setScanEventListener(ScanEventListener callback) {
+        setMarkEventListener(callback);
+    }
+
+    public void setMarkEventListener(MarkEventListener callback) {
         this.callback = callback;
     }
 
     /**
-     * Scan the repository. The garbage collector will iterate over all nodes in the repository
-     * and update the last modified date. If all persistence managers implement the
-     * IterablePersistenceManager interface, this mechanism will be used; if not, the garbage
-     * collector will scan the repository using the JCR API starting from the root node.
-     *
-     * @throws RepositoryException
-     * @throws IllegalStateException
-     * @throws IOException
-     * @throws ItemStateException
+     * @deprecated use mark().
      */
-    public void scan() throws RepositoryException,
-            IllegalStateException, IOException, ItemStateException {
+    public void scan() throws RepositoryException {
+        mark();
+    }
+
+    public void mark() throws RepositoryException {
         if (store == null) {
             throw new RepositoryException("No DataStore configured.");
         }
@@ -183,12 +181,15 @@
                 scanNodes(s);
             }
         } else {
-            scanPersistenceManagers();
+            try {
+                scanPersistenceManagers();
+            } catch (ItemStateException e) {
+                throw new RepositoryException(e);
+            }
         }
     }
 
-    private void scanNodes(Session session)
-        throws RepositoryException, IllegalStateException, IOException {
+    private void scanNodes(Session session) throws RepositoryException {
 
         // add a listener to get 'new' nodes
         // actually, new nodes are not the problem, but moved nodes
@@ -199,28 +200,22 @@
         recurse(session.getRootNode(), sleepBetweenNodes);
     }
 
-    /**
-     * Enable or disable using the IterablePersistenceManager interface
-     * to scan the items. This is important for clients that need
-     * the complete Node implementation in the ScanEventListener
-     * callback.
-     *
-     * @param allow true if using the IterablePersistenceManager interface is allowed
-     */
     public void setPersistenceManagerScan(boolean allow) {
         persistenceManagerScan = allow;
     }
 
+    public boolean isPersistenceManagerScan() {
+        return persistenceManagerScan;
+    }
+
     /**
-     * Check if using the IterablePersistenceManager interface is allowed.
-     *
-     * @return true if using IterablePersistenceManager is possible.
+     * @deprecated use isPersistenceManagerScan().
      */
     public boolean getPersistenceManagerScan() {
-        return persistenceManagerScan;
+        return isPersistenceManagerScan();
     }
 
-    private void scanPersistenceManagers() throws ItemStateException, RepositoryException {
+    private void scanPersistenceManagers() throws RepositoryException, ItemStateException {
         for (IterablePersistenceManager pm : pmList) {
             for (NodeId id : pm.getAllNodeIds(null, 0)) {
                 if (callback != null) {
@@ -244,50 +239,39 @@
                     // the node may have been deleted or moved in the meantime
                     // ignore it
                 }
-                if (callback != null) {
-                    callback.afterScanning(null);
-                }
             }
         }
     }
 
     /**
-     * The repository was scanned. This method will stop the observation
-     * listener.
+     * Stop the observation listener if any are installed.
      */
     public void stopScan() throws RepositoryException {
-        checkScanStarted();
-        for (Listener listener : listeners) {
-            try {
-                listener.stop();
-            } catch (Exception e) {
-                throw new RepositoryException(e);
+        if (listeners.size() > 0) {
+            for (Listener listener : listeners) {
+                try {
+                    listener.stop();
+                } catch (Exception e) {
+                    throw new RepositoryException(e);
+                }
             }
+            listeners.clear();
         }
-        listeners.clear();
     }
 
     /**
-     * Delete all unused items in the data store.
-     *
-     * @return the number of deleted items
+     * @deprecated use sweep().
      */
     public int deleteUnused() throws RepositoryException {
-        checkScanStarted();
-        checkScanStopped();
-        return store.deleteAllOlderThan(startScanTimestamp);
+        return sweep();
     }
 
-    private void checkScanStarted() throws RepositoryException {
+    public int sweep() throws RepositoryException {
         if (startScanTimestamp == 0) {
             throw new RepositoryException("scan must be called first");
         }
-    }
-
-    private void checkScanStopped() throws RepositoryException {
-        if (listeners.size() > 0) {
-            throw new RepositoryException("stopScan must be called first");
-        }
+        stopScan();
+        return store.deleteAllOlderThan(startScanTimestamp);
     }
 
     /**
@@ -299,8 +283,7 @@
         return store;
     }
 
-    private void recurse(final Node n, int sleep) throws RepositoryException,
-            IllegalStateException, IOException {
+    private void recurse(final Node n, long sleep) throws RepositoryException {
         if (sleep > 0) {
             try {
                 Thread.sleep(sleep);
@@ -334,9 +317,6 @@
         } catch (InvalidItemStateException e) {
             LOG.debug("Node removed concurrently - ignoring", e);
         }
-        if (callback != null) {
-            callback.afterScanning(n);
-        }
         try {
             for (NodeIterator it = n.getNodes(); it.hasNext();) {
                 recurse(it.nextNode(), sleep);
@@ -382,11 +362,13 @@
          */
     }
 
-    /**
-     * Cleanup resources used internally by this instance.
-     */
     public void close() {
         if (!closed.getAndSet(true)) {
+            try {
+                stopScan();
+            } catch (RepositoryException e) {
+                LOG.warn("An error occured when stopping the event listener", e);
+            }
             for (Session s : sessionList) {
                 s.logout();
             }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/ScanEventListener.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/ScanEventListener.java?rev=815340&r1=815339&r2=815340&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/ScanEventListener.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/ScanEventListener.java Tue Sep 15 14:16:24 2009
@@ -16,28 +16,11 @@
  */
 package org.apache.jackrabbit.core.data;
 
-import java.util.EventListener;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
+import org.apache.jackrabbit.api.management.MarkEventListener;
 
 /**
  * The listener interface for receiving garbage collection scan events.
  */
-public interface ScanEventListener extends EventListener {
-
-    /**
-     * This method is called before a node is scanned.
-     */
-    void beforeScanning(Node n) throws RepositoryException;
-
-    /**
-     * This method is called after a node is scanned.
-     */
-    void afterScanning(Node n) throws RepositoryException;
+public interface ScanEventListener extends MarkEventListener {
 
-    /**
-     * This method is called when the garbage collection scan is finished.
-     */
-    void done();
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCConcurrentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCConcurrentTest.java?rev=815340&r1=815339&r2=815340&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCConcurrentTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCConcurrentTest.java Tue Sep 15 14:16:24 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.core.data;
 
+import org.apache.jackrabbit.api.management.DataStoreGarbageCollector;
+import org.apache.jackrabbit.api.management.MarkEventListener;
 import org.apache.jackrabbit.core.RepositoryImpl;
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.test.AbstractJCRTest;
@@ -52,22 +54,19 @@
         final String testNodeName = "testConcurrentDelete";
         node(root, testNodeName);
         session.save();
-        GarbageCollector gc = ((SessionImpl) session).createDataStoreGarbageCollector();
+        DataStoreGarbageCollector gc = ((SessionImpl) session).createDataStoreGarbageCollector();
         gc.setPersistenceManagerScan(false);
-        gc.setScanEventListener(new ScanEventListener() {
+        gc.setMarkEventListener(new MarkEventListener() {
             public void beforeScanning(Node n) throws RepositoryException {
                 if (n.getName().equals(testNodeName)) {
                     n.remove();
                     n.getSession().save();
                 }
             }
-            public void afterScanning(Node n) throws RepositoryException {
-            }
-            public void done() {
-            }
+
         });
-        gc.scan();
-        gc.stopScan();
+        gc.mark();
+        gc.close();
     }
 
     public void testGC() throws Exception {

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCEventListenerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCEventListenerTest.java?rev=815340&r1=815339&r2=815340&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCEventListenerTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCEventListenerTest.java Tue Sep 15 14:16:24 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.core.data;
 
+import org.apache.jackrabbit.api.management.DataStoreGarbageCollector;
+import org.apache.jackrabbit.api.management.MarkEventListener;
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.test.AbstractJCRTest;
 import org.slf4j.Logger;
@@ -35,17 +37,17 @@
  *
  * @author Thomas Mueller
  */
-public class GCEventListenerTest extends AbstractJCRTest implements ScanEventListener {
+public class GCEventListenerTest extends AbstractJCRTest implements MarkEventListener {
 
     /** logger instance */
     private static final Logger LOG = LoggerFactory.getLogger(GCEventListenerTest.class);
 
+    private static final String TEST_NODE_NAME = "testGCEventListener";
+
     private boolean gotNullNode;
     private boolean gotNode;
     private int count;
 
-    private static final String TEST_NODE_NAME = "testGCEventListener";
-
     public void testEventListener() throws Exception {
         doTestEventListener(true);
         doTestEventListener(false);
@@ -74,16 +76,16 @@
         }
         session.save();
         SessionImpl si = (SessionImpl) session;
-        GarbageCollector gc = si.createDataStoreGarbageCollector();
-        if (gc.getDataStore() != null) {
-            gc.getDataStore().clearInUse();
-            boolean pmScan = gc.getPersistenceManagerScan();
+        DataStoreGarbageCollector gc = si.createDataStoreGarbageCollector();
+        DataStore ds = ((GarbageCollector) gc).getDataStore();
+        if (ds != null) {
+            ds.clearInUse();
+            boolean pmScan = gc.isPersistenceManagerScan();
             gc.setPersistenceManagerScan(allowPmScan);
             gotNullNode = false;
             gotNode = false;
-            gc.setScanEventListener(this);
-            gc.scan();
-            gc.stopScan();
+            gc.setMarkEventListener(this);
+            gc.mark();
             if (pmScan && allowPmScan) {
                 assertTrue("PM scan without null Node", gotNullNode);
                 assertFalse("PM scan, but got a real node", gotNode);
@@ -91,7 +93,7 @@
                 assertFalse("Not a PM scan - but got a null Node", gotNullNode);
                 assertTrue("Not a PM scan - without a real node", gotNode);
             }
-            int deleted = gc.deleteUnused();
+            int deleted = gc.sweep();
             LOG.debug("Deleted " + deleted);
             assertTrue("Should delete at least one item", deleted >= 0);
             gc.close();

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCThread.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCThread.java?rev=815340&r1=815339&r2=815340&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCThread.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCThread.java Tue Sep 15 14:16:24 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.core.data;
 
+import org.apache.jackrabbit.api.management.DataStoreGarbageCollector;
+import org.apache.jackrabbit.api.management.MarkEventListener;
 import org.apache.jackrabbit.core.SessionImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,7 +31,7 @@
 /**
  * Helper class that runs data store garbage collection as a background thread.
  */
-public class GCThread implements Runnable, ScanEventListener {
+public class GCThread implements Runnable, MarkEventListener {
 
     /** logger instance */
     private static final Logger LOG = LoggerFactory.getLogger(GCThread.class);
@@ -45,15 +47,16 @@
     public void run() {
 
         try {
-            GarbageCollector gc = ((SessionImpl) session).createDataStoreGarbageCollector();
-            gc.setScanEventListener(this);
+            GarbageCollector gc = ((SessionImpl) session)
+                    .createDataStoreGarbageCollector();
+            gc.setMarkEventListener(this);
             while (!stop) {
                 LOG.debug("Scanning...");
-                gc.scan();
+                gc.mark();
                 int count = listIdentifiers(gc);
                 LOG.debug("Stop; currently " + count + " identifiers");
                 gc.stopScan();
-                int numDeleted = gc.deleteUnused();
+                int numDeleted = gc.sweep();
                 if (numDeleted > 0) {
                     LOG.debug("Deleted " + numDeleted + " identifiers");
                 }
@@ -75,8 +78,9 @@
         return exception;
     }
 
-    private int listIdentifiers(GarbageCollector gc) throws DataStoreException {
-        Iterator<DataIdentifier> it = gc.getDataStore().getAllIdentifiers();
+    private int listIdentifiers(DataStoreGarbageCollector gc) throws DataStoreException {
+        DataStore ds = ((GarbageCollector) gc).getDataStore();
+        Iterator<DataIdentifier> it = ds.getAllIdentifiers();
         int count = 0;
         while (it.hasNext()) {
             DataIdentifier id = it.next();

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GarbageCollectorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GarbageCollectorTest.java?rev=815340&r1=815339&r2=815340&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GarbageCollectorTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GarbageCollectorTest.java Tue Sep 15 14:16:24 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.core.data;
 
+import org.apache.jackrabbit.api.management.DataStoreGarbageCollector;
+import org.apache.jackrabbit.api.management.MarkEventListener;
 import org.apache.jackrabbit.core.RepositoryImpl;
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.test.AbstractJCRTest;
@@ -48,22 +50,15 @@
             LOG.info("testConcurrentClose skipped. Data store is not used.");
             return;
         }
-        final GarbageCollector gc = ((SessionImpl) session).createDataStoreGarbageCollector();
+        final DataStoreGarbageCollector gc = ((SessionImpl) session).createDataStoreGarbageCollector();
         final Exception[] ex = new Exception[1];
-        gc.setScanEventListener(new ScanEventListener() {
+        gc.setMarkEventListener(new MarkEventListener() {
             boolean closed;
 
-            public void afterScanning(Node n) throws RepositoryException {
-                closeTest();
-            }
-
             public void beforeScanning(Node n) throws RepositoryException {
                 closeTest();
             }
 
-            public void done() {
-            }
-
             private void closeTest() throws RepositoryException {
                 if (closed) {
                     ex[0] = new Exception("Scanning after the session is closed");
@@ -74,7 +69,7 @@
 
         });
         try {
-            gc.scan();
+            gc.mark();
             fail("Exception 'session has been closed' expected");
         } catch (RepositoryException e) {
             LOG.debug("Expected exception caught: " + e.getMessage());
@@ -127,10 +122,9 @@
             }
         }.start();
         assertEquals("x", sync.take());
-        GarbageCollector gc = ((SessionImpl) session).createDataStoreGarbageCollector();
-        gc.scan();
-        gc.stopScan();
-        gc.deleteUnused();
+        DataStoreGarbageCollector gc = ((SessionImpl) session).createDataStoreGarbageCollector();
+        gc.mark();
+        gc.sweep();
         sync.put("deleted");
         assertEquals("saved", sync.take());
         InputStream in = node.getProperty("slowBlob").getBinary().getStream();
@@ -176,13 +170,13 @@
         }
 
         LOG.debug("scanning...");
-        gc.scan();
+        gc.mark();
         int count = listIdentifiers(gc);
         LOG.debug("stop scanning; currently " + count + " identifiers");
         gc.stopScan();
         LOG.debug("deleting...");
         gc.getDataStore().clearInUse();
-        assertTrue(gc.deleteUnused() > 0);
+        assertTrue(gc.sweep() > 0);
         int count2 = listIdentifiers(gc);
         assertEquals(count - 1, count2);
 
@@ -193,17 +187,17 @@
 
     private void runGC(Session session, boolean all) throws Exception {
         GarbageCollector gc = ((SessionImpl)session).createDataStoreGarbageCollector();
-        gc.setScanEventListener(this);
+        gc.setMarkEventListener(this);
         if (gc.getDataStore() instanceof FileDataStore) {
             // make sure the file is old (access time resolution is 2 seconds)
             Thread.sleep(2000);
         }
-        gc.scan();
+        gc.mark();
         gc.stopScan();
         if (all) {
             gc.getDataStore().clearInUse();
         }
-        gc.deleteUnused();
+        gc.sweep();
         gc.close();
     }