]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/execution/DefaultExecutionFlow.java
Introduce a factory bean to use execution resources
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.simple / src / main / java / org / argeo / slc / core / execution / DefaultExecutionFlow.java
index 5be9e2ac54a2da4870130260d4a541e9834a98b9..16105e241ef0e4ea10a14270831d500bf9550a3d 100644 (file)
@@ -4,55 +4,66 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 
-import org.apache.commons.lang.math.RandomUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.core.structure.tree.TreeSPath;
 import org.argeo.slc.core.structure.tree.TreeSRegistry;
-import org.argeo.slc.execution.Executable;
 import org.argeo.slc.execution.ExecutionFlow;
 import org.argeo.slc.execution.ExecutionSpec;
 import org.argeo.slc.execution.ExecutionSpecAttribute;
 import org.argeo.slc.structure.StructureAware;
 import org.argeo.slc.structure.StructureRegistry;
-import org.argeo.slc.test.ExecutableTestRun;
 import org.springframework.beans.factory.BeanNameAware;
 import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.ResourceLoaderAware;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
 import org.springframework.validation.MapBindingResult;
 
 public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean,
-               BeanNameAware, StructureAware<TreeSPath> {
-       private ExecutionSpec executionSpec = new DefaultExecutionSpec();
+               BeanNameAware, StructureAware<TreeSPath>, ResourceLoaderAware {
+
+       private final static Log log = LogFactory
+                       .getLog(DefaultExecutionFlow.class);
+
+       private final ExecutionSpec executionSpec;
        private String name = null;
        private Map<String, Object> parameters = new HashMap<String, Object>();
-       private List<Executable> executables = new ArrayList<Executable>();
+       private List<Runnable> executables = new ArrayList<Runnable>();
 
        private String path;
        private StructureRegistry<TreeSPath> registry = new TreeSRegistry();
-               
+
+       private ResourceLoader resourceLoader = null;
+
        public DefaultExecutionFlow() {
-       }       
-       
+               this.executionSpec = new DefaultExecutionSpec();
+       }
+
        public DefaultExecutionFlow(ExecutionSpec executionSpec) {
                this.executionSpec = executionSpec;
        }
-       
-       public DefaultExecutionFlow(ExecutionSpec executionSpec, Map<String, Object> parameters) {
+
+       public DefaultExecutionFlow(ExecutionSpec executionSpec,
+                       Map<String, Object> parameters) {
                // be sure to have an execution spec
-               this.executionSpec = (executionSpec == null) ? new DefaultExecutionSpec() : executionSpec;
-               
-               //only parameters contained in the executionSpec can be set
-               for(String parameter : parameters.keySet()) {
-                       if(!executionSpec.getAttributes().containsKey(parameter)) {
-                               throw new SlcException("Parameter " + parameter + " is not defined in the ExecutionSpec");
+               this.executionSpec = (executionSpec == null) ? new DefaultExecutionSpec()
+                               : executionSpec;
+
+               // only parameters contained in the executionSpec can be set
+               for (String parameter : parameters.keySet()) {
+                       if (!executionSpec.getAttributes().containsKey(parameter)) {
+                               throw new SlcException("Parameter " + parameter
+                                               + " is not defined in the ExecutionSpec");
                        }
                }
-               
+
                // set the parameters
-               this.parameters.putAll(parameters);             
-               
-               //check that all the required parameters are defined
+               this.parameters.putAll(parameters);
+
+               // check that all the required parameters are defined
                MapBindingResult errors = new MapBindingResult(parameters, "execution#"
                                + getName());
                for (String key : executionSpec.getAttributes().keySet()) {
@@ -77,20 +88,19 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean,
 
                if (errors.hasErrors())
                        throw new SlcException("Could not prepare execution flow: "
-                                       + errors.toString());           
-               
-               
+                                       + errors.toString());
+
        }
 
-       public void execute() {
-               for (Executable executable : executables) {
-                       executable.execute();
+       public void run() {
+               for (Runnable executable : executables) {
+                       executable.run();
                }
        }
 
        public void afterPropertiesSet() throws Exception {
                if (path != null) {
-                       for (Executable executable : executables) {
+                       for (Runnable executable : executables) {
                                if (executable instanceof StructureAware) {
                                        ((StructureAware<TreeSPath>) executable).notifyCurrentPath(
                                                        registry, new TreeSPath(path));
@@ -103,7 +113,7 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean,
                this.name = name;
        }
 
-       public void setExecutables(List<Executable> executables) {
+       public void setExecutables(List<Runnable> executables) {
                this.executables = executables;
        }
 
@@ -119,23 +129,34 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean,
                return executionSpec;
        }
 
-       public Object getParameter(String name) {
-               if (parameters.containsKey(name)) {
-                       return parameters.get(name);
+       public Object getParameter(String parameterName) {
+               // Verify that there is a spec attribute
+               ExecutionSpecAttribute specAttr = null;
+               if (executionSpec.getAttributes().containsKey(parameterName)) {
+                       specAttr = executionSpec.getAttributes().get(parameterName);
                } else {
-                       if (executionSpec.getAttributes().containsKey(name)) {
-                               ExecutionSpecAttribute esa = executionSpec.getAttributes().get(
-                                               name);
-                               if (esa.getValue() != null)
-                                       return esa.getValue();
+                       throw new SlcException("Key " + parameterName
+                                       + " is not defined in the specifications of " + toString());
+               }
+
+               if (parameters.containsKey(parameterName)) {
+                       Object paramValue = parameters.get(parameterName);
+                       if (specAttr instanceof ResourceSpecAttribute) {
+                               // deal with resources
+                               Resource resource = resourceLoader.getResource(paramValue
+                                               .toString());
+                               return ((ResourceSpecAttribute) specAttr)
+                                               .convertResource(resource);
                        } else {
-                               throw new SlcException("Key " + name
-                                               + " is not defined in the specifications of "
-                                               + toString());
+                               return paramValue;
+                       }
+               } else {
+                       if (specAttr.getValue() != null) {
+                               return specAttr.getValue();
                        }
                }
-               throw new SlcException("Key " + name + " is not set as parameter in "
-                               + toString());
+               throw new SlcException("Key " + parameterName
+                               + " is not set as parameter in " + toString());
        }
 
        public Boolean isSetAsParameter(String key) {
@@ -171,4 +192,8 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean,
                }
        }
 
+       public void setResourceLoader(ResourceLoader resourceLoader) {
+               this.resourceLoader = resourceLoader;
+       }
+
 }