]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/DefaultAgentCli.java
Ignore files
[gpl/argeo-slc.git] / runtime / org.argeo.slc.core / src / main / java / org / argeo / slc / core / execution / DefaultAgentCli.java
index 823207e87193e0c342b85ba6fc081e0d2d2ba752..b09aee755a2adef411a8e04e56d61200b4adba4c 100644 (file)
@@ -6,16 +6,31 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.security.OsAuthenticationToken;
+import org.argeo.slc.BasicNameVersion;
+import org.argeo.slc.NameVersion;
 import org.argeo.slc.SlcException;
+import org.argeo.slc.execution.ExecutionFlowDescriptor;
+import org.argeo.slc.execution.ExecutionModuleDescriptor;
+import org.argeo.slc.execution.ExecutionSpec;
+import org.argeo.slc.execution.ExecutionSpecAttribute;
 import org.argeo.slc.execution.SlcAgent;
 import org.argeo.slc.execution.SlcAgentCli;
 import org.springframework.security.Authentication;
 import org.springframework.security.AuthenticationManager;
 import org.springframework.security.context.SecurityContextHolder;
 
+/**
+ * Authenticates thread and executes synchronously a command line execution.
+ * Reference implementation of args to URIs algorithm.
+ */
 public class DefaultAgentCli implements SlcAgentCli {
+       private final static Log log = LogFactory.getLog(DefaultAgentCli.class);
+
        private final static String UTF8 = "UTF-8";
        private SlcAgent agent;
        private AuthenticationManager authenticationManager;
@@ -23,14 +38,99 @@ public class DefaultAgentCli implements SlcAgentCli {
        private Long timeout = 24 * 60 * 60 * 1000l;
 
        public String process(String[] args) {
-               OsAuthenticationToken oat = new OsAuthenticationToken();
-               Authentication authentication = authenticationManager.authenticate(oat);
-               SecurityContextHolder.getContext().setAuthentication(authentication);
-
-               List<URI> uris = asURIs(args);
-               String processUuid = agent.process(uris);
-               agent.waitFor(processUuid, timeout);
-               return processUuid;
+               if (SecurityContextHolder.getContext().getAuthentication() == null) {
+                       OsAuthenticationToken oat = new OsAuthenticationToken();
+                       Authentication authentication = authenticationManager
+                                       .authenticate(oat);
+                       SecurityContextHolder.getContext()
+                                       .setAuthentication(authentication);
+               }
+
+               if (args.length > 0 && args[0].equals("help")) {
+                       StringBuilder buf = new StringBuilder();
+                       help(args, buf);
+                       log.info("\n" + buf);
+                       return buf.toString();
+               } else {
+                       List<URI> uris = asURIs(args);
+                       String processUuid = agent.process(uris);
+                       agent.waitFor(processUuid, timeout);
+                       return processUuid;
+               }
+       }
+
+       protected void help(String[] rawArgs, StringBuilder buf) {
+               String[] args = Arrays.copyOfRange(rawArgs, 1, rawArgs.length);
+               if (args.length == 0) {// modules
+                       for (ExecutionModuleDescriptor emd : agent
+                                       .listExecutionModuleDescriptors()) {
+                               appendModule(emd, buf);
+                       }
+               } else if (args.length == 1 && !args[0].contains("/")) {// single module
+                       NameVersion nameVersion = new BasicNameVersion(args[0]);
+                       ExecutionModuleDescriptor emd = agent.getExecutionModuleDescriptor(
+                                       nameVersion.getName(), nameVersion.getVersion());
+                       appendModule(emd, buf);
+
+                       // flows
+                       for (ExecutionFlowDescriptor efd : emd.getExecutionFlows()) {
+                               buf.append(" ").append(efd.getName());
+                               if (efd.getDescription() != null
+                                               && !efd.getDescription().trim().equals(""))
+                                       buf.append(" : ").append(" ").append(efd.getDescription());
+                               buf.append('\n');
+                       }
+                       return;
+               } else {
+                       List<URI> uris = asURIs(args);
+                       for (URI uri : uris) {
+                               appendUriHelp(uri, buf);
+                       }
+               }
+       }
+
+       protected void appendUriHelp(URI uri, StringBuilder buf) {
+               String[] path = uri.getPath().split("/");
+               NameVersion nameVersion = new BasicNameVersion(path[1]);
+               ExecutionModuleDescriptor emd = agent.getExecutionModuleDescriptor(
+                               nameVersion.getName(), nameVersion.getVersion());
+
+               StringBuilder flow = new StringBuilder();
+               for (int i = 2; i < path.length; i++)
+                       flow.append('/').append(path[i]);
+               String flowPath = flow.toString();
+               ExecutionFlowDescriptor efd = findExecutionFlowDescriptor(emd, flowPath);
+               if (efd == null)
+                       throw new SlcException("Flow " + uri + " not found");
+
+               appendModule(emd, buf);
+
+               buf.append(" ").append(efd.getName());
+               if (efd.getDescription() != null
+                               && !efd.getDescription().trim().equals(""))
+                       buf.append(" : ").append(" ").append(efd.getDescription());
+               buf.append('\n');
+               Map<String, Object> values = DefaultAgent.getQueryMap(uri.getQuery());
+               ExecutionSpec spec = efd.getExecutionSpec();
+               for (String attrKey : spec.getAttributes().keySet()) {
+                       ExecutionSpecAttribute esa = spec.getAttributes().get(attrKey);
+                       buf.append("  --").append(attrKey);
+                       if (values.containsKey(attrKey))
+                               buf.append(" ").append(values.get(attrKey));
+                       if (esa.getValue() != null)
+                               buf.append(" (").append(esa.getValue()).append(')');
+                       buf.append('\n');
+               }
+       }
+
+       private void appendModule(ExecutionModuleDescriptor emd, StringBuilder buf) {
+               buf.append("# ").append(emd.getName());
+               if (emd.getDescription() != null
+                               && !emd.getDescription().trim().equals(""))
+                       buf.append(" : ").append(emd.getDescription());
+               if (emd.getVersion() != null)
+                       buf.append(" (v").append(emd.getVersion()).append(")");
+               buf.append('\n');
        }
 
        public static List<URI> asURIs(String[] args) {
@@ -49,14 +149,17 @@ public class DefaultAgentCli implements SlcAgentCli {
                                                currUri.append(URLEncoder.encode(arg, UTF8));
                                                currKey = null;
                                        } else { // module
-                                               if (currUri != null)
+                                               if (currUri != null) {
                                                        uris.add(new URI(currUri.toString()));
+                                               }
                                                currUri = new StringBuilder("flow:");
 
                                                String currModule = arg;
                                                currUri.append('/').append(currModule);
                                                if (!arg.contains("/")) {
                                                        // flow path not in arg go to next arg
+                                                       if (!argIt.hasNext())
+                                                               throw new SlcException("No flow found");
                                                        String currFlow = argIt.next();
                                                        if (!currFlow.startsWith("/"))
                                                                currFlow = "/" + currFlow;
@@ -67,6 +170,16 @@ public class DefaultAgentCli implements SlcAgentCli {
                                        if (currUri == null) {// first args
                                                leftOvers.add(arg);
                                        } else {
+                                               String key;
+                                               if (arg.startsWith("--"))
+                                                       key = arg.substring(2);
+                                               else if (arg.startsWith("-"))
+                                                       key = arg.substring(1);
+                                               else {
+                                                       throw new SlcException("Cannot intepret key: "
+                                                                       + arg);
+                                               }
+
                                                if (!hasArgs) {
                                                        currUri.append('?');
                                                        hasArgs = true;
@@ -80,14 +193,6 @@ public class DefaultAgentCli implements SlcAgentCli {
                                                        currKey = null;
                                                }
 
-                                               String key;
-                                               if (arg.startsWith("--"))
-                                                       key = arg.substring(2);
-                                               else if (arg.startsWith("-"))
-                                                       key = arg.substring(1);
-                                               else
-                                                       throw new SlcException("Cannot intepret key: "
-                                                                       + arg);
                                                currKey = key;
                                                currUri.append(URLEncoder.encode(key, UTF8))
                                                                .append('=');
@@ -103,6 +208,24 @@ public class DefaultAgentCli implements SlcAgentCli {
                }
        }
 
+       private ExecutionFlowDescriptor findExecutionFlowDescriptor(
+                       ExecutionModuleDescriptor emd, String flowPath) {
+               ExecutionFlowDescriptor flowDescriptor = null;
+               for (ExecutionFlowDescriptor efd : emd.getExecutionFlows()) {
+                       String name = efd.getName();
+                       // normalize name as flow path
+                       if (!name.startsWith("/"))
+                               name = "/" + name;
+                       if (name.endsWith("/"))
+                               name = name.substring(0, name.length() - 1);
+                       if (name.equals(flowPath)) {
+                               flowDescriptor = efd;
+                               break;
+                       }
+               }
+               return flowDescriptor;
+       }
+
        public void setAgent(SlcAgent agent) {
                this.agent = agent;
        }