]> 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 83a9b344dbc8b6ce228d3ae471da9bbd06593ab0..16105e241ef0e4ea10a14270831d500bf9550a3d 100644 (file)
@@ -4,52 +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();
 
-       public DefaultExecutionFlow() {
+       private ResourceLoader resourceLoader = null;
 
+       public DefaultExecutionFlow() {
+               this.executionSpec = new DefaultExecutionSpec();
        }
 
-       public DefaultExecutionFlow(Map<String, Object> parameters) {
-               this.parameters.putAll(parameters);
+       public DefaultExecutionFlow(ExecutionSpec executionSpec) {
+               this.executionSpec = executionSpec;
        }
 
-       public void execute() {
-               for (Executable executable : executables) {
-                       executable.execute();
+       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");
+                       }
                }
-       }
 
-       public void afterPropertiesSet() throws Exception {
-               // Validate execution specs
-               if (executionSpec == null)
-                       return;
+               // set the parameters
+               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()) {
@@ -70,32 +84,23 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean,
                                errors.rejectValue(key, "Hidden but not set as parameter");
                                break;
                        }
-
-                       /*
-                        * if (!parameters.containsKey(key)) { Object defaultValue =
-                        * attr.getValue(); if (defaultValue == null)
-                        * errors.rejectValue(key, "Not set and no default value"); else
-                        * parameters.put(key, defaultValue); } else {// contains key Object
-                        * obj = parameters.get(key); if (attr instanceof RefSpecAttribute)
-                        * { RefSpecAttribute rsa = (RefSpecAttribute) attr; // TODO: make
-                        * sure this will not cause pb with OSGi Class targetClass =
-                        * rsa.getTargetClass(); if
-                        * (!targetClass.isAssignableFrom(obj.getClass())) {
-                        * errors.reject(key + " not compatible with target class " +
-                        * targetClass); } } }
-                        */
                }
 
                if (errors.hasErrors())
                        throw new SlcException("Could not prepare execution flow: "
                                        + errors.toString());
 
-               // if (path == null) {
-               // path = "/" + executionSpec.getName() + "/" + name;
-               // }
+       }
+
+       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));
@@ -108,14 +113,10 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean,
                this.name = name;
        }
 
-       public void setExecutables(List<Executable> executables) {
+       public void setExecutables(List<Runnable> executables) {
                this.executables = executables;
        }
 
-       public void setExecutionSpec(ExecutionSpec executionSpec) {
-               this.executionSpec = executionSpec;
-       }
-
        public void setParameters(Map<String, Object> attributes) {
                this.parameters = attributes;
        }
@@ -128,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) {
@@ -180,4 +192,8 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean,
                }
        }
 
+       public void setResourceLoader(ResourceLoader resourceLoader) {
+               this.resourceLoader = resourceLoader;
+       }
+
 }