Introduce module meta data
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 28 Mar 2012 16:14:41 +0000 (16:14 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 28 Mar 2012 16:14:41 +0000 (16:14 +0000)
Make bundle manager interruptible

git-svn-id: https://svn.argeo.org/slc/trunk@5265 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/deploy/ModuleDescriptor.java
runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/execution/ExecutionModuleDescriptor.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java
runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java
runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiExecutionModulesManager.java

index fbf7a5ce428586aa9e3cc0f912d4fb6e1dde34ea..6a261583c2f3b767362c0b077b9224405c9f78e8 100644 (file)
@@ -16,6 +16,8 @@
 package org.argeo.slc.deploy;
 
 import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.argeo.slc.BasicNameVersion;
 
@@ -24,6 +26,8 @@ public class ModuleDescriptor extends BasicNameVersion implements Serializable {
        private static final long serialVersionUID = 4310820315478645419L;
        private String title;
        private String description;
+       private Map<String, String> metadata = new HashMap<String, String>();
+       private Boolean started = false;
 
        public String getTitle() {
                return title;
@@ -51,4 +55,20 @@ public class ModuleDescriptor extends BasicNameVersion implements Serializable {
                this.title = label;
        }
 
+       public Map<String, String> getMetadata() {
+               return metadata;
+       }
+
+       public void setMetadata(Map<String, String> metadata) {
+               this.metadata = metadata;
+       }
+
+       public Boolean getStarted() {
+               return started;
+       }
+
+       public void setStarted(Boolean started) {
+               this.started = started;
+       }
+
 }
index aec8db989548cf4c18ea0b02fe87b7078cac5dcf..cbce65b608b46f8828c4ad8276142a7cca4e926f 100644 (file)
@@ -22,6 +22,9 @@ import org.argeo.slc.deploy.ModuleDescriptor;
 
 /** Describes the information required to launch a flow */
 public class ExecutionModuleDescriptor extends ModuleDescriptor {
+       /** Metadata header identifying an SLC execution module */
+       public final static String SLC_EXECUTION_MODULE = "SLC-ExecutionModule";
+
        private static final long serialVersionUID = -2394473464513029512L;
        private List<ExecutionSpec> executionSpecs = new ArrayList<ExecutionSpec>();
        private List<ExecutionFlowDescriptor> executionFlows = new ArrayList<ExecutionFlowDescriptor>();
index d108e9dd5b3d6cb7bf3710bbc3681dd4bef0a018..8d6d96784ab64562ea0e2e78b3647d01c9188b3e 100644 (file)
@@ -29,7 +29,6 @@ import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.jcr.ArgeoNames;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.core.execution.PrimitiveSpecAttribute;
@@ -38,6 +37,7 @@ import org.argeo.slc.core.execution.RefSpecAttribute;
 import org.argeo.slc.core.execution.RefValueChoice;
 import org.argeo.slc.deploy.ModuleDescriptor;
 import org.argeo.slc.execution.ExecutionFlowDescriptor;
+import org.argeo.slc.execution.ExecutionModuleDescriptor;
 import org.argeo.slc.execution.ExecutionModulesListener;
 import org.argeo.slc.execution.ExecutionModulesManager;
 import org.argeo.slc.execution.ExecutionSpec;
@@ -76,38 +76,62 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener,
                        session = repository.login();
                        clearAgent();
                        if (modulesManager != null) {
+                               Node agentNode = session.getNode(agent.getNodePath());
+
                                List<ModuleDescriptor> moduleDescriptors = modulesManager
                                                .listModules();
+
+                               // scan SLC-ExecutionModule metadata
+                               for (ModuleDescriptor md : moduleDescriptors) {
+                                       if (md.getMetadata().containsKey(
+                                                       ExecutionModuleDescriptor.SLC_EXECUTION_MODULE)) {
+                                               String moduleNodeName = SlcJcrUtils
+                                                               .getModuleNodeName(md);
+                                               Node moduleNode = agentNode.hasNode(moduleNodeName) ? agentNode
+                                                               .getNode(moduleNodeName) : agentNode
+                                                               .addNode(moduleNodeName);
+                                               moduleNode.addMixin(SlcTypes.SLC_EXECUTION_MODULE);
+                                               moduleNode.setProperty(SLC_NAME, md.getName());
+                                               moduleNode.setProperty(SLC_VERSION, md.getVersion());
+                                               moduleNode.setProperty(Property.JCR_TITLE,
+                                                               md.getTitle());
+                                               moduleNode.setProperty(Property.JCR_DESCRIPTION,
+                                                               md.getDescription());
+                                               moduleNode.setProperty(SLC_STARTED, md.getStarted());
+                                       }
+                               }
+
+                               // scan execution modules property
                                String executionModules = System
                                                .getProperty(SLC_EXECUTION_MODULES_PROPERTY);
                                if (executionModules != null) {
-                                       Node agentNode = session.getNode(agent.getNodePath());
                                        for (String executionModule : executionModules.split(",")) {
-                                               allModules: for (ModuleDescriptor moduleDescriptor : moduleDescriptors) {
+                                               allModules: for (ModuleDescriptor md : moduleDescriptors) {
                                                        String moduleNodeName = SlcJcrUtils
-                                                                       .getModuleNodeName(moduleDescriptor);
-                                                       if (moduleDescriptor.getName().equals(
-                                                                       executionModule)) {
+                                                                       .getModuleNodeName(md);
+                                                       if (md.getName().equals(executionModule)) {
                                                                Node moduleNode = agentNode
                                                                                .hasNode(moduleNodeName) ? agentNode
                                                                                .getNode(moduleNodeName) : agentNode
                                                                                .addNode(moduleNodeName);
                                                                moduleNode
                                                                                .addMixin(SlcTypes.SLC_EXECUTION_MODULE);
-                                                               moduleNode.setProperty(SLC_NAME,
-                                                                               moduleDescriptor.getName());
+                                                               moduleNode.setProperty(SLC_NAME, md.getName());
                                                                moduleNode.setProperty(SLC_VERSION,
-                                                                               moduleDescriptor.getVersion());
+                                                                               md.getVersion());
                                                                moduleNode.setProperty(Property.JCR_TITLE,
-                                                                               moduleDescriptor.getTitle());
+                                                                               md.getTitle());
                                                                moduleNode.setProperty(
                                                                                Property.JCR_DESCRIPTION,
-                                                                               moduleDescriptor.getDescription());
-                                                               moduleNode.setProperty(SLC_STARTED, false);
+                                                                               md.getDescription());
+                                                               moduleNode.setProperty(SLC_STARTED,
+                                                                               md.getStarted());
                                                                break allModules;
                                                        }
                                                }
                                        }
+
+                                       // save if needed
                                        if (session.hasPendingChanges())
                                                session.save();
                                }
index 4b159a99ff25f813c398c0c646944da71cfa49e9..788f2da57b79bcb1c35c1db34ac7d2f5d75d5663 100644 (file)
@@ -267,7 +267,7 @@ public class BundlesManager implements BundleContextAware, FrameworkListener,
                try {
                        Thread.sleep(pollingPeriod);
                } catch (InterruptedException e) {
-                       // silent
+                       throw new SlcException("Polling interrupted");
                }
        }
 
index 13b92fe2ff90f8f671d2a2ac95cdc1c2538454f2..15a3f0de9bbcb27b56d75ad22fdb558e1975ce0a 100644 (file)
@@ -17,6 +17,8 @@ package org.argeo.slc.osgi;
 
 import java.lang.management.ManagementFactory;
 import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -48,6 +50,7 @@ import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Constants;
 import org.osgi.framework.launch.Framework;
+import org.springframework.context.ApplicationContext;
 import org.springframework.osgi.service.importer.OsgiServiceLifecycleListener;
 
 /** Execution modules manager implementation based on an OSGi runtime. */
@@ -281,7 +284,23 @@ public class OsgiExecutionModulesManager extends
                        Bundle bundle = bundlesManager.findRelatedBundle(new OsgiBundle(
                                        nameVersion));
                        bundlesManager.startSynchronous(bundle);
-               } catch (BundleException e) {
+                       boolean isSpringInstrumented = bundle.getEntryPaths(
+                                       "/META-INF/spring").hasMoreElements()
+                                       || bundle.getHeaders().get("Spring-Context") == null;
+                       if (isSpringInstrumented) {
+                               // Wait for Spring application context to be ready
+                               String filter = "(Bundle-SymbolicName="
+                                               + bundle.getSymbolicName() + ")";
+                               try {
+                                       bundlesManager.getServiceRefSynchronous(
+                                                       ApplicationContext.class.getName(), filter);
+                               } catch (Exception e) {
+                                       // stop if application context not found
+                                       bundle.stop();
+                                       throw e;
+                               }
+                       }
+               } catch (Exception e) {
                        throw new SlcException("Cannot start " + nameVersion, e);
                }
        }
@@ -321,6 +340,23 @@ public class OsgiExecutionModulesManager extends
                md.setVersion(getHeaderSafe(bdl, Constants.BUNDLE_VERSION));
                md.setTitle(getHeaderSafe(bdl, Constants.BUNDLE_NAME));
                md.setDescription(getHeaderSafe(bdl, Constants.BUNDLE_DESCRIPTION));
+
+               // copy manifets header to meta data
+               Dictionary<?, ?> headers = bundle.getHeaders();
+               Enumeration<?> keys = headers.keys();
+               while (keys.hasMoreElements()) {
+                       Object key = keys.nextElement();
+                       Object value = headers.get(key);
+                       if (value != null)
+                               md.getMetadata().put(key.toString(), value.toString());
+               }
+
+               // check if started
+               if (bundle.getState() == Bundle.ACTIVE
+                               || bundle.getState() == Bundle.STARTING)
+                       md.setStarted(true);
+               else
+                       md.setStarted(false);
        }
 
        private String getHeaderSafe(Bundle bundle, Object key) {