Author: bdelacretaz
Date: Mon Jan 25 14:35:05 2016
New Revision: 1726629

URL: http://svn.apache.org/viewvc?rev=1726629&view=rev
Log:
SLING-5371 - avoid deep listener on /, listen under installer roots only - 
contributed by Marc Pfaff, thanks!

Added:
    
sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderMoveListener.java
Modified:
    sling/trunk/installer/providers/jcr/pom.xml
    
sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/JcrInstaller.java

Modified: sling/trunk/installer/providers/jcr/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/installer/providers/jcr/pom.xml?rev=1726629&r1=1726628&r2=1726629&view=diff
==============================================================================
--- sling/trunk/installer/providers/jcr/pom.xml (original)
+++ sling/trunk/installer/providers/jcr/pom.xml Mon Jan 25 14:35:05 2016
@@ -137,6 +137,12 @@
             <version>1.5.11</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-api</artifactId>
+            <version>2.7.5</version>
+            <scope>provided</scope>
+        </dependency>
       <!-- Test -->
         <dependency>
             <groupId>ch.qos.logback</groupId>

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=1726629&r1=1726628&r2=1726629&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
 Mon Jan 25 14:35:05 2016
@@ -197,7 +197,7 @@ public class JcrInstaller implements Upd
         /** Detect newly created folders that we must watch */
         private final List<RootFolderListener> listeners = new 
LinkedList<RootFolderListener>();
 
-        private volatile EventListener moveEventListener;
+        private volatile RootFolderMoveListener moveEventListener;
 
         /** Session shared by all WatchedFolder */
         private volatile Session session;
@@ -225,31 +225,9 @@ public class JcrInstaller implements Upd
                         null,
                         true); // noLocal
                 // add special observation listener for move events
-                this.moveEventListener = new EventListener() {
-
-                    /**
-                     * @see 
javax.jcr.observation.EventListener#onEvent(javax.jcr.observation.EventIterator)
-                     */
-                    public void onEvent(final EventIterator events) {
-                        try {
-                            while (events.hasNext()) {
-                                final Event e = events.nextEvent();
-                                checkChanges(e.getIdentifier());
-                                checkChanges(e.getPath());
-                            }
-                        } catch (final RepositoryException re) {
-                            logger.warn("RepositoryException in onEvent", re);
-                        }
-                    }
-                };
-                
session.getWorkspace().getObservationManager().addEventListener(
-                        moveEventListener,
-                        Event.NODE_MOVED,
-                        "/",
-                        true, // isDeep
-                        null,
-                        null,
-                        true); // noLocal
+                if(cfg.getRoots() != null && cfg.getRoots().length > 0) {
+                    moveEventListener = new RootFolderMoveListener(session, 
cfg.getRoots(),  updateFoldersListTimer);
+                }
 
                 logger.debug("Watching for node events on / to detect 
removal/add of our root folders");
 
@@ -285,8 +263,8 @@ public class JcrInstaller implements Upd
                         wfc.cleanup(session);
                     }
                     
session.getWorkspace().getObservationManager().removeEventListener(this);
-                    if ( moveEventListener != null ) {
-                        
session.getWorkspace().getObservationManager().removeEventListener(moveEventListener);
+                    if (moveEventListener != null) {
+                        moveEventListener.cleanup(session);
                         moveEventListener = null;
                     }
                 }

Added: 
sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderMoveListener.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderMoveListener.java?rev=1726629&view=auto
==============================================================================
--- 
sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderMoveListener.java
 (added)
+++ 
sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl/RootFolderMoveListener.java
 Mon Jan 25 14:35:05 2016
@@ -0,0 +1,84 @@
+/*
+ * 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.sling.installer.provider.jcr.impl;
+
+import org.apache.jackrabbit.api.observation.JackrabbitEventFilter;
+import org.apache.jackrabbit.api.observation.JackrabbitObservationManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+import javax.jcr.observation.ObservationManager;
+import java.util.Arrays;
+
+/**
+ * Listen for JCR move events under one of our roots in order to detect 
installer artifacts that are moved from/to
+ * the installer roots.
+ */
+class RootFolderMoveListener implements EventListener {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final RescanTimer timer;
+
+    private final String[] watchedPaths;
+
+    RootFolderMoveListener(final Session session, final String[] rootFolders,  
final RescanTimer timer) throws RepositoryException {
+        this.timer = timer;
+        this.watchedPaths = rootFolders;
+
+        if (watchedPaths != null && watchedPaths.length > 0) {
+            JackrabbitEventFilter eventFilter = new JackrabbitEventFilter()
+                    .setAdditionalPaths(watchedPaths)
+                    .setEventTypes(Event.NODE_MOVED)
+                    .setIsDeep(true)
+                    .setNoLocal(true)
+                    .setNoExternal(false);
+            ObservationManager obsManager = 
session.getWorkspace().getObservationManager();
+            if(obsManager instanceof  JackrabbitObservationManager){
+                JackrabbitObservationManager observationManager = 
(JackrabbitObservationManager)obsManager;
+                observationManager.addEventListener(this, eventFilter);
+                logger.info("Watching {} to detect move changes in 
subfolders", Arrays.toString(watchedPaths));
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + " (" + watchedPaths + ")";
+    }
+
+    void cleanup(final Session session) throws RepositoryException {
+        if(watchedPaths != null && watchedPaths.length > 0){
+            
session.getWorkspace().getObservationManager().removeEventListener(this);
+        }
+    }
+
+
+    /**
+     * Schedule a scan.
+     */
+    public void onEvent(final EventIterator events) {
+        timer.scheduleScan();
+    }
+}


Reply via email to