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.
*/