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();
+ }
+}