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/29 15:50:44 UTC
svn commit: r680696 - in
/incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles:
BundlesFolder.java ConfigNodeProcessor.java JcrBundlesManager.java
NodeProcessor.java
Author: bdelacretaz
Date: Tue Jul 29 06:50:43 2008
New Revision: 680696
URL: http://svn.apache.org/viewvc?rev=680696&view=rev
Log:
SLING-587 - adding and updating configs works (but no removing yet)
Modified:
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/JcrBundlesManager.java
incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/NodeProcessor.java
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=680696&r1=680695&r2=680696&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 Tue Jul 29 06:50:43 2008
@@ -163,7 +163,7 @@
/** If our timer allows it, recursively call processNode
* on our Node and its children */
- void scanIfNeeded(Map<String, Boolean> flags) throws RepositoryException {
+ void scanIfNeeded(Map<String, Boolean> flags) throws Exception {
if(nextScan != -1 && System.currentTimeMillis() > nextScan) {
nextScan = -1;
log.debug("Timer expired, scanning {}", path);
@@ -179,7 +179,7 @@
/** Let the first NodeProcessor that accepts n process it, and
* recurse into n's children to do the same */
- protected void processNode(Node n, Map<String, Boolean> flags) throws RepositoryException {
+ protected void processNode(Node n, Map<String, Boolean> flags) throws Exception {
boolean accepted = false;
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=680696&r1=680695&r2=680696&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 Tue Jul 29 06:50:43 2008
@@ -18,17 +18,147 @@
*/
package org.apache.sling.jcr.jcrbundles;
+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;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
/** Process nodes that look like configs, based on their node name */
class ConfigNodeProcessor extends AbstractNodeProcessor {
- public ConfigNodeProcessor() {
+ private static final String ALIAS_KEY = "_alias_factory_pid";
+
+ private final ConfigurationAdmin cadmin;
+
+ /** Configration PIDs are built out of filenames, examples:
+ * o.a.s.foo.bar.cfg -> pid = o.a.s.foo.bar
+ * o.a.s.foo.bar-a.cfg -> pid = .a.s.foo.bar, factory pid = a
+ */
+ static class ConfigPid {
+ final String configPid;
+ final String factoryPid;
+
+ ConfigPid(String path) {
+ // cut off path and extension
+ String pid = path;
+ final int lastSlash = path.lastIndexOf('/');
+ if(lastSlash >= 0) {
+ pid = path.substring(lastSlash + 1);
+ }
+ final int lastDot = pid.lastIndexOf('.');
+ if(lastDot >= 0) {
+ pid = pid.substring(0, lastDot);
+ }
+
+ // split pid and factory pid alias
+ int n = pid.indexOf('-');
+ if (n > 0) {
+ factoryPid = pid.substring(n + 1);
+ configPid = pid.substring(0, n);
+ } else {
+ factoryPid = null;
+ configPid = pid;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "ConfigPid: configPid=" + configPid + ", factoryPid=" + factoryPid;
+ }
+ };
+
+ public ConfigNodeProcessor(ConfigurationAdmin ca) {
super("[a-zA-Z0-9].*\\.cfg$");
+ cadmin = ca;
}
- public void process(Node n, Map<String, Boolean> flags) throws RepositoryException {
+ public void process(Node n, Map<String, Boolean> flags) throws RepositoryException, IOException, InvalidSyntaxException {
+
+ // For now we support only file-based configs
+ final InputStream is = getInputStream(n);
+ if(is == null) {
+ log.warn("Cannot get InputStream for node {}, Node will be ignored", n.getPath());
+ return;
+ }
+
+ // Do nothing if config didn't change
+ final Node status = getStatusNode(n, true);
+ final Calendar lastModified = getLastModified(n);
+ Calendar savedLastModified = null;
+ if(status.hasProperty(JCR_LAST_MODIFIED)) {
+ savedLastModified = status.getProperty(JCR_LAST_MODIFIED).getDate();
+ }
+
+ boolean changed =
+ savedLastModified == null
+ || lastModified == null
+ || !(lastModified.equals(savedLastModified))
+ ;
+
+ if(!changed) {
+ log.debug("Config {} unchanged, no update needed", n.getPath());
+ return;
+ }
+ if(lastModified != null) {
+ status.setProperty(JCR_LAST_MODIFIED, lastModified);
+ }
+ n.getSession().save();
+
+ // Load configuration properties
+ final Properties p = new Properties();
+ try {
+ p.load(is);
+ } finally {
+ is.close();
+ }
+
+ // Get pids from node name
+ final ConfigPid pid = new ConfigPid(n.getPath());
+ log.debug("{} created for node {}", pid, n.getPath());
+
+ // prepare configuration data
+ Hashtable<Object, Object> ht = new Hashtable<Object, Object>();
+ ht.putAll(p);
+ if(pid.factoryPid != null) {
+ ht.put(ALIAS_KEY, pid.factoryPid);
+ }
+
+ // get or create configuration
+ Configuration config = getConfiguration(pid);
+ if (config.getBundleLocation() != null) {
+ config.setBundleLocation(null);
+ }
+ config.update(ht);
+ log.info("Config {} created or updated", config.getPid());
}
+
+ Configuration getConfiguration(ConfigPid cp) throws IOException, InvalidSyntaxException {
+ Configuration result = null;
+
+ if (cp.factoryPid == null) {
+ result = cadmin.getConfiguration(cp.configPid, null);
+ } else {
+ Configuration configs[] = cadmin.listConfigurations("(|(" + ALIAS_KEY
+ + "=" + cp.factoryPid + ")(.alias_factory_pid=" + cp.factoryPid
+ + "))");
+
+ if (configs == null || configs.length == 0) {
+ result = cadmin.createFactoryConfiguration(cp.configPid, null);
+ } else {
+ result = configs[0];
+ }
+ }
+
+ return result;
+ }
}
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=680696&r1=680695&r2=680696&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 Tue Jul 29 06:50:43 2008
@@ -30,6 +30,7 @@
import javax.jcr.Session;
import org.apache.sling.jcr.api.SlingRepository;
+import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.packageadmin.PackageAdmin;
import org.slf4j.Logger;
@@ -70,6 +71,9 @@
/** @scr.reference */
private PackageAdmin padmin;
+
+ /** @scr.reference */
+ private ConfigurationAdmin cadmin;
protected final Logger log = LoggerFactory.getLogger(this.getClass());
private boolean running;
@@ -82,7 +86,7 @@
// setup our processors
processors = new LinkedList<NodeProcessor>();
processors.add(new BundleNodeProcessor(context, padmin));
- processors.add(new ConfigNodeProcessor());
+ processors.add(new ConfigNodeProcessor(cadmin));
processors.add(new NodeProcessor() {
public boolean accepts(Node n) throws RepositoryException {
return true;
@@ -158,7 +162,7 @@
}
/** Run one cycle of processing our scanTimes queue */
- void runOneCycle(Session s) throws RepositoryException {
+ void runOneCycle(Session s) throws Exception {
boolean refreshPackages = false;
final Map<String, Boolean> flags = new HashMap<String, Boolean>();
Modified: incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/NodeProcessor.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/NodeProcessor.java?rev=680696&r1=680695&r2=680696&view=diff
==============================================================================
--- incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/NodeProcessor.java (original)
+++ incubator/sling/whiteboard/jcrbundles/src/main/java/org/apache/sling/jcr/jcrbundles/NodeProcessor.java Tue Jul 29 06:50:43 2008
@@ -27,5 +27,5 @@
interface NodeProcessor {
boolean accepts(Node n) throws RepositoryException;
- void process(Node n, Map<String, Boolean> flags) throws RepositoryException;
+ void process(Node n, Map<String, Boolean> flags) throws Exception;
}