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=1f4601c840b361773510505362c8392647b456a7;hb=6de9c4036be9e318f59a0ffa187570f5999c53cb;hp=e41c8c84c82dff333498f97adfb685d02ed24694;hpb=d78a01fd40849caa6e55a66c9f048a06f509a374;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 e41c8c84c..1f4601c84 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 Argeo GmbH + * + * 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; @@ -8,17 +23,14 @@ 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.validation.MapBindingResult; +/** Default implementation of an execution flow. */ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean, BeanNameAware { private final static Log log = LogFactory @@ -30,7 +42,6 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean, private List executables = new ArrayList(); private String path; - private StructureRegistry registry = new TreeSRegistry(); private Boolean failOnError = true; @@ -66,13 +77,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; } @@ -91,9 +102,23 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean, public void run() { try { for (Runnable executable : executables) { - executable.run(); + 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 { @@ -107,18 +132,27 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean, } } - @SuppressWarnings(value = { "unchecked" }) + public void doExecuteRunnable(Runnable runnable) { + runnable.run(); + } + public void afterPropertiesSet() throws Exception { + if (path == null) { + if (name.charAt(0) == '/') { + path = name.substring(0, name.lastIndexOf('/')); + } + } + if (path != null) { for (Runnable executable : executables) { - if (executable instanceof StructureAware) { - ((StructureAware) executable).notifyCurrentPath( - registry, new TreeSPath(path)); - } else if (executable instanceof DefaultExecutionFlow) { + if (executable instanceof DefaultExecutionFlow) { // so we don't need to have DefaultExecutionFlow // implementing StructureAware + // FIXME: probably has side effects DefaultExecutionFlow flow = (DefaultExecutionFlow) executable; - flow.setPath(path + '/' + flow.getName()); + String newPath = path + '/' + flow.getName(); + flow.setPath(newPath); + log.warn(newPath + " was forcibly set on " + flow); } } } @@ -195,10 +229,6 @@ public class DefaultExecutionFlow implements ExecutionFlow, InitializingBean, this.path = path; } - public void setRegistry(StructureRegistry registry) { - this.registry = registry; - } - public Boolean getFailOnError() { return failOnError; }