X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2FDefaultExecutionFlow.java;h=9f2c9dbeabb5bf4c9717635f080f3ee1816153fa;hb=a050d4c27325c65fc04e7eed5b63b5f8ea117df0;hp=497e6520e86177a7b1bf79748b1f1bb11298fb33;hpb=ee6c3543a0ff9403420ce6a9c647723269f14331;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultExecutionFlow.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultExecutionFlow.java index 497e6520e..9f2c9dbea 100644 --- a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultExecutionFlow.java +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultExecutionFlow.java @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2007-2012 Mathieu Baudier + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.argeo.slc.core.execution; import java.util.ArrayList; @@ -5,33 +20,26 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +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.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.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, ResourceLoaderAware { +/** Default implementation of an execution flow. */ +public class DefaultExecutionFlow implements ExecutionFlow, BeanNameAware { + private final static Log log = LogFactory + .getLog(DefaultExecutionFlow.class); private final ExecutionSpec executionSpec; private String name = null; private Map parameters = new HashMap(); private List executables = new ArrayList(); - private String path; - private StructureRegistry registry = new TreeSRegistry(); - - private ResourceLoader resourceLoader = null; + private Boolean failOnError = true; public DefaultExecutionFlow() { this.executionSpec = new DefaultExecutionSpec(); @@ -65,13 +73,13 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean, ExecutionSpecAttribute attr = executionSpec.getAttributes() .get(key); - if (attr.getIsParameter() && !isSetAsParameter(key)) { - errors.rejectValue(key, "Parameter not set"); + if (attr.getIsImmutable() && !isSetAsParameter(key)) { + errors.rejectValue(key, "Immutable but not set"); break; } - if (attr.getIsFrozen() && !isSetAsParameter(key)) { - errors.rejectValue(key, "Frozen but not set as parameter"); + if (attr.getIsConstant() && !isSetAsParameter(key)) { + errors.rejectValue(key, "Constant but not set as parameter"); break; } @@ -88,22 +96,42 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean, } public void run() { - for (Runnable executable : executables) { - executable.run(); - } - } - - public void afterPropertiesSet() throws Exception { - if (path != null) { + try { for (Runnable executable : executables) { - if (executable instanceof StructureAware) { - ((StructureAware) executable).notifyCurrentPath( - registry, new TreeSPath(path)); + if (Thread.interrupted()) { + log.error("Flow '" + getName() + "' killed before '" + + executable + "'"); + Thread.currentThread().interrupt(); + return; + // throw new ThreadDeath(); } + this.doExecuteRunnable(executable); + } + } catch (RuntimeException e) { + if (Thread.interrupted()) { + log.error("Flow '" + getName() + + "' killed while receiving an unrelated exception", e); + Thread.currentThread().interrupt(); + return; + // throw new ThreadDeath(); + } + if (failOnError) + throw e; + else { + log.error("Execution flow failed," + + " but process did not fail" + + " because failOnError property" + + " is set to false: " + e); + if (log.isTraceEnabled()) + e.printStackTrace(); } } } + public void doExecuteRunnable(Runnable runnable) { + runnable.run(); + } + public void setBeanName(String name) { this.name = name; } @@ -152,35 +180,32 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean, .getAttributes().get(key).getValue() != null); } + @Override public String toString() { - return new StringBuffer("Flow ").append(name).toString(); + return new StringBuffer("Execution flow ").append(name).toString(); } + @Override public boolean equals(Object obj) { return ((ExecutionFlow) obj).getName().equals(name); } - public String getPath() { - return path; + @Override + public int hashCode() { + return name.hashCode(); } + /** @deprecated does nothing */ + @Deprecated public void setPath(String path) { - this.path = path; } - public void setRegistry(StructureRegistry registry) { - this.registry = registry; - } - - public void notifyCurrentPath(StructureRegistry registry, - TreeSPath path) { - if (this.path == null) { - this.path = path.toString(); - } + public Boolean getFailOnError() { + return failOnError; } - public void setResourceLoader(ResourceLoader resourceLoader) { - this.resourceLoader = resourceLoader; + public void setFailOnError(Boolean failOnError) { + this.failOnError = failOnError; } }