/*
- * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
+ * 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.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.argeo.slc.core.runtime;
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.UUID;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.argeo.slc.SlcException;
import org.argeo.slc.core.execution.ProcessThread;
import org.argeo.slc.execution.ExecutionModuleDescriptor;
import org.argeo.slc.execution.ExecutionModulesManager;
import org.argeo.slc.execution.ExecutionProcess;
+import org.argeo.slc.execution.ExecutionProcessNotifier;
+import org.argeo.slc.execution.ExecutionStep;
import org.argeo.slc.process.SlcExecution;
import org.argeo.slc.runtime.SlcAgent;
import org.argeo.slc.runtime.SlcAgentDescriptor;
/** Implements the base methods of an SLC agent. */
-public class DefaultAgent implements SlcAgent {
+@SuppressWarnings("deprecation")
+public class DefaultAgent implements SlcAgent, ExecutionProcessNotifier {
+ private final static Log log = LogFactory.getLog(DefaultAgent.class);
+
private SlcAgentDescriptor agentDescriptor;
private ExecutionModulesManager modulesManager;
+ private ThreadGroup processesThreadGroup;
+ private Map<String, ProcessThread> runningProcesses = Collections
+ .synchronizedMap(new HashMap<String, ProcessThread>());
+
/*
* LIFECYCLE
*/
+ /** Initialization */
public void init() {
+ agentDescriptor = new SlcAgentDescriptor();
+ agentDescriptor.setUuid(initAgentUuid());
try {
- agentDescriptor = new SlcAgentDescriptor();
- agentDescriptor.setUuid(initAgentUuid());
agentDescriptor.setHost(InetAddress.getLocalHost().getHostName());
} catch (UnknownHostException e) {
- throw new SlcException("Unable to create agent descriptor.", e);
+ log.error("Cannot resolve localhost host name: " + e.getMessage());
+ agentDescriptor.setHost("localhost");
}
+ processesThreadGroup = new ThreadGroup("SLC Processes of Agent #"
+ + agentDescriptor.getUuid());
+ modulesManager.registerProcessNotifier(this,
+ new HashMap<String, String>());
}
- public void dispose() {
-
+ /** Clean up (needs to be called by overriding method) */
+ public void destroy() {
+ modulesManager.unregisterProcessNotifier(this,
+ new HashMap<String, String>());
}
/**
/*
* SLC AGENT
*/
- public void runSlcExecution(SlcExecution slcExecution) {
- process(slcExecution);
- }
-
public void process(ExecutionProcess process) {
- ProcessThread processThread = createProcessThread(modulesManager,
- process);
+ ProcessThread processThread = createProcessThread(processesThreadGroup,
+ modulesManager, process);
processThread.start();
+ runningProcesses.put(process.getUuid(), processThread);
+ // FIXME find a way to remove them from this register
+ }
+
+ public void kill(ExecutionProcess process) {
+ String processUuid = process.getUuid();
+ if (runningProcesses.containsKey(processUuid)) {
+ runningProcesses.get(processUuid).interrupt();
+ }
}
/** Creates the thread which will coordinate the execution for this agent. */
protected ProcessThread createProcessThread(
+ ThreadGroup processesThreadGroup,
ExecutionModulesManager modulesManager, ExecutionProcess process) {
if (!(process instanceof SlcExecution))
throw new SlcException("Unsupported process type "
+ process.getClass());
- ProcessThread processThread = new ProcessThread(modulesManager,
- (SlcExecution) process);
+ ProcessThread processThread = new ProcessThread(processesThreadGroup,
+ modulesManager, (SlcExecution) process);
return processThread;
}
return true;
}
+ /*
+ * PROCESS NOTIFIER
+ */
+ public void updateStatus(ExecutionProcess process, String oldStatus,
+ String newStatus) {
+ if (newStatus.equals(ExecutionProcess.COMPLETED)
+ || newStatus.equals(ExecutionProcess.ERROR)
+ || newStatus.equals(ExecutionProcess.KILLED)) {
+ runningProcesses.remove(process.getUuid());
+ }
+ }
+
+ public void addSteps(ExecutionProcess process, List<ExecutionStep> steps) {
+ }
+
/*
* BEAN
*/