X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=runtime%2Forg.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2FDefaultAgent.java;h=aaa687fd77ccc9a78eba7eecf5601e4efb7f7a91;hb=6de9c4036be9e318f59a0ffa187570f5999c53cb;hp=9bfde6edcde2ce006413167e15d33b8dd2430de9;hpb=a17824ea2422474f25e2ea0eeae310f4dd9e6361;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultAgent.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultAgent.java index 9bfde6edc..aaa687fd7 100644 --- a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultAgent.java +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultAgent.java @@ -16,10 +16,8 @@ package org.argeo.slc.core.execution; import java.io.UnsupportedEncodingException; -import java.net.InetAddress; import java.net.URI; import java.net.URLDecoder; -import java.net.UnknownHostException; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -28,66 +26,41 @@ 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.BasicNameVersion; +import org.argeo.slc.NameVersion; import org.argeo.slc.SlcException; import org.argeo.slc.execution.ExecutionModuleDescriptor; import org.argeo.slc.execution.ExecutionModulesManager; import org.argeo.slc.execution.ExecutionProcess; import org.argeo.slc.execution.SlcAgent; -import org.argeo.slc.execution.SlcAgentDescriptor; /** Implements the base methods of an SLC agent. */ public class DefaultAgent implements SlcAgent { - private final static Log log = LogFactory.getLog(DefaultAgent.class); + // private final static Log log = LogFactory.getLog(DefaultAgent.class); /** UTF-8 charset for encoding. */ private final static String UTF8 = "UTF-8"; - private SlcAgentDescriptor agentDescriptor; + private String agentUuid = null; private ExecutionModulesManager modulesManager; private ThreadGroup processesThreadGroup; private Map runningProcesses = Collections .synchronizedMap(new HashMap()); + private String defaultModulePrefix = null; + /* * LIFECYCLE */ /** Initialization */ public void init() { - agentDescriptor = new SlcAgentDescriptor(); - agentDescriptor.setUuid(initAgentUuid()); - try { - agentDescriptor.setHost(InetAddress.getLocalHost().getHostName()); - } catch (UnknownHostException e) { - log.error("Cannot resolve localhost host name: " + e.getMessage()); - agentDescriptor.setHost("localhost"); - } + agentUuid = initAgentUuid(); processesThreadGroup = new ThreadGroup("SLC Processes of Agent #" - + agentDescriptor.getUuid()); - // modulesManager.registerProcessNotifier(this, - // new HashMap()); - - // final String module = System - // .getProperty(ExecutionModulesManager.UNIQUE_LAUNCH_MODULE_PROPERTY); - // final String flow = System - // .getProperty(ExecutionModulesManager.UNIQUE_LAUNCH_FLOW_PROPERTY); - // if (module != null) { - // // launch a flow and stops - // new Thread("Unique Flow") { - // @Override - // public void run() { - // executeFlowAndExit(module, null, flow); - // } - // }.start(); - // } + + agentUuid); } /** Clean up (needs to be called by overriding method) */ public void destroy() { - // modulesManager.unregisterProcessNotifier(this, - // new HashMap()); } /** @@ -98,13 +71,6 @@ public class DefaultAgent implements SlcAgent { return UUID.randomUUID().toString(); } - /* - * UNIQUE FLOW - */ - // protected void executeFlowAndExit(final String module, - // final String version, final String flow) { - // } - /* * SLC AGENT */ @@ -129,18 +95,15 @@ public class DefaultAgent implements SlcAgent { String[] path = uri.getPath().split("/"); if (path.length < 3) throw new SlcException("Badly formatted URI: " + uri); - String module = path[1]; + NameVersion nameVersion = new BasicNameVersion(path[1]); StringBuilder flow = new StringBuilder(); for (int i = 2; i < path.length; i++) flow.append('/').append(path[i]); - Map values = new HashMap(); - if (uri.getQuery() != null) - values = getQueryMap(uri.getQuery()); - - modulesManager.start(new BasicNameVersion(module, null)); + Map values = getQueryMap(uri.getQuery()); + // Get execution module descriptor ExecutionModuleDescriptor emd = getExecutionModuleDescriptor( - module, null); + nameVersion.getName(), nameVersion.getVersion()); process.getRealizedFlows().add( emd.asRealizedFlow(flow.toString(), values)); } @@ -181,8 +144,25 @@ public class DefaultAgent implements SlcAgent { } public ExecutionModuleDescriptor getExecutionModuleDescriptor( - String moduleName, String version) { - return modulesManager.getExecutionModuleDescriptor(moduleName, version); + String moduleName, String moduleVersion) { + // Get execution module descriptor + ExecutionModuleDescriptor emd; + try { + modulesManager + .start(new BasicNameVersion(moduleName, moduleVersion)); + emd = modulesManager.getExecutionModuleDescriptor(moduleName, + moduleVersion); + } catch (SlcException e) { + if (defaultModulePrefix != null) { + moduleName = defaultModulePrefix + "." + moduleName; + modulesManager.start(new BasicNameVersion(moduleName, + moduleVersion)); + emd = modulesManager.getExecutionModuleDescriptor(moduleName, + moduleVersion); + } else + throw e; + } + return emd; } public List listExecutionModuleDescriptors() { @@ -193,34 +173,25 @@ public class DefaultAgent implements SlcAgent { 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 steps) - // { - // } - /* * UTILITIES */ - private static Map getQueryMap(String query) { - String[] params = query.split("&"); + /** + * @param query + * can be null + */ + static Map getQueryMap(String query) { Map map = new LinkedHashMap(); + if (query == null) + return map; + String[] params = query.split("&"); for (String param : params) { - String name = param.split("=")[0]; - String value = param.split("=")[1]; + String[] arr = param.split("="); + String name = arr[0]; + Object value = arr.length > 1 ? param.split("=")[1] : Boolean.TRUE; try { map.put(URLDecoder.decode(name, UTF8), - URLDecoder.decode(value, UTF8)); + URLDecoder.decode(value.toString(), UTF8)); } catch (UnsupportedEncodingException e) { throw new SlcException("Cannot decode '" + param + "'", e); } @@ -235,16 +206,16 @@ public class DefaultAgent implements SlcAgent { this.modulesManager = modulesManager; } - protected SlcAgentDescriptor getAgentDescriptor() { - return agentDescriptor; + public void setDefaultModulePrefix(String defaultModulePrefix) { + this.defaultModulePrefix = defaultModulePrefix; } public String getAgentUuid() { - return agentDescriptor.getUuid(); + return agentUuid; } @Override public String toString() { - return agentDescriptor.toString(); + return "Agent #" + getAgentUuid(); } }