From 53146ebdda3a7c0c217c44d395d270a7e9d045be Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 9 Jun 2009 16:31:43 +0000 Subject: [PATCH 1/1] Runtime improvements git-svn-id: https://svn.argeo.org/slc/trunk@2521 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/pom.xml | 1 - demo/site/org.argeo.slc.demo.basic/pom.xml | 42 ------------------- .../client/impl/SlcServerHttpClientImpl.java | 2 + .../execution/DefaultDescriptorConverter.java | 6 ++- .../slc/core/execution/ExecutionAspect.java | 34 +++++++++------ .../slc/core/execution/ExecutionScope.java | 16 +++++++ .../core/execution/MapExecutionContext.java | 2 - .../slc/core/execution/OsFileFactoryBean.java | 9 ++-- .../slc/core/execution/tasks/MergedLists.java | 32 ++++++++++++++ .../slc/core/execution/tasks/SystemCall.java | 14 +++---- .../org/argeo/slc/core/execution/defaults.xml | 7 +++- .../org/argeo/slc/core/execution/spring.xml | 1 + .../org/argeo/slc/core/execution/utils.xml | 12 ++++++ 13 files changed, 105 insertions(+), 73 deletions(-) delete mode 100644 demo/site/org.argeo.slc.demo.basic/pom.xml create mode 100644 runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/tasks/MergedLists.java create mode 100644 runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/utils.xml diff --git a/demo/pom.xml b/demo/pom.xml index 5a0198f4f..d9d0a0d8d 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -22,7 +22,6 @@ -clean - -noExit ${basedir}/site;in=*;ex=**/.svn/**,${basedir}/../server/org.argeo.slc.siteserver/bundles;in=*;ex=**/.svn/** diff --git a/demo/site/org.argeo.slc.demo.basic/pom.xml b/demo/site/org.argeo.slc.demo.basic/pom.xml deleted file mode 100644 index 8cd5ec1cc..000000000 --- a/demo/site/org.argeo.slc.demo.basic/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - 4.0.0 - - org.argeo.slc - argeo-slc-demo - 0.11.3-SNAPSHOT - .. - - org.argeo.slc.demo - org.argeo.slc.demo.basic - Argeo SLC Demo Basic Test Module - jar - - - - - maven-jar-plugin - - - META-INF/MANIFEST.MF - - . - - conf/** - - - - - - - - - org.argeo.slc.runtime - org.argeo.slc.support.equinox - - - org.argeo.slc.runtime - org.argeo.slc.support.simple - - - diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/server/client/impl/SlcServerHttpClientImpl.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/server/client/impl/SlcServerHttpClientImpl.java index 301afb5b1..666e7b7bc 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/server/client/impl/SlcServerHttpClientImpl.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/server/client/impl/SlcServerHttpClientImpl.java @@ -110,6 +110,8 @@ public class SlcServerHttpClientImpl extends AbstractHttpServicesClient .getUuid()); ExecutionModuleDescriptor moduleDescMinimal = findModule(lst, moduleName); + if (moduleDescMinimal == null) + throw new SlcException("Cannot find module " + moduleName); String moduleVersion = moduleDescMinimal.getVersion(); ExecutionModuleDescriptor moduleDesc = getModuleDescriptor( diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/DefaultDescriptorConverter.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/DefaultDescriptorConverter.java index 4a234f9f9..2ae1e3639 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/DefaultDescriptorConverter.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/DefaultDescriptorConverter.java @@ -28,8 +28,10 @@ public class DefaultDescriptorConverter implements // the primitiveValue.type convertedValues.put(key, primitiveValue.getValue()); } else if (value instanceof RefValue) { - RefValue refValue = (RefValue) value; - convertedValues.put(key, refValue.getLabel()); + // not yet implemented + +// RefValue refValue = (RefValue) value; +// convertedValues.put(key, refValue.getLabel()); } } } diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/ExecutionAspect.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/ExecutionAspect.java index c2abfed27..29942817d 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/ExecutionAspect.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/ExecutionAspect.java @@ -1,23 +1,23 @@ package org.argeo.slc.core.execution; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.argeo.slc.execution.ExecutionContext; import org.argeo.slc.execution.ExecutionFlow; import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; -import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @Aspect public class ExecutionAspect { - private static Log log = LogFactory.getLog(ExecutionAspect.class); + static ThreadLocal inModuleExecution = new ThreadLocal() { + protected Boolean initialValue() { + return false; + } + }; private ExecutionContext executionContext; - + public ExecutionContext getExecutionContext() { return executionContext; } @@ -28,24 +28,32 @@ public class ExecutionAspect { @Before("flowExecution()") public void beforeFlow(JoinPoint jp) throws Throwable { - //log.debug("this " + jp.getThis().getClass()); - //log.debug("target " + jp.getTarget().getClass()); - // Thread.dumpStack(); ExecutionFlow executionFlow = (ExecutionFlow) jp.getTarget(); executionContext.enterFlow(executionFlow); } @After("flowExecution()") public void afterFlow(JoinPoint jp) throws Throwable { - //log.debug("this " + jp.getThis().getClass()); - //log.debug("target " + jp.getTarget().getClass()); ExecutionFlow executionFlow = (ExecutionFlow) jp.getTarget(); executionContext.leaveFlow(executionFlow); } + @Before("moduleExecution()") + public void beforeModuleExecution(JoinPoint jp) throws Throwable { + inModuleExecution.set(true); + } + + @After("moduleExecution()") + public void afterModuleExecution(JoinPoint jp) throws Throwable { + inModuleExecution.set(false); + } + @Pointcut("execution(void org.argeo.slc.execution.ExecutionFlow.run())") public void flowExecution() { } - - + + @Pointcut("execution(void org.argeo.slc.execution.ExecutionModule.execute(..))") + public void moduleExecution() { + } + } diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/ExecutionScope.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/ExecutionScope.java index 36d951093..7deb9f578 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/ExecutionScope.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/ExecutionScope.java @@ -27,9 +27,25 @@ public class ExecutionScope implements Scope { // if not, we expect objectFactory to produce an ExecutionContext Object obj = objectFactory.getObject(); if (obj instanceof ExecutionContext) { + // Check whether we are in an execution + // FIXME: do it more properly (not static) + // see https://www.argeo.org/bugzilla/show_bug.cgi?id=82 + if (!ExecutionAspect.inModuleExecution.get()) + log + .error("An execution context is being instatiated outside an execution." + + " Please check that your references to execution contexts." + + " This may lead to unexpected behaviour and will be rejected in the future."); + // store the ExecutionContext in the ThreadLocal executionContext.set((ExecutionContext) obj); executionContextBeanName.set(name); + if (log.isDebugEnabled()) { + log.debug("Execution context #" + + executionContext.get().getUuid() + + " instantiated. (beanName=" + + executionContextBeanName.get() + ")"); +// Thread.dumpStack(); + } return obj; } else { throw new SlcException( diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/MapExecutionContext.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/MapExecutionContext.java index f38342662..9e6c2b5bd 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/MapExecutionContext.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/MapExecutionContext.java @@ -27,8 +27,6 @@ public class MapExecutionContext implements ExecutionContext { public MapExecutionContext() { uuid = UUID.randomUUID().toString(); - if (log.isDebugEnabled()) - log.debug("Execution context #" + uuid + " instantiated."); } public void addVariables( diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/OsFileFactoryBean.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/OsFileFactoryBean.java index b566e5742..18a9f840b 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/OsFileFactoryBean.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/OsFileFactoryBean.java @@ -6,25 +6,26 @@ import org.springframework.beans.factory.FactoryBean; import org.springframework.core.io.Resource; import org.springframework.util.Assert; -/** Workaround when execution placedholders needs to be passed. */ +/** Retrieve an OS File from the given resource. */ public class OsFileFactoryBean implements FactoryBean { private ExecutionResources executionResources; private Resource resource; private Boolean overwrite = false; - /** Return an existing file on the fiel system. */ + /** Return an existing file on the file system. */ public Object getObject() throws Exception { Assert.notNull(executionResources, "executionResources is null"); Assert.notNull(resource, "relativePath is null"); return executionResources.getAsOsPath(resource, overwrite); } + /** Return {@link Object} because CGLIB is unable to proxy {@link File}.*/ public Class getObjectType() { - return File.class; + return CharSequence.class; } public boolean isSingleton() { - return true; + return false; } /** The execution resources object. */ diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/tasks/MergedLists.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/tasks/MergedLists.java new file mode 100644 index 000000000..9e2817b89 --- /dev/null +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/tasks/MergedLists.java @@ -0,0 +1,32 @@ +package org.argeo.slc.core.execution.tasks; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.FactoryBean; + +/** Merge the provided lists in one single list, in the order provided. */ +public class MergedLists implements FactoryBean { + private List> lists = new ArrayList>(); + + public void setLists(List> lists) { + this.lists = lists; + } + + public Object getObject() throws Exception { + List merged = new ArrayList(); + for (List lst : lists) { + merged.addAll(lst); + } + return merged; + } + + public Class getObjectType() { + return List.class; + } + + public boolean isSingleton() { + return false; + } + +} diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/tasks/SystemCall.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/tasks/SystemCall.java index 2bb835b24..143bded2a 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/tasks/SystemCall.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/tasks/SystemCall.java @@ -26,14 +26,14 @@ public class SystemCall implements Runnable { private String execDir; private String cmd = null; - private List command = null; + private List command = null; private Boolean synchronous = true; private String stdErrLogLevel = "ERROR"; private String stdOutLogLevel = "INFO"; - private Map> osCommands = new HashMap>(); + private Map> osCommands = new HashMap>(); private Map osCmds = new HashMap(); private Map environmentVariables = new HashMap(); @@ -57,7 +57,7 @@ public class SystemCall implements Runnable { // Check if an OS specific command overrides String osName = System.getProperty("os.name"); - List commandToUse = null; + List commandToUse = null; if (osCommands.containsKey(osName)) commandToUse = osCommands.get(osName); else @@ -110,9 +110,9 @@ public class SystemCall implements Runnable { if (commandToUse.size() == 0) throw new SlcException("Command line is empty."); - commandLine = new CommandLine(commandToUse.get(0)); + commandLine = new CommandLine(commandToUse.get(0).toString()); for (int i = 1; i < commandToUse.size(); i++) - commandLine.addArgument(commandToUse.get(i)); + commandLine.addArgument(commandToUse.get(i).toString()); } else { // all cases covered previously throw new NotImplementedException(); @@ -200,11 +200,11 @@ public class SystemCall implements Runnable { this.synchronous = synchronous; } - public void setCommand(List command) { + public void setCommand(List command) { this.command = command; } - public void setOsCommands(Map> osCommands) { + public void setOsCommands(Map> osCommands) { this.osCommands = osCommands; } diff --git a/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/defaults.xml b/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/defaults.xml index 09e7a5c1d..c6c3c64b3 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/defaults.xml +++ b/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/defaults.xml @@ -1,11 +1,14 @@ + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> + scope="execution" lazy-init="true"> + diff --git a/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/spring.xml b/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/spring.xml index 3cfac026b..33d4b7ef8 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/spring.xml +++ b/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/spring.xml @@ -10,6 +10,7 @@ + diff --git a/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/utils.xml b/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/utils.xml new file mode 100644 index 000000000..e75bcb395 --- /dev/null +++ b/runtime/org.argeo.slc.support.simple/src/main/resources/org/argeo/slc/core/execution/utils.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file -- 2.39.2