You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2008/07/30 15:52:44 UTC
svn commit: r681030 -
/incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/
Author: bdelacretaz
Date: Wed Jul 30 06:52:40 2008
New Revision: 681030
URL: http://svn.apache.org/viewvc?rev=681030&view=rev
Log:
SLING-587 - new 'bundles' folders are now detected inside /libs and /apps, as long as those two folders exist when the service starts
Added:
incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolderCreationListener.java (with props)
Modified:
incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundleNodeProcessor.java
incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolder.java
incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/ConfigNodeProcessor.java
incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesConstants.java
incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesManager.java
Modified: incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundleNodeProcessor.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundleNodeProcessor.java?rev=681030&r1=681029&r2=681030&view=diff
==============================================================================
--- incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundleNodeProcessor.java (original)
+++ incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundleNodeProcessor.java Wed Jul 30 06:52:40 2008
@@ -18,7 +18,7 @@
*/
package org.apache.sling.jcr.jcrbundles;
-import static org.apache.sling.jcr.jcrbundles.JcrBundlesConstants.JCRBUNDLES_NAME_PREFIX;
+import static org.apache.sling.jcr.jcrbundles.JcrBundlesConstants.JCRBUNDLES_LOCATION_PREFIX;
import java.io.IOException;
import java.io.InputStream;
@@ -164,6 +164,6 @@
}
protected String getBundleLocation(String bundleNodePath) {
- return JCRBUNDLES_NAME_PREFIX + bundleNodePath;
+ return JCRBUNDLES_LOCATION_PREFIX + bundleNodePath;
}
}
\ No newline at end of file
Modified: incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolder.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolder.java?rev=681030&r1=681029&r2=681030&view=diff
==============================================================================
--- incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolder.java (original)
+++ incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolder.java Wed Jul 30 06:52:40 2008
@@ -18,6 +18,7 @@
*/
package org.apache.sling.jcr.jcrbundles;
+import static org.apache.sling.jcr.jcrbundles.JcrBundlesConstants.BUNDLES_NODENAME;
import static org.apache.sling.jcr.jcrbundles.JcrBundlesConstants.STATUS_BASE_PATH;
import java.util.HashSet;
import java.util.List;
@@ -55,12 +56,6 @@
/** List of processors for our bundles and configs */
private final List<NodeProcessor> processors;
- /** Only folders having this name can contain bundles and configs */
- public static final String BUNDLES_NODENAME = "bundles";
-
- /** Only folders having this type can contain bundles and configs */
- public static final String BUNDLES_NODETYPE = "nt:hierarchyNode";
-
/** Create a BundlesFolder on the given Repository, at the
* given path
*/
@@ -143,10 +138,6 @@
Set<BundlesFolder> setToUpdate, List<NodeProcessor> processors)
throws RepositoryException {
if(n.getName().equals(BUNDLES_NODENAME)) {
- /*
- if(!n.isNodeType(BUNDLES_NODETYPE)) {
- log.debug("{} node does not have {} type, ignored", n.getPath(), BUNDLES_NODETYPE);
- }*/
setToUpdate.add(new BundlesFolder(r, n.getPath(), processors));
}
final NodeIterator it = n.getNodes();
@@ -192,7 +183,7 @@
final Node n = session.getRootNode().getNode(relPath(statusPath));
processNode(n, flags, true);
} else {
- log.info("Status folder {} does not exist, checkDeletions does nothing");
+ log.info("Status folder {} does not exist, checkDeletions does nothing", statusPath);
}
}
Added: incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolderCreationListener.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolderCreationListener.java?rev=681030&view=auto
==============================================================================
--- incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolderCreationListener.java (added)
+++ incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolderCreationListener.java Wed Jul 30 06:52:40 2008
@@ -0,0 +1,66 @@
+/*
+ * 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.jcr.jcrbundles;
+
+import static org.apache.sling.jcr.jcrbundles.JcrBundlesConstants.BUNDLES_NODENAME;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** EventListener that collects the paths of new "bundles"
+ * nodes.
+ */
+class BundlesFolderCreationListener implements EventListener {
+ protected final Logger log = LoggerFactory.getLogger(this.getClass());
+ private Set<String> paths = new HashSet<String>();
+
+ /** Return our saved paths and clear the list */
+ Set<String> getAndClearPaths() {
+ synchronized(paths) {
+ Set<String> result = paths;
+ paths = new HashSet<String>();
+ return result;
+ }
+ }
+
+ /** Store the paths of new "bundles" nodes */
+ public void onEvent(EventIterator it) {
+ try {
+ while(it.hasNext()) {
+ final Event e = it.nextEvent();
+ if(e.getPath().endsWith("/" + BUNDLES_NODENAME)) {
+ synchronized(paths) {
+ paths.add(e.getPath());
+ }
+ }
+ }
+ } catch(RepositoryException re) {
+ log.warn("RepositoryException in onEvent", re);
+ }
+ }
+
+}
Propchange: incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolderCreationListener.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/BundlesFolderCreationListener.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/ConfigNodeProcessor.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/ConfigNodeProcessor.java?rev=681030&r1=681029&r2=681030&view=diff
==============================================================================
--- incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/ConfigNodeProcessor.java (original)
+++ incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/ConfigNodeProcessor.java Wed Jul 30 06:52:40 2008
@@ -21,8 +21,6 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
-import java.util.Dictionary;
-import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
Modified: incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesConstants.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesConstants.java?rev=681030&r1=681029&r2=681030&view=diff
==============================================================================
--- incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesConstants.java (original)
+++ incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesConstants.java Wed Jul 30 06:52:40 2008
@@ -20,6 +20,13 @@
/** Constants for this module */
public class JcrBundlesConstants {
+
+ /** Where to store our status data */
public static final String STATUS_BASE_PATH = "/system/sling/jcrbundles/status";
- public static final String JCRBUNDLES_NAME_PREFIX = "jcrbundles:";
+
+ /** Prefix used for the OSGi Location field of bundles that we install */
+ public static final String JCRBUNDLES_LOCATION_PREFIX = "jcrbundles:";
+
+ /** Only folders having this name can contain bundles and configs */
+ public static final String BUNDLES_NODENAME = "bundles";
}
Modified: incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesManager.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesManager.java?rev=681030&r1=681029&r2=681030&view=diff
==============================================================================
--- incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesManager.java (original)
+++ incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/JcrBundlesManager.java Wed Jul 30 06:52:40 2008
@@ -18,7 +18,9 @@
*/
package org.apache.sling.jcr.jcrbundles;
+import static org.apache.sling.jcr.jcrbundles.JcrBundlesConstants.BUNDLES_NODENAME;
import static org.apache.sling.jcr.jcrbundles.JcrBundlesConstants.STATUS_BASE_PATH;
+
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
@@ -29,6 +31,7 @@
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import javax.jcr.observation.Event;
import org.apache.sling.jcr.api.SlingRepository;
import org.osgi.service.cm.ConfigurationAdmin;
@@ -76,6 +79,10 @@
/** @scr.reference */
private ConfigurationAdmin cadmin;
+ /** Listeners for new BundleFolders under our bundleRoots */
+ private List<BundlesFolderCreationListener> listeners = new LinkedList<BundlesFolderCreationListener>();
+
+ private Session session;
protected final Logger log = LoggerFactory.getLogger(this.getClass());
private boolean running;
@@ -109,7 +116,17 @@
folders.addAll(BundlesFolder.findBundlesFolders(repository, rootPath, processors));
}
- // TODO: should listen for any new "bundles" folders created after activation
+ // Listen for any new "bundles" folders created after activation
+ session = repository.loginAdministrative(repository.getDefaultWorkspace());
+ final int eventTypes = Event.NODE_ADDED;
+ final boolean isDeep = true;
+ final boolean noLocal = true;
+ for(String path : this.bundleRoots) {
+ final BundlesFolderCreationListener bfc = new BundlesFolderCreationListener();
+ listeners.add(bfc);
+ session.getWorkspace().getObservationManager().addEventListener(bfc, eventTypes, path,
+ isDeep, null, null, noLocal);
+ }
// start queue processing
final Thread t = new Thread(this, getClass().getSimpleName() + "_" + System.currentTimeMillis());
@@ -126,11 +143,26 @@
try {
bf.cleanup();
} catch(RepositoryException e) {
- log.warn("RepositoryException in deactivate", e);
+ log.warn("RepositoryException in deactivate/cleanup", e);
}
}
folders.clear();
+
+ if(session != null) {
+ try {
+ for(BundlesFolderCreationListener bfc : listeners) {
+ session.getWorkspace().getObservationManager().removeEventListener(bfc);
+ }
+ } catch(RepositoryException re) {
+ log.warn("RepositoryException in deactivate()/removeEventListener", re);
+ }
+
+ listeners.clear();
+
+ session.logout();
+ session = null;
+ }
}
/** Scan paths once their timer expires */
@@ -187,6 +219,16 @@
/** Run one cycle of processing our scanTimes queue */
void runOneCycle(Session s) throws Exception {
+
+ // Add new bundle folders that onEvent created
+ for(BundlesFolderCreationListener bfc : listeners) {
+ for(String path : bfc.getAndClearPaths()) {
+ log.info("New \"" + BUNDLES_NODENAME + "\" node was detected at {}, creating BundlesFolder to watch it", path);
+ folders.add(new BundlesFolder(repository, path, processors));
+ }
+ }
+
+ // Let ouf BundlesFolders do their work
final Map<String, Boolean> flags = new HashMap<String, Boolean>();
for(BundlesFolder bf : folders) {
@@ -204,4 +246,5 @@
padmin.refreshPackages(null);
}
}
-}
\ No newline at end of file
+
+ }
\ No newline at end of file