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 2011/05/24 13:24:24 UTC
svn commit: r1126982 - in
/sling/trunk/installer/providers/jcr/src/main/java/org/apache/sling/installer/provider/jcr/impl:
JcrInstaller.java WatchedFolder.java
Author: cziegeler
Date: Tue May 24 11:24:24 2011
New Revision: 1126982
URL: http://svn.apache.org/viewvc?rev=1126982&view=rev
Log:
SLING-2086 : Potential endless loop in jcr install
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/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=1126982&r1=1126981&r2=1126982&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 May 24 11:24:24 2011
@@ -228,6 +228,7 @@ public class JcrInstaller implements Eve
// Scan watchedFolders and register resources with installer
final List<InstallableResource> resources = new LinkedList<InstallableResource>();
for(WatchedFolder f : watchedFolders) {
+ f.start();
final WatchedFolder.ScanResult r = f.scan();
logger.debug("Startup: {} provides resources {}", f, r.toAdd);
resources.addAll(r.toAdd);
@@ -360,7 +361,7 @@ public class JcrInstaller implements Eve
/** Find the paths to watch under rootPath, according to our folderNameFilter,
* and add them to result */
- void findPathsToWatch(final String rootPath, final List<WatchedFolder> result) throws RepositoryException {
+ private void findPathsToWatch(final String rootPath, final List<WatchedFolder> result) throws RepositoryException {
Session s = null;
try {
@@ -401,7 +402,8 @@ public class JcrInstaller implements Eve
}
/** Add WatchedFolder to our list if it doesn't exist yet */
- private void addWatchedFolder(final WatchedFolder toAdd) {
+ private void addWatchedFolder(final WatchedFolder toAdd)
+ throws RepositoryException {
WatchedFolder existing = null;
for(WatchedFolder wf : watchedFolders) {
if (wf.getPath().equals(toAdd.getPath())) {
@@ -410,10 +412,8 @@ public class JcrInstaller implements Eve
}
}
if (existing == null) {
+ toAdd.start();
watchedFolders.add(toAdd);
- toAdd.scheduleScan();
- } else {
- toAdd.cleanup();
}
}
@@ -441,7 +441,7 @@ public class JcrInstaller implements Eve
if(!session.itemExists(wf.getPath())) {
result.addAll(wf.scan().toRemove);
- wf.cleanup();
+ wf.stop();
toRemove.add(wf);
}
}
@@ -478,33 +478,33 @@ public class JcrInstaller implements Eve
logger.debug("Running watch cycle.");
try {
- boolean didRefresh = true;
+ boolean didRefresh = false;
// Rescan WatchedFolders if needed
- final boolean scanWf = WatchedFolder.getRescanTimer().expired();
- if (scanWf) {
- session.refresh(false);
- didRefresh = true;
- for(WatchedFolder wf : watchedFolders) {
- if(!wf.needsScan()) {
- continue;
- }
- WatchedFolder.getRescanTimer().reset();
- counters[SCAN_FOLDERS_COUNTER]++;
- final WatchedFolder.ScanResult sr = wf.scan();
- boolean toDo = false;
- if ( sr.toAdd.size() > 0 ) {
- logger.info("Registering resource with OSGi installer: {}",sr.toAdd);
- toDo = true;
- }
- if ( sr.toRemove.size() > 0 ) {
- logger.info("Removing resource from OSGi installer: {}", sr.toRemove);
- toDo = true;
- }
- if ( toDo ) {
- installer.updateResources(URL_SCHEME, sr.toAdd.toArray(new InstallableResource[sr.toAdd.size()]),
- sr.toRemove.toArray(new String[sr.toRemove.size()]));
- }
+ boolean scanWf = false;
+ for(WatchedFolder wf : watchedFolders) {
+ if (!wf.needsScan()) {
+ continue;
+ }
+ scanWf = true;
+ if ( !didRefresh ) {
+ session.refresh(false);
+ didRefresh = true;
+ }
+ counters[SCAN_FOLDERS_COUNTER]++;
+ final WatchedFolder.ScanResult sr = wf.scan();
+ boolean toDo = false;
+ if ( sr.toAdd.size() > 0 ) {
+ logger.info("Registering resource with OSGi installer: {}",sr.toAdd);
+ toDo = true;
+ }
+ if ( sr.toRemove.size() > 0 ) {
+ logger.info("Removing resource from OSGi installer: {}", sr.toRemove);
+ toDo = true;
+ }
+ if ( toDo ) {
+ installer.updateResources(URL_SCHEME, sr.toAdd.toArray(new InstallableResource[sr.toAdd.size()]),
+ sr.toRemove.toArray(new String[sr.toRemove.size()]));
}
}
@@ -525,18 +525,14 @@ public class JcrInstaller implements Eve
}
}
- try {
- Thread.sleep(RUN_LOOP_DELAY_MSEC);
- } catch(InterruptedException ignore) {
- // ignore
- }
- } catch(Exception e) {
- logger.warn("Exception in run()", e);
- try {
- Thread.sleep(RUN_LOOP_DELAY_MSEC);
- } catch(InterruptedException ignore) {
- }
+ } catch (final Exception e) {
+ logger.warn("Exception in runOneCycle()", e);
+ }
+ try {
+ Thread.sleep(RUN_LOOP_DELAY_MSEC);
+ } catch (final InterruptedException ignore) {
+ // ignore
}
counters[RUN_LOOP_COUNTER]++;
}
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=1126982&r1=1126981&r2=1126982&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 May 24 11:24:24 2011
@@ -44,14 +44,15 @@ import org.slf4j.LoggerFactory;
*/
class WatchedFolder implements EventListener{
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
private final String path;
private final int priority;
private final Session session;
- private static RescanTimer rescanTimer = new RescanTimer();
- private boolean needsScan;
private final Collection <JcrInstaller.NodeConverter> converters;
private final Set<String> existingResourceUrls = new HashSet<String>();
- protected final Logger log = LoggerFactory.getLogger(getClass());
+
+ private volatile boolean needsScan;
static class ScanResult {
List<InstallableResource> toAdd = new ArrayList<InstallableResource>();
@@ -66,7 +67,7 @@ class WatchedFolder implements EventList
final int priority,
final Collection<JcrInstaller.NodeConverter> converters)
throws RepositoryException {
- if(priority < 1) {
+ if (priority < 1) {
throw new IllegalArgumentException("Cannot watch folder with priority 0:" + path);
}
@@ -75,7 +76,9 @@ class WatchedFolder implements EventList
this.priority = priority;
this.session = session;
+ }
+ public void start() throws RepositoryException {
// observe any changes in our folder (and under it, as changes to properties
// might be lower in the hierarchy)
final int eventTypes = Event.NODE_ADDED | Event.NODE_REMOVED
@@ -84,11 +87,12 @@ class WatchedFolder implements EventList
final boolean noLocal = true;
session.getWorkspace().getObservationManager().addEventListener(this, eventTypes, path,
isDeep, null, null, noLocal);
+ this.needsScan = true;
log.info("Watching folder {} (priority {})", path, priority);
}
- void cleanup() {
+ public void stop() {
try {
session.getWorkspace().getObservationManager().removeEventListener(this);
} catch(RepositoryException re) {
@@ -101,38 +105,36 @@ class WatchedFolder implements EventList
return getClass().getSimpleName() + ":" + path;
}
- String getPath() {
+ public String getPath() {
return path;
}
- /** Set a static "timer" whenever an event occurs */
- public void onEvent(EventIterator it) {
- log.debug("JCR event received for path {}", path);
- scheduleScan();
- }
-
- void scheduleScan() {
- log.debug("Scheduling scan of {}", path);
- rescanTimer.scheduleScan();
+ /**
+ * Update scan flag whenever an observation event occurs.
+ */
+ public void onEvent(final EventIterator it) {
+ log.debug("JCR events received for path {}", path);
needsScan = true;
}
- boolean needsScan() {
+ /**
+ * Did an observation event occur in the meantime?
+ */
+ public boolean needsScan() {
return needsScan;
}
- static RescanTimer getRescanTimer() {
- return rescanTimer;
- }
-
- /** Scan the contents of our folder and return the corresponding InstallableResource */
- ScanResult scan() throws RepositoryException {
+ /**
+ * Scan the contents of our folder and return the corresponding
+ * <code>ScanResult</code> containing the <code>InstallableResource</code>s.
+ */
+ public ScanResult scan() throws RepositoryException {
log.debug("Scanning {}", path);
needsScan = false;
Node folder = null;
- if(session.itemExists(path)) {
- Item i = session.getItem(path);
+ if (session.itemExists(path)) {
+ final Item i = session.getItem(path);
if(i.isNode()) {
folder = (Node)i;
}