You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by ch...@apache.org on 2013/03/10 16:43:04 UTC

svn commit: r1454866 [4/4] - /uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java?rev=1454866&r1=1454865&r2=1454866&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccletSubmit.java Sun Mar 10 15:43:03 2013
@@ -18,22 +18,12 @@
 */
 package org.apache.uima.ducc.cli;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.lang.management.ManagementFactory;
 import java.util.ArrayList;
 import java.util.Properties;
 
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.OptionBuilder;
-import org.apache.commons.cli.Options;
-import org.apache.uima.ducc.common.crypto.Crypto;
-import org.apache.uima.ducc.common.utils.DuccPropertiesResolver;
 import org.apache.uima.ducc.transport.event.SubmitServiceDuccEvent;
 import org.apache.uima.ducc.transport.event.SubmitServiceReplyDuccEvent;
 import org.apache.uima.ducc.transport.event.cli.ServiceRequestProperties;
-import org.apache.uima.ducc.transport.event.cli.ServiceSpecificationProperties;
-import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;
 
 
 /**
@@ -51,14 +41,57 @@ public class DuccletSubmit 
     int pid = -1;
     ServiceRequestProperties serviceRequestProperties;
 
+    UiOption[] opts = new UiOption[] {
+        UiOption.Help,
+        UiOption.Debug, 
+        UiOption.Description,
+        UiOption.LogDirectory,
+        UiOption.ProcessAttachConsole,
+        UiOption.ProcessEnvironment,
+        UiOption.ProcessExecutable,
+        UiOption.ProcessExecutableArgs,
+        UiOption.ProcessFailuresLimit,
+        UiOption.ProcessMemorySize,
+        UiOption.SchedulingClass,
+        UiOption.Specification,
+        UiOption.WorkingDirectory,
+    };
+
+
     public DuccletSubmit(String[] args)
         throws Exception
     {
+        this(args, null);
+    }
+        
+    public DuccletSubmit(ArrayList<String> args)
+        throws Exception
+    {
+        this(args, null);
+    }
+        
+    public DuccletSubmit(Properties props)
+        throws Exception
+    {
+        this(props, null);
+    }
+
+    public DuccletSubmit(String[] args, IConsoleCallback consoleCb)
+        throws Exception
+    {
+        serviceRequestProperties = new ServiceRequestProperties();        
+        init(this.getClass().getName(), opts, args, serviceRequestProperties, or_host, or_port, "or", consoleCb);
+    }
+        
+    public DuccletSubmit(ArrayList<String> args, IConsoleCallback consoleCb)
+        throws Exception
+    {
+        String[] arg_array = args.toArray(new String[args.size()]);
         serviceRequestProperties = new ServiceRequestProperties();        
-        init(args, serviceRequestProperties, or_host, or_port, "or");
+        init(this.getClass().getName(), opts, arg_array, serviceRequestProperties, or_host, or_port, "or", consoleCb);
     }
         
-    public DuccletSubmit(Properties props) 
+    public DuccletSubmit(Properties props, IConsoleCallback consoleCb) 
         throws Exception
     {
         serviceRequestProperties = new ServiceRequestProperties();
@@ -68,213 +101,23 @@ public class DuccletSubmit 
             Object v = props.get(k);
             serviceRequestProperties.put(k, v);
         }
-        init(null, props, or_host, or_port, "or");
+        init(this.getClass().getName(), opts, null, serviceRequestProperties, or_host, or_port, "or", consoleCb);
     }
-        
-    @SuppressWarnings("static-access")
-    void addOptions(Options options) {
-        options.addOption(OptionBuilder
-                .withDescription(DuccUiConstants.desc_help).hasArg(false)
-                .withLongOpt(DuccUiConstants.name_help).create());
-
-        options.addOption(OptionBuilder
-                .withDescription(DuccUiConstants.desc_debug).hasArg(false)
-                .withLongOpt(DuccUiConstants.name_debug).create());
-
-        options.addOption(OptionBuilder
-                .withArgName(DuccUiConstants.parm_description)
-                .withDescription(makeDesc(DuccUiConstants.desc_description,DuccUiConstants.exmp_description)).hasArg()
-                .withLongOpt(DuccUiConstants.name_description).create());
-
-        options.addOption(OptionBuilder
-                .withArgName(DuccUiConstants.parm_scheduling_class)
-                .withDescription(makeDesc(DuccUiConstants.desc_scheduling_class,DuccUiConstants.exmp_scheduling_class)).hasArg()
-                .withLongOpt(DuccUiConstants.name_scheduling_class).create());
-
-        options.addOption(OptionBuilder
-                .withArgName(DuccUiConstants.parm_log_directory)
-                .withDescription(makeDesc(DuccUiConstants.desc_log_directory,DuccUiConstants.exmp_log_directory)).hasArg()
-                .withLongOpt(DuccUiConstants.name_log_directory).create());
-
-        options.addOption(OptionBuilder
-                .withArgName(DuccUiConstants.parm_working_directory)
-                .withDescription(makeDesc(DuccUiConstants.desc_working_directory,DuccUiConstants.exmp_working_directory)).hasArg()
-                .withLongOpt(DuccUiConstants.name_working_directory).create());
-
-        options.addOption(OptionBuilder
-                .withArgName(DuccUiConstants.parm_process_environment)
-                .withDescription(makeDesc(DuccUiConstants.desc_process_environment,DuccUiConstants.exmp_process_environment)).hasArg()
-                .withLongOpt(DuccUiConstants.name_process_environment).create());
-
-        options.addOption(OptionBuilder
-                .withArgName(DuccUiConstants.parm_process_memory_size)
-                .withDescription(makeDesc(DuccUiConstants.desc_process_memory_size,DuccUiConstants.exmp_process_memory_size)).hasArg()
-                .withLongOpt(DuccUiConstants.name_process_memory_size).create());
-
-        options.addOption(OptionBuilder
-                .withArgName(DuccUiConstants.parm_process_failures_limit)
-                .withDescription(makeDesc(DuccUiConstants.desc_process_failures_limit,DuccUiConstants.exmp_process_failures_limit)).hasArg()
-                .withLongOpt(DuccUiConstants.name_process_failures_limit).create());
-
-		options.addOption(OptionBuilder
-                          .withArgName    (DuccUiConstants.parm_specification)
-                          .withDescription(DuccUiConstants.desc_specification)
-                          .hasArg         (true)
-                          .withLongOpt    (DuccUiConstants.name_specification)
-                          .create         ()
-                          );
-
-        options.addOption(OptionBuilder
-                          .withDescription(DuccUiConstants.desc_process_attach_console)
-                          .hasOptionalArg ()
-                          .withLongOpt    (DuccUiConstants.name_process_attach_console)
-                          .create         ()
-                          );
-
-        options.addOption(OptionBuilder
-                          .withArgName    (DuccUiConstants.parm_process_executable)
-                          .withDescription(makeDesc(DuccUiConstants.desc_process_executable,DuccUiConstants.exmp_process_executable)).hasArg()
-                          .withLongOpt    (DuccUiConstants.name_process_executable)
-                          .hasArg         (true)
-                          .create         ()
-                          );
-
-        options.addOption(OptionBuilder
-                          .withArgName    (DuccUiConstants.parm_process_executable_args)
-                          .withDescription(makeDesc(DuccUiConstants.desc_process_executable_args,DuccUiConstants.exmp_process_executable_args))
-                          .hasArgs        ()
-                          .withLongOpt    (DuccUiConstants.name_process_executable_args)
-                          .create         ()
-                          );
 
-    }
-                
+                        
     public boolean execute() throws Exception 
     {
-        /*
-         * parser is not thread safe?
-         */
-        synchronized(DuccUi.class) {
 
-            /*
-             * marshal user
-             */
-            String user = DuccUiUtilities.getUser();
-            serviceRequestProperties.setProperty(ServiceSpecificationProperties.key_user, user);
-            String property = DuccPropertiesResolver.getInstance().getProperty(DuccPropertiesResolver.ducc_signature_required);
-            if(property != null) {
-                String signatureRequiredProperty = property.trim().toLowerCase();
-                if(signatureRequiredProperty.equals("on")) {
-                    Crypto crypto = new Crypto(System.getProperty("user.home"));
-                    byte[] cypheredMessage = crypto.encrypt(user);
-                    serviceRequestProperties.put(ServiceSpecificationProperties.key_signature, cypheredMessage);
-                }
-            }
-            /*
-             * marshal command line options into properties
-             */
-            Option[] optionList = commandLine.getOptions();
-            // pass 1
-            for (int i=0; i<optionList.length; i++) {
-                Option option = optionList[i];
-                String name = option.getLongOpt();
-                if(name.equals(SpecificationProperties.key_specification)) {
-                    File file = new File(option.getValue());
-                    FileInputStream fis = new FileInputStream(file);
-                    serviceRequestProperties.load(fis);
-                }
-            }
-
-            DuccUiUtilities.trimProperties(serviceRequestProperties);
-            // pass 2
-            for (int i=0; i<optionList.length; i++) {
-                Option option = optionList[i];
-                String name = option.getLongOpt();
-
-                String value = null;
-                if ( option.hasArgs() ) {        // if multiple args, make into blank-delimited string for the props file
-                    String[] arglist = commandLine.getOptionValues(name);
-                    int len = arglist.length;
-                    StringBuffer sb = new StringBuffer();
-                    for ( int ii = 0; ii < len; ii++ ) {
-                        String a = arglist[ii].trim();
-                        if ( a.equals("") ) continue;
-                        sb.append(a);
-                        if ( ii < (len-1) ) {
-                            sb.append(", ");
-                        }
-                    }
-                    value = sb.toString();
-                } else {
-                    value = option.getValue();
-                }
-
-                if(value == null) {
-                    value = "";
-                }
-
-                name = trimmer(name);
-                value = trimmer(value);
-                setProperty(name, value);
-            }
-        }
+        // These must be enforced for "ducclets"
+        serviceRequestProperties.setProperty(UiOption.ProcessThreadCount.pname(), "1");
+        serviceRequestProperties.setProperty(UiOption.ProcessDeploymentsMax.pname(), "1");     
+        serviceRequestProperties.put(UiOption.ServiceTypeOther.pname(), "");
         
         /*
-         * make sure the logdir is actually legal.
-         */
-        String log_directory = getLogDirectory(serviceRequestProperties);
-        if ( log_directory == null ) {    // on failure, the internal errors are already set
-            return false;
-        }
-
-        // tack on "services" or "processes" to complete logging directory
-        if(log_directory.endsWith(File.separator)) {
-            log_directory = log_directory + "processes";
-        } else {
-            log_directory = log_directory + File.separator + "processes";
-        }
-        serviceRequestProperties.setProperty("log_directory", log_directory);
-
-        /*
-         * employ default working directory if not specified
-         */
-        String working_directory = serviceRequestProperties.getProperty(ServiceRequestProperties.key_working_directory);
-        if(working_directory == null) {
-            working_directory = System.getProperty("user.dir");
-            serviceRequestProperties.setProperty(ServiceRequestProperties.key_working_directory,working_directory);
-        }
-
-        // These must be enforce so OR doesn't complain
-        serviceRequestProperties.setProperty(DuccUiConstants.name_process_thread_count, "1");
-        serviceRequestProperties.setProperty(DuccUiConstants.name_process_deployments_max, "1");     
-
-        serviceRequestProperties.put(ServiceRequestProperties.key_service_type_other, "");
-        
-        if(serviceRequestProperties.containsKey(DuccUiConstants.name_debug)) {
-            serviceRequestProperties.dump();
-        }
-
-        /*
          * set DUCC_LD_LIBRARY_PATH in process environment
          */
-        adjustLdLibraryPath(serviceRequestProperties, ServiceRequestProperties.key_process_environment);
-
-        /*
-         * identify invoker
-         */
-        serviceRequestProperties.setProperty(ServiceRequestProperties.key_submitter_pid_at_host, ManagementFactory.getRuntimeMXBean().getName());
+        adjustLdLibraryPath(serviceRequestProperties, UiOption.ProcessEnvironment.pname());
 
-        console_attach =
-            serviceRequestProperties.containsKey(DuccUiConstants.name_process_attach_console);
-
-        if ( console_attach ) {
-            try {
-                startConsoleListener();            
-            } catch ( Throwable t ) {
-                throw new IllegalStateException("Cannot start console listener.  Reason:" + t.getMessage());
-            }
-            set_console_port(serviceRequestProperties, DuccUiConstants.name_process_environment);
-		}
 
         SubmitServiceDuccEvent ev = new SubmitServiceDuccEvent(serviceRequestProperties);
         SubmitServiceReplyDuccEvent reply = null;
@@ -294,20 +137,20 @@ public class DuccletSubmit 
         boolean retval = true;
         Properties properties = reply.getProperties();
         @SuppressWarnings("unchecked")
-		ArrayList<String> or_warnings = (ArrayList<String>) properties.get(ServiceSpecificationProperties.key_submit_warnings);
+		ArrayList<String> or_warnings = (ArrayList<String>) properties.get(UiOption.SubmitWarnings.pname());
         if (or_warnings != null) {
             addWarnings(or_warnings);
         }
 
         @SuppressWarnings("unchecked")
-        ArrayList<String> or_errors = (ArrayList<String>) properties.get(ServiceSpecificationProperties.key_submit_errors);
+        ArrayList<String> or_errors = (ArrayList<String>) properties.get(UiOption.SubmitErrors.pname());
         if(or_errors != null) {
             addErrors(or_errors);
             retval = false;
         }
 
         if ( retval ) {
-            String pid = reply.getProperties().getProperty(ServiceRequestProperties.key_id);
+            String pid = reply.getProperties().getProperty(UiOption.JobId.pname());
             if (pid == null ) {
                 retval = false;
             } else {
@@ -315,7 +158,8 @@ public class DuccletSubmit 
                 if ( friendlyId < 0 ) {
                     retval = false;
                 } else {
-                    saveSpec(pid, "process.properties", serviceRequestProperties);
+                    saveSpec("process.properties", serviceRequestProperties);
+                    startMonitors();       // starts conditionally, based on job spec and console listener present
                 }
             }
         }
@@ -327,7 +171,7 @@ public class DuccletSubmit 
     {
         try {
             // Instantiate the object with args similar to the CLI, or a pre-built properties file
-            DuccletSubmit ds = new DuccletSubmit(args);            
+            DuccletSubmit ds = new DuccletSubmit(args);
 
             // Run the API.  If process_attach_console was specified in the args, a console listener is
             // started but this call does NOT block on it.
@@ -361,12 +205,8 @@ public class DuccletSubmit 
                 
                 // Fetch the Ducc ID
             	System.out.println("Process " + ds.getDuccId() + " submitted.");
-
-                // If there is a console listener, you can block now
-                if ( ds.isConsoleAttached() ) {
-                    ds.waitForCompletion();
-                }
-
+                ds.waitForCompletion();
+                System.out.println("Job return code: " + ds.getReturnCode());
             	System.exit(0);
             } else {
                 System.out.println("Could not submit process");

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IConsoleCallback.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IConsoleCallback.java?rev=1454866&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IConsoleCallback.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IConsoleCallback.java Sun Mar 10 15:43:03 2013
@@ -0,0 +1,7 @@
+package org.apache.uima.ducc.cli;
+
+public interface IConsoleCallback
+{
+    public void stdout(String host, String filename, String msg);
+    public void stderr(String host, String filename, String msg);
+}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IServiceApi.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IServiceApi.java?rev=1454866&r1=1454865&r2=1454866&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IServiceApi.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IServiceApi.java Sun Mar 10 15:43:03 2013
@@ -154,7 +154,7 @@ public interface IServiceApi
         },            
 
         ServicePingDoLog { 
-            public String decode()      { return "service_ping_do_log"; }
+            public String decode()      { return "service_ping_dolog"; }
             public String description() { return "If specified, log the pinger, else suppress the log."; }
             public String argname()     { return "none"; }
         },            

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java?rev=1454866&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/IUiOptions.java Sun Mar 10 15:43:03 2013
@@ -0,0 +1,813 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.uima.ducc.cli;
+
+import org.apache.uima.ducc.common.jd.plugin.IJdProcessExceptionHandler;
+import org.apache.uima.ducc.transport.event.cli.JobReplyProperties;
+import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
+import org.apache.uima.ducc.transport.event.cli.JobSpecificationProperties;
+import org.apache.uima.ducc.transport.event.cli.ReservationRequestProperties;
+import org.apache.uima.ducc.transport.event.cli.ReservationSpecificationProperties;
+import org.apache.uima.ducc.transport.event.cli.ServiceRequestProperties;
+
+/**
+ * These are the constants supported by the 'not-using-a-props-file' form of registration in DuccServiceApi.
+ * 
+ * There are here so that hopefully we can avoid touching anything in common or transport when updating
+ * the registration parameters.
+ */
+
+public interface IUiOptions
+{
+    //
+    // decode() mean convert the enum into the string the user uses
+    // encode() means take the user's string and turn it into th enum
+    // description() is a short description of the option for the commons cli parser
+    // argname()     is a name for the argument for the usage() part of cli parser
+    //
+
+
+
+    public enum UiOption
+    {
+        CancelJobOnInterrupt { 
+            public String pname()       { return "cancel_job_on_interrupt"; }
+            public String argname()     { return null; }
+            public String description() { return "Cancel job on interrupt (Ctrl-C); only possible when --" + WaitForCompletion.pname() +" is also specified."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ClasspathOrder { 
+            public String pname()       { return JobSpecificationProperties.key_classpath_order; }
+            public String argname()     { return ClasspathOrderParms.UserBeforeDucc.name() + " or " + ClasspathOrderParms.DuccBeforeUser.name(); }
+            public String description() { return "Specify user-supplied classpath before DUCC-supplied classpath, or the reverse."; }
+            public String example()     { return null; }
+            public String deflt()       { return ClasspathOrderParms.UserBeforeDucc.name(); }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        Debug { 
+            public String pname()       { return "debug"; }
+            public String argname()     { return null; }
+            public String description() { return "Enable CLI Debugging messages."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        DjPid { 
+            public String pname()       { return JobRequestProperties.key_dpid; }
+            public String argname()     { return "number"; }
+            public String description() { return "DUCC Process Id.  If specified only this DUCC process will be canceled.  If not specified, then entire job will be canceled.";}
+            public String example()     { return "22"; }
+            public String deflt()       { return null; }
+            public String label()       { return "Ducc Process Id"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        DriverDebug { 
+            public String pname()       { return "driver_debug"; }
+            public String argname()     { return "debugger-port-number"; }
+            public String description() { return "Append JVM debug flags to the jvm arguments to start the JobDriver in remote debug mode."; }
+            public String example()     { return "driver_debug 8001"; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessDebug"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        Description { 
+            public String pname()       { return JobSpecificationProperties.key_description; }
+            public String argname()     { return "string"; }
+            public String description() { return "Description of the run."; }
+            public String example()     { return "--description My excellent job!"; }
+            public String deflt()       { return null; }
+            public String label()       { return "Description"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        DriverAttachConsole { 
+            public String pname()       { return "driver_attach_console"; }
+            public String argname()     { return null; }
+            public String description() { return "If specified, redirect remote job driver stdout and stderr to the local submitting console."; }
+            public String example()     { return null; }
+            public String deflt()       { return "Do not redirect the console"; }
+            public String label()       { return "DriverAttachConsole"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        DriverClasspath { 
+            public String pname()       { return JobSpecificationProperties.key_driver_classpath; }
+            public String description() { return "Classpath for the Job driver. Default is current classpath."; }
+            public String argname()     { return "java classpath"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return "DriverClassPath"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        DriverDescriptorCR { 
+            public String pname()       { return JobSpecificationProperties.key_driver_descriptor_CR; }
+            public String description() { return "Driver (collection reader) descriptor."; }
+            public String argname()     { return "descriptor xml"; }
+            public String example()     { return "/home/" + System.getProperty("user.name") + "/descriptors/MyCR.xml"; }
+            public String deflt()       { return null; }
+            public String label()       { return "DriverDescriptorCR"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return true; }
+        },            
+
+        DriverDescriptorCROverrides { 
+            public String pname()       { return JobSpecificationProperties.key_driver_descriptor_CR_overrides; }
+            public String argname()     { return "list of overrides"; }
+            public String description() { return "Driver Collection Reader configuration parameter name/value pair overrides. Parameters must already be defined in the CR descriptor."; }
+            public String example()     { return "name1=value1,name2=\"value2a value2b value2c\",name3=value3..."; }
+            public String deflt()       { return null; }
+            public String label()       { return "DriverDescriptorCROverrides"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        DriverEnvironment { 
+            public String pname()       { return JobSpecificationProperties.key_driver_environment; }
+            public String argname()     { return "env vars"; }
+            public String description() { return "Blank-delimeted list of environment variables."; }
+            public String example()     { return "\"TERM=xterm DISPLAY=me.org.net:1.0\""; }
+            public String deflt()       { return null; }
+            public String label()       { return "DriverEnvironment"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        DriverExceptionHandler { 
+            public String pname()       { return JobSpecificationProperties.key_driver_exception_handler; }
+            public String description() { return "Driver Exception handler class.  Must implement "+IJdProcessExceptionHandler.class.getName(); }
+            public String argname()     { return "path.classname"; }
+            public String example()     { return "org.apache.uima.ducc.myProject.MyDriverExceptionHandler"; }
+            public String deflt()       { return "org.apache.uima.ducc.common.jd.plugin.JdProcessExceptionHandler"; }
+            public String label()       { return "DriverExceptionHandler"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        DriverJvmArgs { 
+            public String pname()       { return JobSpecificationProperties.key_driver_jvm_args; }
+            public String argname()     { return "jvm arguments"; }
+            public String description() { return "Blank-delimeted list of JVM Arguments passed to the job driver."; }
+            public String example()     { return "-Xmx100M -DMYVAR=foo"; }
+            public String deflt()       { return null; }
+            public String label()       { return "DriverJvmArgs"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        Help { 
+            public String pname()       { return "help"; }
+            public String argname()     { return null; }
+            public String description() { return "Print this help message"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        JobId { 
+            public String pname()       { return JobRequestProperties.key_id; }
+            public String argname()     { return "string"; }
+            public String description() { return "The id of the job"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return true; }
+        },            
+
+        Jvm { 
+            public String pname()       { return JobSpecificationProperties.key_jvm; }
+            public String argname()     { return "path-name-to-java"; }
+            public String description() { return "The jvm to use.  Must be a full path to the 'java' executable.  Default is\n   the jvm that DUCC is using."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return "Jvm"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        LogDirectory { 
+            public String pname()       { return JobSpecificationProperties.key_log_directory; }
+            public String argname()     { return "path"; }
+            public String description() { return "The directory where logs are written.  Default: $HOME/ducc/logs"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return "LogDirectory"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        Message { 
+            public String pname()       { return JobReplyProperties.key_message; }
+            public String argname()     { return "string"; }
+            public String description() { return "Orchestrator response string - internally generated."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        NumberOfInstances { 
+            public String pname()       { return ReservationSpecificationProperties.key_number_of_instances; }
+            public String argname()     { return "integer"; }
+            public String description() { return "Number of instances to reserve"; }
+            public String example()     { return "1"; }
+            public String deflt()       { return "1"; }
+            public String label()       { return "Number of instances"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServicePingClass { 
+            public String pname()       { return "service_ping_class"; }
+            public String argname()     { return "classname"; }
+            public String description() { return "Class to ping ervice, must extend AServicePing.java"; }
+            public String example()     { return "org.bob.Pinger"; }
+            public String deflt()       { return ""; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServicePingClasspath { 
+            public String pname()       { return "service_ping_classpath"; }
+            public String argname()     { return "classpath"; }
+            public String description() { return "Classpath containing service_custom_ping class and dependencies."; }
+            public String example()     { return "Bob.jar"; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServicePingJvmArgs { 
+            public String pname()       { return "service_ping_jvm_args"; }
+            public String argname()     { return "java-system-property-assignments"; }
+            public String description() { return "-D jvm system property assignments to pass to jvm"; }
+            public String example()     { return "-DxmX=3"; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServicePingTimeout { 
+            public String pname()       { return "service_ping_timeout"; }
+            public String argname()     { return "time-in-ms"; }
+            public String description() { return "Time in milliseconds to wait for a ping to the service."; }
+            public String example()     { return "1000"; }
+            public String deflt()       { return "500"; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServicePingDoLog { 
+            public String pname()       { return "service_ping_dolog"; }
+            public String argname()     { return "boolean"; }
+            public String description() { return "If specified, log the pinger, else suppress the log."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServiceTypeCustom { 
+            public String pname()       { return ServiceRequestProperties.key_service_type_custom; }
+            public String argname()     { return null; }
+            public String description() { return "Service type - internally generated"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServiceTypeOther { 
+            public String pname()       { return ServiceRequestProperties.key_service_type_other; }
+            public String argname()     { return null; }
+            public String description() { return "Service type - internally generated"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServiceTypeUima { 
+            public String pname()       { return ServiceRequestProperties.key_service_type_uima; }
+            public String argname()     { return null; }
+            public String description() { return "Service type - internally generated"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        SubmitPid { 
+            // generated
+            public String pname()       { return JobRequestProperties.key_submitter_pid_at_host; }
+            public String argname()     { return null; }
+            public String description() { return null; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessAttachConsole { 
+            public String pname()       { return "process_attach_console"; }
+            public String argname()     { return null; }
+            public String description() { return "If specified, redirect remote process stdout and stderr to the local submitting console."; }
+            public String example()     { return null; }
+            public String deflt()       { return "Do not redirect the console"; }
+            public String label()       { return "ProcessAttachConsole"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessDebug { 
+            public String pname()       { return "process_debug"; }
+            public String argname()     { return "debugger-port-number"; }
+            public String description() { return "Append JVM debug flags to the jvm arguments to start the Job Process in remobe debug mode."; }
+            public String example()     { return "--process_debug 8000"; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessDebug"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessClasspath { 
+            public String pname()       { return JobSpecificationProperties.key_process_classpath; }
+            public String description() { return "Classpath for each job process. Default is current classpath."; }
+            public String argname()     { return "java classpath"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return "processClassPath"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessDescriptorAE { 
+            public String pname()       { return JobSpecificationProperties.key_process_descriptor_AE; }
+            public String description() { return "Process Analysis Enginefor aggregate."; }
+            public String argname()     { return "descriptor xml"; }
+            public String example()     { return "/home/" + System.getProperty("user.name") + "/descriptors/MyAE.xml"; }
+            public String deflt()       { return null; }
+            public String label()       { return "DriverDescriptorAE"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessDescriptorAEOverrides { 
+            public String pname()       { return JobSpecificationProperties.key_process_descriptor_AE_overrides; }
+            public String argname()     { return "list of overrides"; }
+            public String description() { return "Process Analysis Engine configuration parameter name/value pair overrides. Parameters must already be defined in the AE descriptor."; }
+            public String example()     { return "name1=value1,name2=\"value2a value2b value2c\",name3=value3..."; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessDescriptorAEOverrides"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        ProcessDescriptorCC { 
+            public String pname()       { return JobSpecificationProperties.key_process_descriptor_CC; }
+            public String description() { return "Process CAS Consumer for aggregate."; }
+            public String argname()     { return "descriptor xml"; }
+            public String example()     { return "/home/" + System.getProperty("user.name") + "/descriptors/MyCC.xml"; }
+            public String deflt()       { return null; }
+            public String label()       { return "DriverDescriptorCC"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessDescriptorCCOverrides { 
+            public String pname()       { return JobSpecificationProperties.key_process_descriptor_CC_overrides; }
+            public String argname()     { return "list of overrides"; }
+            public String description() { return "Process CAS Consumer configuration parameter name/value pair overrides. Parameters must already be defined in the CC descriptor."; }
+            public String example()     { return "name1=value1,name2=\"value2a value2b value2c\",name3=value3..."; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessDescriptorCCOverrides"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessDescriptorCM { 
+            public String pname()       { return JobSpecificationProperties.key_process_descriptor_CM; }
+            public String description() { return "Process CAS Multiplier for aggregate."; }
+            public String argname()     { return "descriptor xml"; }
+            public String example()     { return "/home/" + System.getProperty("user.name") + "/descriptors/MyCM.xml"; }
+            public String deflt()       { return null; }
+            public String label()       { return "DriverDescriptorCM"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessDescriptorCMOverrides { 
+            public String pname()       { return JobSpecificationProperties.key_process_descriptor_CM_overrides; }
+            public String argname()     { return "list of overrides"; }
+            public String description() { return "Process CAS Multiplier configuration parameter name/value pair overrides. Parameters must already be defined in the CM descriptor."; }
+            public String example()     { return "name1=value1,name2=\"value2a value2b value2c\",name3=value3..."; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessDescriptorCMOverrides"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+
+        ProcessDD { 
+            public String pname()       { return JobSpecificationProperties.key_process_DD; }
+            public String description() { return "Process deployment descriptor (mutually exclusive with CM+AE+CC)."; }
+            public String argname()     { return "dd.xml"; }
+            public String example()     { return "/home/" + System.getProperty("user.name") + "/descriptors/MyDD.xml"; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessDD"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessDeploymentsMax { 
+            public String pname()       { return JobSpecificationProperties.key_process_deployments_max; }
+            public String description() { return "Maximum number of processes dispatched for this job at any time.."; }
+            public String argname()     { return "integer"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessDeploymentsMax"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        ProcessEnvironment { 
+            public String pname()       { return JobSpecificationProperties.key_process_environment; }
+            public String argname()     { return "environment-var-list"; }
+            public String description() { return "Blank delimeted list of Environment variables."; }
+            public String example()     { return "A=B MYENV=foo"; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessEnvironment"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessExecutable { 
+            public String pname()       { return JobSpecificationProperties.key_process_executable; }
+            public String argname()     { return "program name"; }
+            public String description() { return "The full path to a program to be executed."; }
+            public String example()     { return "/bin/ls"; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessExecutableArgs { 
+            public String pname()       { return JobSpecificationProperties.key_process_executable_args; }
+            public String argname()     { return "argument list"; }
+            public String description() { return "Blank-delimited list of arguments for " + ProcessExecutable.pname(); }
+            public String example()     { return "-a -t -l"; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessGetMetaTimeMax { 
+            public String pname()       { return JobSpecificationProperties.key_process_get_meta_time_max; }
+            public String description() { return "Maximum elapsed time (in minutes) for processing getMeta."; }
+            public String argname()     { return "integer"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        ProcessInitializationFailuresCap { 
+            public String pname()       { return JobSpecificationProperties.key_process_initialization_failures_cap; }
+            public String description() { return "Maximum number of independent job process initialization failures (i.e. System.exit(), kill-15...) before the number of Job Processes is capped at the number in state Running currently.  Default is " + deflt() + "."; }
+            public String argname()     { return "integer"; }
+            public String example()     { return null; }
+            public String deflt()       { return "99"; }
+            public String label()       { return "ProcessInitializationFailuresCap"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessFailuresLimit { 
+            public String pname()       { return JobSpecificationProperties.key_process_failures_limit; }
+            public String description() { return "Maximum number of independent job process failures (i.e. System.exit(), kill-15...) before job is terminated."; }
+            public String argname()     { return "integer"; }
+            public String example()     { return null; }
+            public String deflt()       { return "20"; }
+            public String label()       { return "ProcessFailuresLimit"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        ProcessJvmArgs { 
+            public String pname()       { return JobSpecificationProperties.key_process_jvm_args; }
+            public String argname()     { return "jvm arguments"; }
+            public String description() { return "Blank-delimeted list of JVM Arguments passed to each process"; }
+            public String example()     { return "-Xmx100M -DMYVAR=foo"; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessJvmArgs"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        ProcessMemorySize { 
+            public String pname()       { return JobSpecificationProperties.key_process_memory_size; }
+            public String argname()     { return "size-in-GB"; }
+            public String description() { return "Maximum memory for each process, in GB."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessMemorySize"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessThreadCount { 
+            public String pname()       { return JobSpecificationProperties.key_process_thread_count; }
+            public String description() { return "Number of pipelines per deployment (i.e. UIMA pipelines per UIMA-AS service copy)."; }
+            public String argname()     { return "integer"; }
+            public String example()     { return null; }
+            public String deflt()       { return "4"; }
+            public String label()       { return "ProcessThreadCount"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ProcessPerItemTimeMax { 
+            public String pname()       { return JobSpecificationProperties.key_process_per_item_time_max; }
+            public String description() { return "Maximum elapsed time (in minutes) for processing one CAS."; }
+            public String argname()     { return "integer"; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        Reason { 
+            // generated, not public
+            public String pname()       { return JobRequestProperties.key_reason; }
+            public String argname()     { return "quoted text"; }
+            public String description() { return "Reason for the cancel"; }
+            public String example()     { return "Back to the drawing board"; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ReservationMemorySize { 
+            public String pname()       { return ReservationSpecificationProperties.key_instance_memory_size; }
+            public String argname()     { return "size[KB|MB|GB|TB]"; }
+            public String description() { return "Size of instance's memory, defaults to GB if units omitted."; }
+            public String example()     { return "64GB"; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return true; }
+        },            
+
+        ReservationNodeList { 
+            // generated, not public
+            public String pname()       { return ReservationRequestProperties.key_node_list; }
+            public String argname()     { return "string"; }
+            public String description() { return "Set of nodes reserved - internall generated."; }
+            public String example()     { return "Back to the drawing board"; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        SchedulingClass { 
+            public String pname()       { return JobSpecificationProperties.key_scheduling_class; }
+            public String argname()     { return "scheduling class name"; }
+            public String description() { return "The class to run the job in."; }
+            public String example()     { return "A=B MYENV=foo"; }
+            public String deflt()       { return null; }
+            public String label()       { return "SchedulingClass"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return true; }
+        },            
+
+        ServiceLinger { 
+            public String pname()       { return "service_linger"; }
+            public String argname()     { return "seconds"; }
+            public String description() { return "Time in milliseconds to wait after last referring job or service exits before stopping a non-autostarted service."; }
+            public String example()     { return "--service_linger 1000"; }
+            public String deflt()       { return "300000"; } // 5 minutes
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServiceDependency { 
+            public String pname()       { return JobSpecificationProperties.key_service_dependency; }
+            public String argname()     { return "list"; }
+            public String description() { return "List of service descriptor strings."; }
+            public String example()     { return "UIMA-AS:RandomSleepAE:tcp://bluej672:61616 CUSTOM:myservice";}
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        ServiceRequestEndpoint { 
+            // registration option
+            public String pname()      { return ServiceRequestProperties.key_service_request_endpoint; }
+            public String argname()     { return "string"; }
+            public String description() { return "Unique id for this service. Usually inferred for UIMA-AS services."; }
+            public String example()     { return "UIMA-AS:queueName:ActiveMqUrl"; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        Signature { 
+            // generated, not public
+            public String pname()       { return JobSpecificationProperties.key_signature; }
+            public String argname()     { return null; }
+            public String description() { return null; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+        Specification { 
+            public String pname()       { return JobSpecificationProperties.key_specification; }
+            public String argname()     { return "file"; }
+            public String description() { return "Properties file comprising the specification, where the keys are names of parameters. Individual parameters take precedence over those specified in properties file, if any."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        SubmitErrors { 
+            // generated, not public
+            public String pname()       { return JobSpecificationProperties.key_submit_errors; }
+            public String argname()     { return null; }
+            public String description() { return null; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        SubmitWarnings { 
+            // generated, not public
+            public String pname()       { return JobSpecificationProperties.key_submit_warnings; }
+            public String argname()     { return null; }
+            public String description() { return null; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        Timestamp { 
+            public String pname()       { return "timestamp"; }
+            public String argname()     { return null; }
+            public String description() { return "Enables timestamp on monitor messages."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return "ProcessTimestamp"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        User { 
+            public String pname()       { return JobSpecificationProperties.key_user; };
+            public String argname()     { return "userid"; }
+            public String description() { return "Filled in (and overridden) by the CLI, the id of the submitting user."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return null; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        WaitForCompletion { 
+            public String pname()       { return "wait_for_completion"; }
+            public String argname()     { return null; }
+            public String description() { return "Do not exit until job is completed."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return name(); }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+
+
+        WorkingDirectory { 
+            public String pname()       { return JobSpecificationProperties.key_working_directory; }
+            public String argname()     { return "path"; }
+            public String description() { return "The working directory set in each process. Default to current directory."; }
+            public String example()     { return null; }
+            public String deflt()       { return null; }
+            public String label()       { return "WorkingDirectory"; }
+            public boolean multiargs()  { return false; }
+            public boolean required()   { return false; }
+        },            
+        ;
+                  
+        public abstract String  pname();            // name of the option, e.g.  --description
+        public abstract String  argname();          // type of its argument, or null if none
+        public abstract boolean multiargs();        // the option can have >1 arg
+        public abstract boolean required();         // this option is required
+        public abstract String  description();      // description of what it is
+        public abstract String  example();          // example of usage
+        public abstract String  deflt();            // defalt, or ""
+        public abstract String  label();            // Parameter name for label in web form
+
+        public String makeDesc()
+        {
+            if ( example() == null ) return description();
+            return description() + "\nexample: " + example();
+        }
+    };
+
+    public enum ClasspathOrderParms
+    {    	    	
+        UserBeforeDucc   { 
+            public String pname()      { return DuccUiConstants.classpath_order_user_before_ducc; } 
+            public String description() { return "Start process with user's classpath ahead of DUCC's"; }
+        },
+        DuccBeforeUser   { 
+            public String pname()      { return DuccUiConstants.classpath_order_ducc_before_user; } 
+            public String description() { return "Start process with DUCC's classpath ahead of user's"; }
+        },
+        Unknown {
+            public String pname()      { return "unknown"; }
+            public String description() { return "Illegal argument"; }
+        },
+        ;
+
+        public abstract String pname();
+        public abstract String description();
+
+   };
+
+}

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java?rev=1454866&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/MonitorListener.java Sun Mar 10 15:43:03 2013
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.uima.ducc.cli;
+
+import java.util.ArrayList;
+
+import org.apache.uima.ducc.cli.IUiOptions.UiOption;
+import org.apache.uima.ducc.common.utils.DuccProperties;
+
+
+class MonitorListener
+    implements Runnable
+{
+    CliBase        base  = null;
+    long           jobid = 0;
+    DuccProperties props = null;
+    boolean        quiet = false;
+
+    DuccJobMonitor monitor = null;
+
+    MonitorListener(CliBase base, long jobid, DuccProperties props, boolean quiet)
+    {
+        this.base  = base;
+        this.jobid = jobid;
+        this.props = props;
+        this.quiet = quiet;
+    }
+
+    public void run()
+    {
+        int retVal = 0;
+        try {
+            ArrayList<String> arrayList = new ArrayList<String>();
+            arrayList.add("--" + UiOption.JobId.pname());
+            arrayList.add(""+jobid);
+
+            if(props.containsKey(UiOption.Debug.pname())) {
+                arrayList.add("--" + UiOption.Debug.pname());
+            }
+
+            if(props.containsKey(DuccUiConstants.name_timestamp)) {
+                arrayList.add("--"+DuccUiConstants.name_timestamp);
+            }
+
+            if(props.containsKey(DuccUiConstants.name_submit_cancel_job_on_interrupt)) {
+                arrayList.add("--"+DuccUiConstants.name_monitor_cancel_job_on_interrupt);
+            }
+
+            String[] argList = arrayList.toArray(new String[0]);
+            monitor = new DuccJobMonitor(quiet);
+            retVal = monitor.run(argList);
+        } catch (Exception e) {
+            base.addMessage(e.getMessage());
+            retVal = DuccUiConstants.ERROR;
+        }
+        base.monitorExits(retVal);
+    }
+
+    void shutdown()
+    {
+        if ( monitor != null ) {
+            monitor.cancel();
+        }
+    }
+
+}