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:28:28 UTC

svn commit: r1671760 - in /sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl: JcrInstaller.java RootFolderListener.java WatchedFolder.java

Author: cziegeler
Date: Tue Apr  7 08:28:27 2015
New Revision: 1671760

URL: http://svn.apache.org/r1671760
Log:
SLING-4564 : Use a single listener registered for multiple path in JCR installer. 

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/main/java/org/apache/sling/installer/provider/jcr/impl/WatchedFolder.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=1671760&r1=1671759&r2=1671760&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:28:27 2015
@@ -213,7 +213,7 @@ public class JcrInstaller implements Upd
                 session = repository.loginAdministrative(repository.getDefaultWorkspace());
 
                 for (final String path : cfg.getRoots()) {
-                    listeners.add(new RootFolderListener(session, path, updateFoldersListTimer));
+                    listeners.add(new RootFolderListener(session, path, updateFoldersListTimer, cfg));
                     logger.debug("Configured root folder: {}", path);
                 }
 

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=1671760&r1=1671759&r2=1671760&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:28:27 2015
@@ -18,6 +18,9 @@
  */
 package org.apache.sling.installer.provider.jcr.impl;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.observation.Event;
@@ -38,14 +41,18 @@ class RootFolderListener implements Even
     private final RescanTimer timer;
     private final String watchedPath;
 
-    RootFolderListener(final Session session, final String path, final RescanTimer timer)
+    private final InstallerConfig cfg;
+
+    RootFolderListener(final Session session, final String path, final RescanTimer timer, final InstallerConfig cfg)
     throws RepositoryException {
         this.timer = timer;
         this.watchedPath = path;
+        this.cfg = cfg;
 
-        int eventTypes = Event.NODE_ADDED | Event.NODE_REMOVED;
-        boolean isDeep = true;
-        boolean noLocal = true;
+        final int eventTypes = Event.NODE_ADDED | Event.NODE_REMOVED
+                | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED;
+        final boolean isDeep = true;
+        final boolean noLocal = true;
         session.getWorkspace().getObservationManager().addEventListener(this, eventTypes, watchedPath,
                 isDeep, null, null, noLocal);
 
@@ -65,14 +72,32 @@ class RootFolderListener implements Even
      * 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);
+        // we only do the global scan for node changes
+        boolean globalScan = false;
+        // copy watched folders
+        final List<WatchedFolder> checkFolders = new ArrayList<WatchedFolder>(cfg.getWatchedFolders());
+        while(it.hasNext()) {
+            final Event e = it.nextEvent();
+            logger.debug("Got event {}", e);
+            if ( e.getType() == Event.NODE_ADDED || e.getType() == Event.NODE_REMOVED ) {
+                globalScan = true;
             }
+            try {
+                final String path = e.getPath();
+
+                for(final WatchedFolder folder : checkFolders) {
+                    if ( path.startsWith(folder.getPathWithSlash()) ) {
+                        folder.onEvent(it);
+                        checkFolders.remove(folder);
+                        break;
+                    }
+                }
+            } catch ( final RepositoryException re ) {
+                logger.warn("Error while getting path from event", re);
+            }
+        }
+        if ( globalScan ) {
+            timer.scheduleScan();
         }
-        timer.scheduleScan();
     }
 }

Modified: sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/WatchedFolder.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/WatchedFolder.java?rev=1671760&r1=1671759&r2=1671760&view=diff
==============================================================================
--- sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/WatchedFolder.java (original)
+++ sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/WatchedFolder.java Tue Apr  7 08:28:27 2015
@@ -47,6 +47,7 @@ class WatchedFolder implements EventList
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private final String path;
+    private final String pathWithSlash;
     private final int priority;
     private final Session session;
     private final Collection <JcrInstaller.NodeConverter> converters;
@@ -72,6 +73,7 @@ class WatchedFolder implements EventList
         }
 
         this.path = path;
+        this.pathWithSlash = path.concat("/");
         this.converters = converters;
         this.priority = priority;
 
@@ -85,20 +87,20 @@ class WatchedFolder implements EventList
                 | Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED;
         final boolean isDeep = true;
         final boolean noLocal = true;
-        session.getWorkspace().getObservationManager().addEventListener(this, eventTypes, path,
-                isDeep, null, null, noLocal);
+//        session.getWorkspace().getObservationManager().addEventListener(this, eventTypes, path,
+//                isDeep, null, null, noLocal);
         this.needsScan = true;
 
         log.info("Watching folder {} (priority {})", path, priority);
     }
 
     public void stop() {
-    	try {
+/*    	try {
 	    	session.getWorkspace().getObservationManager().removeEventListener(this);
     	} catch(RepositoryException re) {
     		log.warn("RepositoryException in stop()", re);
     	}
-    }
+*/    }
 
     @Override
     public String toString() {
@@ -109,6 +111,10 @@ class WatchedFolder implements EventList
         return path;
     }
 
+    public String getPathWithSlash() {
+        return this.pathWithSlash;
+    }
+
     /**
      * Update scan flag whenever an observation event occurs.
      */