import java.util.UUID;
import org.apache.commons.lang.math.RandomUtils;
+import org.argeo.slc.SlcException;
import org.argeo.slc.process.Executable;
import org.argeo.slc.test.ExecutableTestRun;
+import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
+import org.springframework.validation.MapBindingResult;
-public class SimpleExecutionFlow implements ExecutionFlow, InitializingBean {
- private static ThreadLocal<ExecutionFlow> executionFlow = new ThreadLocal<ExecutionFlow>();
-
- private ExecutionSpec executionSpec;
- private Map<String, Object> attributes = new HashMap<String, Object>();
+public class SimpleExecutionFlow implements ExecutionFlow, InitializingBean,
+ BeanNameAware {
+ private ExecutionSpec executionSpec = new SimpleExecutionSpec();
+ private String name = null;
+ private Map<String, Object> parameters = new HashMap<String, Object>();
private List<Executable> executables = new ArrayList<Executable>();
-
+
private final String uuid = UUID.randomUUID().toString();
public void execute() {
- try {
- executionFlow.set(this);
- for (Executable executable : executables) {
- executable.execute();
- }
- } finally {
- executionFlow.set(null);
+ for (Executable executable : executables) {
+ executable.execute();
}
}
public void afterPropertiesSet() throws Exception {
- // TODO Auto-generated method stub
+ // Validate execution specs
+ if (executionSpec == null)
+ return;
+
+ MapBindingResult errors = new MapBindingResult(parameters, "execution#"
+ + getUuid());
+ for (String key : executionSpec.getAttributes().keySet()) {
+ ExecutionSpecAttribute executionSpecAttr = executionSpec
+ .getAttributes().get(key);
+ if (!parameters.containsKey(key)) {
+ Object defaultValue = executionSpecAttr.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 (executionSpecAttr instanceof RefSpecAttribute) {
+ RefSpecAttribute rsa = (RefSpecAttribute) executionSpecAttr;
+ 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());
+ }
+ public void setBeanName(String name) {
+ this.name = name;
}
public void setExecutables(List<Executable> executables) {
this.executionSpec = executionSpec;
}
- public void setAttributes(Map<String, Object> attributes) {
- this.attributes = attributes;
+ public void setParameters(Map<String, Object> attributes) {
+ this.parameters = attributes;
}
- public static ExecutionFlow getCurrentExecutionFlow() {
- return executionFlow.get();
+ public String getUuid() {
+ return uuid;
}
- public Map<String, Object> getAttributes() {
- return attributes;
+ public ExecutionSpec getExecutionSpec() {
+ return executionSpec;
}
- public String getUuid() {
- return uuid;
+ public Object getParameter(String name) {
+ if (parameters.containsKey(name)) {
+ return parameters.get(name);
+ } else {
+ if (executionSpec.getAttributes().containsKey(name)) {
+ ExecutionSpecAttribute esa = executionSpec.getAttributes().get(
+ name);
+ if (esa.getValue() != null)
+ return esa.getValue();
+ } else {
+ throw new SlcException("Key " + name
+ + " is not define in the specifications of "
+ + toString());
+ }
+ }
+ throw new SlcException("Key " + name + " is not set as parameter in "
+ + toString());
}
+ public String toString() {
+ return new StringBuffer("Flow ").append(name).toString();// .append(" [#")
+ // .append(uuid).append(']').toString();
+ }
}