import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.slc.execution.ExecutionContext;
+import org.argeo.slc.execution.ExecutionFlow;
+import org.argeo.slc.execution.ExecutionFlowDescriptorConverter;
import org.argeo.slc.execution.ExecutionModulesListener;
import org.argeo.slc.execution.ExecutionModulesManager;
+import org.argeo.slc.process.RealizedFlow;
import org.argeo.slc.process.SlcExecution;
import org.argeo.slc.process.SlcExecutionNotifier;
public abstract class AbstractExecutionModulesManager implements
ExecutionModulesManager {
+ private final static Log log = LogFactory
+ .getLog(AbstractExecutionModulesManager.class);
+
private List<SlcExecutionNotifier> slcExecutionNotifiers = new ArrayList<SlcExecutionNotifier>();
private List<ExecutionModulesListener> executionModulesListeners = new ArrayList<ExecutionModulesListener>();
private ThreadGroup processesThreadGroup = new ThreadGroup("Processes");
+ protected abstract ExecutionFlow findExecutionFlow(String moduleName,
+ String moduleVersion, String flowName);
+
+ protected abstract ExecutionContext findExecutionContext(String moduleName,
+ String moduleVersion);
+
+ protected abstract ExecutionFlowDescriptorConverter getExecutionFlowDescriptorConverter(
+ String moduleName, String moduleVersion);
+
public void process(SlcExecution slcExecution) {
new ProcessThread(this, slcExecution).start();
}
+ public void execute(RealizedFlow realizedFlow) {
+ if (log.isTraceEnabled())
+ log.trace("Executing " + realizedFlow);
+
+ String moduleName = realizedFlow.getModuleName();
+ String moduleVersion = realizedFlow.getModuleVersion();
+
+ Map<? extends String, ? extends Object> variablesToAdd = getExecutionFlowDescriptorConverter(
+ moduleName, moduleVersion).convertValues(
+ realizedFlow.getFlowDescriptor());
+ ExecutionContext executionContext = findExecutionContext(moduleName,
+ moduleVersion);
+ for (String key : variablesToAdd.keySet())
+ executionContext.setVariable(key, variablesToAdd.get(key));
+
+ ExecutionFlow flow = findExecutionFlow(moduleName, moduleVersion,
+ realizedFlow.getFlowDescriptor().getName());
+
+ //
+ // Actually runs the flow, IN THIS THREAD
+ //
+ flow.run();
+ //
+ //
+ //
+ }
+
public void setSlcExecutionNotifiers(
List<SlcExecutionNotifier> slcExecutionNotifiers) {
this.slcExecutionNotifiers = slcExecutionNotifiers;
/** Thread of a single execution */
public class ExecutionThread extends Thread {
+ public final static String SYSPROP_EXECUTION_AUTO_UPGRADE = "slc.execution.autoupgrade";
+
private final static Log log = LogFactory.getLog(ExecutionThread.class);
private final RealizedFlow realizedFlow;
SlcExecutionStep.TYPE_PHASE_START, "Flow " + flowName));
try {
+ String autoUpgrade = System
+ .getProperty(SYSPROP_EXECUTION_AUTO_UPGRADE);
+ if (autoUpgrade != null && autoUpgrade.equals("true"))
+ processThread.getExecutionModulesManager().upgrade(
+ realizedFlow.getModuleNameVersion());
processThread.getExecutionModulesManager().execute(realizedFlow);
} catch (Exception e) {
// TODO: re-throw exception ?
public ParameterRef() {
}
- /** @deprecated for backward compatibility with pre v0.11.4 approach. */
public ParameterRef(String name) {
this.name = name;
- log
- .warn("Using constructor in parameter ref is deprecated"
- + " and will be removed in a later version. Set with property 'name'.");
}
public Object getObject() throws Exception {
stdOutputStream != null ? stdOutputStream
: new LogOutputStream() {
protected void processLine(String line, int level) {
- log(stdOutLogLevel, line);
+ if (line != null && !line.trim().equals(""))
+ log(stdOutLogLevel, line);
if (stdOutWriter != null)
appendLineToFile(stdOutWriter, line);
}
}, new LogOutputStream() {
protected void processLine(String line, int level) {
- log(stdErrLogLevel, line);
+ if (line != null && !line.trim().equals(""))
+ log(stdErrLogLevel, line);
if (stdErrWriter != null)
appendLineToFile(stdErrWriter, line);
}
return new ExecuteResultHandler() {
public void onProcessComplete(int exitValue) {
+ String msg = "System call '" + commandLine
+ + "' properly completed.";
if (log.isDebugEnabled())
- log
- .debug("Process " + commandLine
- + " properly completed.");
+ log.debug(msg);
if (testResult != null) {
forwardPath(testResult, null);
testResult.addResultPart(new SimpleResultPart(
- TestStatus.PASSED, "Process " + commandLine
- + " properly completed."));
+ TestStatus.PASSED, msg));
}
}
public void onProcessFailed(ExecuteException e) {
- String msg = "Process " + commandLine + " failed.";
+ String msg = "System call '" + commandLine + "' failed.";
if (testResult != null) {
forwardPath(testResult, null);
testResult.addResultPart(new SimpleResultPart(
import java.util.List;
+import org.argeo.slc.build.NameVersion;
+
/** Provides access to modules */
public interface ModulesManager {
/** @return a full fledged module descriptor. */
* @return a list of minimal module descriptors
*/
public List<ModuleDescriptor> listModules();
+
+ /** Synchronously upgrades the module referenced by this name version */
+ public void upgrade(NameVersion nameVersion);
}
import java.io.Serializable;
+import org.argeo.slc.build.BasicNameVersion;
+import org.argeo.slc.build.NameVersion;
import org.argeo.slc.execution.ExecutionFlowDescriptor;
import org.argeo.slc.execution.ExecutionSpec;
public void setModuleName(String moduleName) {
this.moduleName = moduleName;
}
+
+ public NameVersion getModuleNameVersion(){
+ return new BasicNameVersion(getModuleName(), getModuleVersion());
+ }
public String getModuleVersion() {
return moduleVersion;
+ executionName);
// Execute
- if (SLC_WITH_REFRESH.equals(slcCommand))
- modulesManager.updateAndExecute(lastLaunch);
- else if (SLC_NO_REFRESH.equals(slcCommand))
+ if (SLC_WITH_REFRESH.equals(slcCommand)) {
+ modulesManager.upgrade(lastLaunch.getModuleNameVersion());
+ modulesManager.execute(lastLaunch);
+ } else if (SLC_NO_REFRESH.equals(slcCommand))
modulesManager.execute(lastLaunch);
else
throw new SlcException("Unrecognized SLC command " + slcCommand);
}
if (log.isDebugEnabled())
- log.debug("Bundle " + bundle.getSymbolicName()
- + " ready to be used at latest version."
- + " (upgrade performed in " + (end - begin) + "ms).");
+ log.debug("Bundle '" + bundle.getSymbolicName()
+ + "' upgraded and ready " + " (upgrade performed in "
+ + (end - begin) + "ms).");
if (log.isTraceEnabled()) {
ApplicationContext applicationContext = (ApplicationContext) bundleContext
import org.argeo.slc.build.BasicNameVersion;
import org.argeo.slc.build.Distribution;
+import org.argeo.slc.build.NameVersion;
import org.argeo.slc.core.build.ResourceDistribution;
import org.argeo.slc.deploy.DeploymentData;
import org.argeo.slc.deploy.Module;
super(name, version);
}
+ public OsgiBundle(NameVersion nameVersion) {
+ super(nameVersion);
+ }
+
public OsgiBundle(Bundle bundle) {
super(bundle.getSymbolicName(), getVersionSafe(bundle));
internalBundleId = bundle.getBundleId();
import org.apache.commons.logging.LogFactory;
import org.argeo.slc.SlcException;
import org.argeo.slc.build.BasicNameVersion;
+import org.argeo.slc.build.NameVersion;
import org.argeo.slc.core.execution.AbstractExecutionModulesManager;
import org.argeo.slc.core.execution.DefaultExecutionFlowDescriptorConverter;
import org.argeo.slc.deploy.ModuleDescriptor;
}
}
- public void updateAndExecute(RealizedFlow realizedFlow) {
- OsgiBundle osgiBundle = new OsgiBundle(realizedFlow);
+ public void upgrade(NameVersion nameVersion) {
+ OsgiBundle osgiBundle = new OsgiBundle(nameVersion);
bundlesManager.upgradeSynchronous(osgiBundle);
- execute(realizedFlow);
}
protected synchronized ExecutionFlowDescriptorConverter getExecutionFlowDescriptorConverter(
}
}
- public void execute(RealizedFlow realizedFlow) {
- if (log.isTraceEnabled())
- log.trace("Executing " + realizedFlow);
-
- String moduleName = realizedFlow.getModuleName();
- String moduleVersion = realizedFlow.getModuleVersion();
-
- Map<? extends String, ? extends Object> variablesToAdd = getExecutionFlowDescriptorConverter(
- moduleName, moduleVersion).convertValues(
- realizedFlow.getFlowDescriptor());
- ExecutionContext executionContext = findExecutionContext(moduleName,
- moduleVersion);
- for (String key : variablesToAdd.keySet())
- executionContext.setVariable(key, variablesToAdd.get(key));
-
- ExecutionFlow flow = findExecutionFlow(moduleName, moduleVersion,
- realizedFlow.getFlowDescriptor().getName());
-
- //
- // Actually runs the flow, IN THIS THREAD
- //
- flow.run();
- //
- //
- //
- }
-
public ModuleDescriptor getModuleDescriptor(String moduleName,
String version) {
return getExecutionModuleDescriptor(moduleName, version);