From 699640c58cc0578beebfc3edd00dac9eed65ee0b Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 28 Mar 2012 16:14:41 +0000 Subject: [PATCH] Introduce module meta data Make bundle manager interruptible git-svn-id: https://svn.argeo.org/slc/trunk@5265 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../argeo/slc/deploy/ModuleDescriptor.java | 20 ++++++++ .../execution/ExecutionModuleDescriptor.java | 3 ++ .../JcrExecutionModulesListener.java | 48 ++++++++++++++----- .../org/argeo/slc/osgi/BundlesManager.java | 2 +- .../slc/osgi/OsgiExecutionModulesManager.java | 38 ++++++++++++++- 5 files changed, 97 insertions(+), 14 deletions(-) diff --git a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/deploy/ModuleDescriptor.java b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/deploy/ModuleDescriptor.java index fbf7a5ce4..6a261583c 100644 --- a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/deploy/ModuleDescriptor.java +++ b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/deploy/ModuleDescriptor.java @@ -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 metadata = new HashMap(); + 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 getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + public Boolean getStarted() { + return started; + } + + public void setStarted(Boolean started) { + this.started = started; + } + } diff --git a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/execution/ExecutionModuleDescriptor.java b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/execution/ExecutionModuleDescriptor.java index aec8db989..cbce65b60 100644 --- a/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/execution/ExecutionModuleDescriptor.java +++ b/runtime/org.argeo.slc.specs/src/main/java/org/argeo/slc/execution/ExecutionModuleDescriptor.java @@ -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 executionSpecs = new ArrayList(); private List executionFlows = new ArrayList(); diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java index d108e9dd5..8d6d96784 100644 --- a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java +++ b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java @@ -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 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(); } diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java index 4b159a99f..788f2da57 100644 --- a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundlesManager.java @@ -267,7 +267,7 @@ public class BundlesManager implements BundleContextAware, FrameworkListener, try { Thread.sleep(pollingPeriod); } catch (InterruptedException e) { - // silent + throw new SlcException("Polling interrupted"); } } diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiExecutionModulesManager.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiExecutionModulesManager.java index 13b92fe2f..15a3f0de9 100644 --- a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiExecutionModulesManager.java +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiExecutionModulesManager.java @@ -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) { -- 2.39.5