From: Mathieu Baudier Date: Thu, 29 Mar 2012 15:05:13 +0000 (+0000) Subject: Improve runtime X-Git-Tag: argeo-slc-2.1.7~742 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;ds=sidebyside;h=7b8669f41556f46a0f229192d05e2f2592c57d5f;p=gpl%2Fargeo-slc.git Improve runtime git-svn-id: https://svn.argeo.org/slc/trunk@5279 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java index b46b2f1b0..958be8276 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java +++ b/eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/editors/ProcessBuilderPage.java @@ -572,7 +572,11 @@ public class ProcessBuilderPage extends FormPage implements SlcNames { if (node.hasNode(SLC_ADDRESS)) { String path = node.getNode(SLC_ADDRESS) .getProperty(Property.JCR_PATH).getString(); - return SlcJcrUtils.flowExecutionModuleName(path) + ":" + Node executionModuleNode = node.getSession().getNode( + SlcJcrUtils.modulePath(path)); + String executionModuleName = executionModuleNode + .getProperty(SLC_NAME).getString(); + return executionModuleName + ":" + SlcJcrUtils.flowRelativePath(path); } } diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcJcrUtils.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcJcrUtils.java index 2ebcb933f..57d8ce55c 100644 --- a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcJcrUtils.java +++ b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcJcrUtils.java @@ -46,23 +46,20 @@ public class SlcJcrUtils implements SlcNames { return buf.toString(); } - /** Module node name based on module name and version */ - public static String getModuleNodeName(ModuleDescriptor moduleDescriptor) { - return moduleDescriptor.getName() + "_" + moduleDescriptor.getVersion(); - } - - /** Extracts the execution module name of a flow */ - public static String flowExecutionModuleName(String fullFlowPath) { + /** Extracts the path to the related execution module */ + public static String modulePath(String fullFlowPath) { String[] tokens = fullFlowPath.split("/"); - String moduleNodeName = tokens[AGENT_FACTORY_DEPTH + 2]; - return moduleNodeName.substring(0, moduleNodeName.lastIndexOf('_')); + StringBuffer buf = new StringBuffer(fullFlowPath.length()); + for (int i = 0; i < AGENT_FACTORY_DEPTH + 3; i++) { + if (!tokens[i].equals("")) + buf.append('/').append(tokens[i]); + } + return buf.toString(); } - /** Extracts the execution module version of a flow */ - public static String flowExecutionModuleVersion(String fullFlowPath) { - String[] tokens = fullFlowPath.split("/"); - String moduleNodeName = tokens[AGENT_FACTORY_DEPTH + 2]; - return moduleNodeName.substring(moduleNodeName.lastIndexOf('_') + 1); + /** Module node name based on module name and version */ + public static String getModuleNodeName(ModuleDescriptor moduleDescriptor) { + return moduleDescriptor.getName() + "_" + moduleDescriptor.getVersion(); } /** Extracts the agent factory of a flow */ @@ -189,20 +186,9 @@ public class SlcJcrUtils implements SlcNames { + node, e); } } - + /** Prevents instantiation */ private SlcJcrUtils() { } - - public static void main(String[] args) { - String path = "/slc/agents/vm/default/org.argeo_1.2.3/myPath/myFlow"; - System.out.println("Flow relative path: " + flowRelativePath(path)); - System.out.println("Execution Module Name: " - + flowExecutionModuleName(path)); - System.out.println("Execution Module Version: " - + flowExecutionModuleVersion(path)); - System.out.println("Agent Factory path: " + flowAgentFactoryPath(path)); - } - } 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 8d6d96784..b66f09405 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 @@ -163,8 +163,13 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener, /* * EXECUTION MODULES LISTENER */ + public synchronized void executionModuleAdded( ModuleDescriptor moduleDescriptor) { + syncExecutionModule(moduleDescriptor); + } + + protected void syncExecutionModule(ModuleDescriptor moduleDescriptor) { try { Node agentNode = session.getNode(agent.getNodePath()); String moduleNodeName = SlcJcrUtils @@ -179,13 +184,12 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener, moduleDescriptor.getTitle()); moduleNode.setProperty(Property.JCR_DESCRIPTION, moduleDescriptor.getDescription()); - moduleNode.setProperty(SLC_STARTED, true); + moduleNode.setProperty(SLC_STARTED, moduleDescriptor.getStarted()); session.save(); } catch (RepositoryException e) { JcrUtils.discardQuietly(session); - throw new SlcException("Cannot add module " + moduleDescriptor, e); + throw new SlcException("Cannot sync module " + moduleDescriptor, e); } - } public synchronized void executionModuleRemoved( diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionProcess.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionProcess.java index cca76d95b..582535177 100644 --- a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionProcess.java +++ b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionProcess.java @@ -106,7 +106,7 @@ public class JcrExecutionProcess implements ExecutionProcess, SlcNames { String path = node.getPath() + '/' + relPath; // clean special character // TODO factorize in JcrUtils - path = path.replace('@', '_').replace(':', '_'); + path = path.replace('@', '_'); Node location = JcrUtils.mkdirs(node.getSession(), path); Node logEntry = location.addNode(Long.toString(nextLogLine), diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrProcessThread.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrProcessThread.java index 091458633..0fcca4504 100644 --- a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrProcessThread.java +++ b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrProcessThread.java @@ -100,10 +100,12 @@ public class JcrProcessThread extends ProcessThread implements SlcNames { Node flowNode = realizedFlowNode.getSession().getNode(flowPath); String flowName = flowNode.getProperty(SLC_NAME).getString(); - String executionModuleName = SlcJcrUtils - .flowExecutionModuleName(flowPath); - String executionModuleVersion = SlcJcrUtils - .flowExecutionModuleVersion(flowPath); + Node executionModuleNode = flowNode.getSession().getNode( + SlcJcrUtils.modulePath(flowPath)); + String executionModuleName = executionModuleNode.getProperty( + SLC_NAME).getString(); + String executionModuleVersion = executionModuleNode.getProperty( + SLC_VERSION).getString(); RealizedFlow realizedFlow = new RealizedFlow(); realizedFlow.setModuleName(executionModuleName); 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 15a3f0de9..58ae32a65 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 @@ -47,7 +47,9 @@ import org.argeo.slc.execution.ExecutionModuleDescriptor; import org.argeo.slc.execution.ExecutionModulesListener; import org.argeo.slc.process.RealizedFlow; import org.osgi.framework.Bundle; +import org.osgi.framework.BundleEvent; import org.osgi.framework.BundleException; +import org.osgi.framework.BundleListener; import org.osgi.framework.Constants; import org.osgi.framework.launch.Framework; import org.springframework.context.ApplicationContext; @@ -55,7 +57,8 @@ import org.springframework.osgi.service.importer.OsgiServiceLifecycleListener; /** Execution modules manager implementation based on an OSGi runtime. */ public class OsgiExecutionModulesManager extends - AbstractExecutionModulesManager implements OsgiServiceLifecycleListener { + AbstractExecutionModulesManager implements + OsgiServiceLifecycleListener, BundleListener { private final static Log log = LogFactory .getLog(OsgiExecutionModulesManager.class); @@ -68,9 +71,11 @@ public class OsgiExecutionModulesManager extends private List executionModulesListeners = new ArrayList(); - private Boolean registerFlowsToJmx = true; + private Boolean registerFlowsToJmx = false; public void init() throws Exception { + bundlesManager.getBundleContext().addBundleListener(this); + final String module = System.getProperty(UNIQUE_LAUNCH_MODULE_PROPERTY); final String flow = System.getProperty(UNIQUE_LAUNCH_FLOW_PROPERTY); if (module != null) { @@ -78,48 +83,51 @@ public class OsgiExecutionModulesManager extends new Thread("Unique Flow") { @Override public void run() { - if (log.isDebugEnabled()) - log.debug("Launch unique flow " + flow - + " from module " + module); - try { - OsgiBundle osgiBundle = bundlesManager - .findFromPattern(module); - Bundle moduleBundle = bundlesManager - .findRelatedBundle(osgiBundle); - bundlesManager.startSynchronous(moduleBundle); - RealizedFlow lastLaunch = findRealizedFlow(module, flow); - if (lastLaunch == null) - throw new SlcException("Cannot find launch for " - + module + " " + flow); - execute(lastLaunch); - } catch (Exception e) { - log.error("Error in unique flow " + flow - + " from module " + module, e); - } finally { - if (log.isDebugEnabled()) - log.debug("Shutdown OSGi runtime..."); - Framework framework = (Framework) bundlesManager - .getBundleContext().getBundle(0); - try { - // shutdown framework - framework.stop(); - // wait 1 min for shutdown - framework.waitForStop(60 * 1000); - // close VM - System.exit(0); - } catch (Exception e) { - e.printStackTrace(); - System.exit(1); - } - } + executeFlowAndExit(module, null, flow); } }.start(); } - } public void destroy() { + bundlesManager.getBundleContext().removeBundleListener(this); + } + /** Executes a single flow and stops the JVM */ + protected void executeFlowAndExit(final String module, + final String version, final String flow) { + if (log.isDebugEnabled()) + log.debug("Launch unique flow " + flow + " from module " + module); + try { + OsgiBundle osgiBundle = bundlesManager.findFromPattern(module); + Bundle moduleBundle = bundlesManager.findRelatedBundle(osgiBundle); + bundlesManager.startSynchronous(moduleBundle); + RealizedFlow lastLaunch = findRealizedFlow(module, flow); + if (lastLaunch == null) + throw new SlcException("Cannot find launch for " + module + " " + + flow); + execute(lastLaunch); + } catch (Exception e) { + log.error( + "Error in unique flow " + flow + " from module " + module, + e); + } finally { + if (log.isDebugEnabled()) + log.debug("Shutdown OSGi runtime..."); + Framework framework = (Framework) bundlesManager.getBundleContext() + .getBundle(0); + try { + // shutdown framework + framework.stop(); + // wait 1 min for shutdown + framework.waitForStop(60 * 1000); + // close VM + System.exit(0); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + } } public synchronized ExecutionModuleDescriptor getExecutionModuleDescriptor( @@ -383,8 +391,10 @@ public class OsgiExecutionModulesManager extends if (log.isTraceEnabled()) log.trace("Registered execution context from " + osgiBundle); // Notify + ModuleDescriptor md = osgiBundle.getModuleDescriptor(); + md.setStarted(true); for (ExecutionModulesListener listener : executionModulesListeners) - listener.executionModuleAdded(osgiBundle.getModuleDescriptor()); + listener.executionModuleAdded(md); } /** Unregisters an execution context. */ @@ -396,9 +406,10 @@ public class OsgiExecutionModulesManager extends if (log.isTraceEnabled()) log.trace("Removed execution context from " + osgiBundle); // Notify + ModuleDescriptor md = osgiBundle.getModuleDescriptor(); + md.setStarted(false); for (ExecutionModulesListener listener : executionModulesListeners) - listener.executionModuleRemoved(osgiBundle - .getModuleDescriptor()); + listener.executionModuleRemoved(md); } } @@ -473,6 +484,27 @@ public class OsgiExecutionModulesManager extends executionModulesListeners.remove(executionModulesListener); } + /* + * INTERFACE IMPLEMENTATIONS + */ + + public void bundleChanged(BundleEvent evt) { + Bundle bundle = evt.getBundle(); + if (bundle.getHeaders().get( + ExecutionModuleDescriptor.SLC_EXECUTION_MODULE) != null) { + OsgiBundle osgiBundle = new OsgiBundle(bundle); + if (evt.getType() == BundleEvent.INSTALLED) + for (ExecutionModulesListener listener : executionModulesListeners) + listener.executionModuleAdded(osgiBundle + .getModuleDescriptor()); + else if (evt.getType() == BundleEvent.UNINSTALLED) + for (ExecutionModulesListener listener : executionModulesListeners) + listener.executionModuleRemoved(osgiBundle + .getModuleDescriptor()); + } + + } + @SuppressWarnings({ "rawtypes" }) public synchronized void bind(Object service, Map properties) throws Exception {