You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2015/04/07 10:03:21 UTC

svn commit: r1671754 - in /sling/trunk/installer/providers/jcr/src: main/java/org/apache/sling/installer/provider/jcr/impl/ test/java/org/apache/sling/installer/provider/jcr/impl/

Author: cziegeler
Date: Tue Apr  7 08:03:20 2015
New Revision: 1671754

URL: http://svn.apache.org/r1671754
Log:
SLING-4564 : Use a single listener registered for multiple path in JCR installer. Refactor watched folder to be part of the configuration

Modified:
    sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java
    sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderListener.java
    sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java

Modified: sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java?rev=1671754&r1=1671753&r2=1671754&view=diff
==============================================================================
--- sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java (original)
+++ sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java Tue Apr  7 08:03:20 2015
@@ -77,7 +77,7 @@ import org.slf4j.LoggerFactory;
     @Property(name=Constants.SERVICE_RANKING, intValue=100)
 })
 @Service(value=UpdateHandler.class)
-public class JcrInstaller implements EventListener, UpdateHandler, ManagedService {
+public class JcrInstaller implements UpdateHandler, ManagedService {
 
 	public static final long RUN_LOOP_DELAY_MSEC = 500L;
 	public static final String URL_SCHEME = "jcrinstall";
@@ -183,7 +183,8 @@ public class JcrInstaller implements Eve
 
     /** Thread that can be cleanly stopped with a flag */
     private final static AtomicInteger bgThreadCounter = new AtomicInteger();
-    class StoppableThread extends Thread {
+
+    class StoppableThread extends Thread implements EventListener {
 
         /** Used for synchronizing. */
         final Object lock = new Object();
@@ -212,12 +213,12 @@ public class JcrInstaller implements Eve
                 session = repository.loginAdministrative(repository.getDefaultWorkspace());
 
                 for (String path : cfg.getRoots()) {
-                    listeners.add(new RootFolderListener(session, cfg.getFolderNameFilter(), path, updateFoldersListTimer));
+                    listeners.add(new RootFolderListener(session, path, updateFoldersListTimer));
                     logger.debug("Configured root folder: {}", path);
                 }
 
                 // Watch for events on the root - that might be one of our root folders
-                session.getWorkspace().getObservationManager().addEventListener(JcrInstaller.this,
+                session.getWorkspace().getObservationManager().addEventListener(this,
                         Event.NODE_ADDED | Event.NODE_REMOVED,
                         "/",
                         false, // isDeep
@@ -234,8 +235,8 @@ public class JcrInstaller implements Eve
                         try {
                             while (events.hasNext()) {
                                 final Event e = events.nextEvent();
-                                JcrInstaller.this.checkChanges(cfg, e.getIdentifier());
-                                JcrInstaller.this.checkChanges(cfg, e.getPath());
+                                checkChanges(e.getIdentifier());
+                                checkChanges(e.getPath());
                             }
                         } catch (final RepositoryException re) {
                             logger.warn("RepositoryException in onEvent", re);
@@ -255,7 +256,7 @@ public class JcrInstaller implements Eve
 
 
                 // Find paths to watch and create WatchedFolders to manage them
-                for(String root : cfg.getRoots()) {
+                for(final String root : cfg.getRoots()) {
                     findPathsToWatch(cfg, session, root);
                 }
 
@@ -290,7 +291,7 @@ public class JcrInstaller implements Eve
                     for(RootFolderListener wfc : listeners) {
                         wfc.cleanup(session);
                     }
-                    session.getWorkspace().getObservationManager().removeEventListener(JcrInstaller.this);
+                    session.getWorkspace().getObservationManager().removeEventListener(this);
                     if ( moveEventListener != null ) {
                         session.getWorkspace().getObservationManager().removeEventListener(moveEventListener);
                         moveEventListener = null;
@@ -306,6 +307,36 @@ public class JcrInstaller implements Eve
             listeners.clear();
         }
 
+        /**
+         * @see javax.jcr.observation.EventListener#onEvent(javax.jcr.observation.EventIterator)
+         */
+        public void onEvent(final EventIterator it) {
+            // Got a DELETE or ADD on root - schedule folders rescan if one
+            // of our root folders is impacted
+            try {
+                while(it.hasNext()) {
+                    final Event e = it.nextEvent();
+                    logger.debug("Got event {}", e);
+
+                    this.checkChanges(e.getPath());
+                }
+            } catch(final RepositoryException re) {
+                logger.warn("RepositoryException in onEvent", re);
+            }
+        }
+
+        /**
+         * Check for changes in any of the root folders
+         */
+        private void checkChanges(final String path) {
+            for(final String root : cfg.getRoots()) {
+                if (path.startsWith(root)) {
+                    logger.info("Got event for root {}, scheduling scanning of new folders", root);
+                    updateFoldersListTimer.scheduleScan();
+                }
+            }
+        }
+
         @Override
         public final void run() {
             logger.info("Background thread {} starting", Thread.currentThread().getName());
@@ -501,18 +532,6 @@ public class JcrInstaller implements Eve
         return removedResources;
     }
 
-    /**
-     * Check for changes in any of the root folders
-     */
-    private void checkChanges(final InstallerConfig cfg, final String path) {
-        for(String root : cfg.getRoots()) {
-            if (path.startsWith(root)) {
-                logger.info("Got event for root {}, scheduling scanning of new folders", root);
-                updateFoldersListTimer.scheduleScan();
-            }
-        }
-    }
-
     InstallerConfig getConfiguration() {
         InstallerConfig cfg = null;
         final StoppableThread st = this.backgroundThread;
@@ -527,28 +546,6 @@ public class JcrInstaller implements Eve
     }
 
     /**
-     * @see javax.jcr.observation.EventListener#onEvent(javax.jcr.observation.EventIterator)
-     */
-    public void onEvent(final EventIterator it) {
-        // Got a DELETE or ADD on root - schedule folders rescan if one
-        // of our root folders is impacted
-        // get configuration
-        final InstallerConfig cfg = this.getConfiguration();
-        if ( cfg != null ) {
-            try {
-                while(it.hasNext()) {
-                    final Event e = it.nextEvent();
-                    logger.debug("Got event {}", e);
-
-                    this.checkChanges(cfg, e.getPath());
-                }
-            } catch(RepositoryException re) {
-                logger.warn("RepositoryException in onEvent", re);
-            }
-        }
-    }
-
-    /**
      * Run periodic scans of our watched folders, and watch for folders creations/deletions.
      */
     public void runOneCycle(final InstallerConfig cfg, final Session session) {

Modified: sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderListener.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderListener.java?rev=1671754&r1=1671753&r2=1671754&view=diff
==============================================================================
--- sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderListener.java (original)
+++ sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderListener.java Tue Apr  7 08:03:20 2015
@@ -27,16 +27,19 @@ import javax.jcr.observation.EventListen
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/** Listen for JCR events under one of our roots, to find out
- *  when new WatchedFolders must be created, or when some might
- *  have been deleted.
+/**
+ * Listen for JCR events under one of our roots, to find out
+ * when new WatchedFolders must be created, or when some might
+ * have been deleted.
  */
 class RootFolderListener implements EventListener {
-    protected final Logger log = LoggerFactory.getLogger(this.getClass());
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
     private final RescanTimer timer;
     private final String watchedPath;
 
-    RootFolderListener(Session session, FolderNameFilter fnf, String path, RescanTimer timer) throws RepositoryException {
+    RootFolderListener(final Session session, final String path, final RescanTimer timer)
+    throws RepositoryException {
         this.timer = timer;
         this.watchedPath = path;
 
@@ -46,7 +49,7 @@ class RootFolderListener implements Even
         session.getWorkspace().getObservationManager().addEventListener(this, eventTypes, watchedPath,
                 isDeep, null, null, noLocal);
 
-        log.info("Watching {} to detect potential changes in subfolders", watchedPath);
+        logger.info("Watching {} to detect potential changes in subfolders", watchedPath);
     }
 
     @Override
@@ -54,15 +57,21 @@ class RootFolderListener implements Even
         return getClass().getSimpleName() + " (" + watchedPath + ")";
     }
 
-    void cleanup(Session session) throws RepositoryException {
+    void cleanup(final Session session) throws RepositoryException {
         session.getWorkspace().getObservationManager().removeEventListener(this);
     }
 
-    /** Schedule a scan */
-    public void onEvent(EventIterator it) {
-        while(it.hasNext()) {
-            final Event e = it.nextEvent();
-            log.debug("Got event {}", e);
+    /**
+     * Schedule a scan.
+     */
+    public void onEvent(final EventIterator it) {
+        // we don't care about the events
+        // they are only logged if debug log level
+        if ( logger.isDebugEnabled() ) {
+            while(it.hasNext()) {
+                final Event e = it.nextEvent();
+                logger.debug("Got event {}", e);
+            }
         }
         timer.scheduleScan();
     }

Modified: sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java?rev=1671754&r1=1671753&r2=1671754&view=diff
==============================================================================
--- sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java (original)
+++ sling/trunk/installer/providers/jcr/src/test/java/org/apache/sling/installer/provider/jcr/impl/MiscUtil.java Tue Apr  7 08:03:20 2015
@@ -25,7 +25,6 @@ import java.util.Hashtable;
 
 import org.apache.sling.commons.testing.jcr.EventHelper;
 import org.apache.sling.installer.api.OsgiInstaller;
-import org.apache.sling.installer.provider.jcr.impl.JcrInstaller.StoppableThread;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -99,15 +98,7 @@ class MiscUtil {
     /** Get the WatchedFolders of supplied JcrInstaller */
     @SuppressWarnings({ "unchecked"})
     static Collection<WatchedFolder> getWatchedFolders(JcrInstaller installer) throws Exception {
-        // get background thread
-        final Field threadField = installer.getClass().getDeclaredField("backgroundThread");
-        threadField.setAccessible(true);
-        final JcrInstaller.StoppableThread thread = (StoppableThread) threadField.get(installer);
-
-        // get configuration from thread
-        final Field configField = thread.getClass().getDeclaredField("cfg");
-        configField.setAccessible(true);
-        final InstallerConfig cfg = (InstallerConfig) configField.get(thread);
+        final InstallerConfig cfg = installer.getConfiguration();
 
         return cfg.getWatchedFolders();
     }