/*
 * 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.IErrorHandler;
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;
import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;

/*
 * 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
    //

    static final int help_width = 120;

    // 
    // NOTE regarding noargs() and optargs: if the option can occur in a properties file
    //      the option should be configured with 
    //         optargs  true
    //         deflt    "true"
    //              or
    //         deflt ""
    //      because the Java properties class will NPE if you have a key and no value. This
    //      Java restriction makes it hard to create a true boolean value.
    //      
    //      This doesn't matter if the properties is a file because the properties reader
    //      inserts a "" which we interpret as "no argument provided", but in the API,
    //      you want to provide a meaningful value, or no value, not "".
    //
    enum UiOption
        implements IUiOption
    {
        Administrators { 
            public String pname()       { return "administrators"; } 
            public String argname()     { return "list of ids"; } 
            public String description() { return "Blank-delimited list of userids allowed to manage this service."; } 
            public String example()     { return "bob mary jimbo"; }
        },
        
        
        AllInOne   { 
            public String pname()       { return "all_in_one"; } 
            public String argname()     { return "local|remote"; } 
            public String description() { return "Run driver and pipeline in single process."; } 
        },
        
        AttachConsole { 
            public String pname()       { return "attach_console"; }
            public boolean optargs()    { return true; }
            public String deflt()       { return "true"; }
            public String description() { return "If specified, redirect remote stdout and stderr to the local submitting console."; }
        },            

        Autostart   { 
            public String pname()       { return "autostart"; } 
            public String argname()     { return "boolean: true or false"; } 
            public String description() { return "If True, start the service when DUCC starts."; } 
        },

        CancelOnInterrupt { 
            public String pname()       { return SpecificationProperties.key_cancel_on_interrupt; }
            public boolean optargs()    { return true; }
            public String deflt()       { return "true"; }
            public String description() { return "Cancel on interrupt (Ctrl-C). Implies "+WaitForCompletion.pname(); }
        },       
        
        Classpath { 
            public String pname()       { return JobSpecificationProperties.key_classpath; }
            public String description() { return "Classpath for the Job. Default is current classpath."; }
            public String argname()     { return "java classpath"; }
        },    
        
        Debug { 
            public String pname()       { return "debug"; }
            public boolean noargs()     { return true; }
            public String description() { return "Enable CLI Debugging messages."; }
        },            

        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"; }
        },            

        DriverDebug { 
            public String pname()       { return "driver_debug"; }
            public String argname()     { return "debugger-port-number"; }
            public String description() { return "Listening port number the remote driver process is to connect to."; }
            public String example()     { return "8001"; }
        },            

        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 "My excellent job!"; }
            public String deflt()       { return "[Empty Description]"; }
        },            

        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 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..."; }
        },            

        DriverExceptionHandler { 
            public String pname()       { return JobSpecificationProperties.key_driver_exception_handler; }
            public String description() { return "Driver exception handler class.  Must implement "+IErrorHandler.class.getName(); }
            public String argname()     { return "classname"; }
            public String example()     { return "org.myOrg.myProject.MyErrorHandler"; }
        },  
        
        DriverExceptionHandlerArguments { 
            public String pname()       { return JobSpecificationProperties.key_driver_exception_handler_arguments; }
            public String argname()     { return "list of arguments"; }
            public String description() { return "Blank-delimited list of arguments to be passed to the built-in or custom exception handler.  The example gives the defaults for the built-in exception handler."; }
            public String example()     { return "max_job_errors=15 max_timeout_retrys_per_workitem=0"; }
        },  

        DriverJvmArgs { 
            public String pname()       { return JobSpecificationProperties.key_driver_jvm_args; }
            public String argname()     { return "jvm arguments"; }
            public String description() { return "Blank-delimited list of JVM Arguments passed to the job driver."; }
            public String example()     { return "-Xmx100M -DMYVAR=foo"; }
        },    
        
        Environment { 
            public String pname()       { return JobSpecificationProperties.key_environment; }
            public String argname()     { return "env vars"; }
            public String description() { return "Blank-delimited list of environment variables."; }
            public String example()     { return "TERM=xterm DISPLAY=me.org.net:1.0 LANG UIMA*"; }
        },   
        
        Help { 
            public String pname()       { return "help"; }
            public boolean noargs()     { return true; }            
            public String description() { return "Print this help message"; }
        },            

        Instances   { 
            public String pname()       { return "instances"; } 
            public String argname()     { return "integer"; } 
            public String description() { return "Number of service processes."; } 
        },
        
        InstanceFailureLimit { 
            public String pname()       { return "instance_failures_limit"; }
            public String description() { return "Number of consecutive instance failures that will cause the service to be stopped."; }
            public String argname()     { return "integer"; }
        },   

        InstanceInitFailureLimit { 
            public String pname()       { return "instance_init_failures_limit"; }
            public String description() { return "Number of consecutive instance initialization failures that will cause SM to cease starting the service."; }
            public String argname()     { return "integer"; }
        },   

        InstanceFailureWindow { 
            public String pname()       { return "instance_failures_window"; }
            public String argname()     { return "integer"; }
            public String description() { return "Size of the window (in minutes) used to manage service instance runtime failures."; }
            public String example()     { return "30"; }
        },            

        JobId { 
            public String pname()       { return JobRequestProperties.key_id; }
            public String argname()     { return "string"; }
            public String description() { return "The id of the job"; }
            public boolean required()   { return true; }
        },
        
        ManagedReservationId { 
            public String pname()       { return JobRequestProperties.key_id; }
            public String argname()     { return "string"; }
            public String description() { return "The id of the managed reservation"; }
            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 the jvm that DUCC is using."; }
            public String example()     { return "/opt/vendor/jdk-1.7/bin/java"; }
        },            

        LogDirectory { 
            public String pname()       { return JobSpecificationProperties.key_log_directory; }
            public String argname()     { return "path"; }
            public String description() { return "The directory where logs are written."; }
            public String deflt()       { return "${HOME}/ducc/logs"; }
        },            

        Message { 
            public String pname()       { return JobReplyProperties.key_message; }
            public String argname()     { return "string"; }
            public String description() { return "Orchestrator response string - internally generated."; }
        },            

        Modify    { 
             public String pname()      { return "modify"; } 
             public String argname()     { return "service-id-or-endpoint" ; } 
             public String description() { return "Modify meta properties for a registered service." ; } 
             public boolean required()   { return true; }
        },

        /*
		@Deprecated
        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"; }
        },  
        */
        
        Quiet { 
            public String pname()       { return "quiet"; }
            public String argname()     { return null; }
            public boolean optargs()    { return true; }
            public String deflt()       { return "true"; }
            public String description() { return "Disable CLI Informational messages."; }
        },  
        
        Register    { 
            public String pname()       { return "register"; } 
            public String argname()     { return "specification-file"; } 
            public boolean optargs()    { return true; }
            public String deflt()       { return ""; }    // No specification file
            public String description() { return "Register a service."; } 
        },

        ReservationId { 
            public String pname()       { return JobRequestProperties.key_id; }
            public String argname()     { return "string"; }
            public String description() { return "The id of the reservation"; }
            public boolean required()   { return true; }
        },    
        
        ServicePingArguments { 
            public String pname()       { return "service_ping_arguments"; }
            public String argname()     { return "string"; }
            public String description() { return "Any (service-dependent) ping arguments, to be passed to the pinger."; }
            public String example()     { return "q_thresh=12,svc_thresh=.01"; }
        },            

        ServiceId {                     // for use only by SM when spawing a service 
            public String pname()       { return "service_id"; }
            public String argname()     { return "number"; }
            public String description() { return "The numeric id of the service being spawned"; }
            public String example()     { return "123"; }
        },            

        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"; }
        },            

        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"; }
        },            

        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=3G -DxnS=1M"; }
        },            

        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 deflt()       { return "500"; }   
            // Avoid warning about ignored argument when using default pinger (but most ping arguments ignored for all internal pingers!)
        },            

        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."; }
        },            

        ServiceTypeCustom { 
            public String pname()       { return ServiceRequestProperties.key_service_type_custom; }
            public String argname()     { return null; }
            public boolean optargs()    { return true; }
            public String description() { return "Service type - internally generated"; }
        },            

        ServiceTypeOther { 
            public String pname()       { return ServiceRequestProperties.key_service_type_other; }
            public String argname()     { return null; }
            public boolean optargs()    { return true; }
            public String description() { return "Service type - internally generated"; }
        },            

        ServiceTypeUima { 
            public String pname()       { return ServiceRequestProperties.key_service_type_uima; }
            public String argname()     { return null; }
            public boolean optargs()    { return true; }
            public String description() { return "Service type - internally generated"; }
        },            

        Start       { 
            public String pname()       { return "start"; } 
            public String description() { return "Start a registered service." ; } 
            public String argname()     { return "service-id-or-endpoint" ; } 
        },

        Stop        { 
            public String pname()      { return "stop"; } 
            public String description() { return "Stop a registered service." ; } 
            public String argname()     { return "service-id-or-endpoint" ; } 
        },

        Enable      { 
            public String pname()       { return "enable"; } 
            public String description() { return "Allow deployment starts for this service" ; } 
            public String argname()     { return "service-id-or-endpoint" ; } 
        },

        Disable      { 
            public String pname()       { return "disable"; } 
            public String description() { return "Disable deployment starts for this service." ; }
            public String argname()     { return "service-id-or-endpoint" ; } 
        },

        Observe      { 
            public String pname()       { return "observe_references"; } 
            public String description() { return "Enable reference-started control for a manually-started service." ; } 
            public String argname()     { return "service-id-or-endpoint" ; } 
        },

        Ignore      { 
            public String pname()       { return "ignore_references"; } 
            public String description() { return "Disable reference-started control of service and revert to manual control." ; }
            public String argname()     { return "service-id-or-endpoint" ; } 
        },

        SubmitPid { 
            // generated
            public String pname()       { return JobRequestProperties.key_submitter_pid_at_host; }
            public String argname()     { return null; }
            public boolean optargs()    { return true; }
        },            

        ProcessDebug { 
            public String pname()       { return "process_debug"; }
            public String argname()     { return "debugger-port-number"; }
            public String description() { return "Listening port number the remote process is to connect to."; }
            public String example()     { return "8000"; }
        },            

        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"; }
        },            

        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..."; }
        },            

        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"; }
        },            

        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..."; }
        },            

        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"; }
        },            

        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..."; }
        },            

        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"; }
        },

        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 deflt()       { return "unlimited"; }
        },            

        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"; }
        },
        
        ProcessExecutableRequired { 
            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 boolean required()   { return true; }
        },  
        
        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"; }
        },            

        ProcessInitializationTimeMax { 
            public String pname()       { return JobSpecificationProperties.key_process_initialization_time_max; }
            public String description() { return DuccUiConstants.desc_process_initialization_time_max; }
            public String argname()     { return "integer"; }
            public String deflt()       { return "$$ducc.default.process.init.time.max"; }
        },     
		
        ProcessInitializationFailuresCap { 
            public String pname()       { return JobSpecificationProperties.key_process_initialization_failures_cap; }
            public String description() { return "Number of unexpected job process initialization failures (i.e. System.exit(), kill-15, ...) before the number of Job Processes is capped at the number currently Running."; }
            public String argname()     { return "integer"; }
            public String deflt()       { return "99"; }
        },            

        ProcessFailuresLimit { 
            public String pname()       { return JobSpecificationProperties.key_process_failures_limit; }
            public String description() { return "Number of unexpected job process failures (i.e. System.exit(), kill-15...) that will cause the job to be terminated."; }
            public String argname()     { return "integer"; }
            public String deflt()       { return "20"; }
        },            

        ProcessJvmArgs { 
            public String pname()       { return JobSpecificationProperties.key_process_jvm_args; }
            public String argname()     { return "jvm arguments"; }
            public String description() { return "Blank-delimited list of JVM Arguments passed to each process"; }
            public String example()     { return "-Xmx100M -DMYVAR=foo"; }
        },            

        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 "30"; }
        },            

        ProcessPipelineCount { 
            public String pname()       { return JobSpecificationProperties.key_process_pipeline_count; }
            public String description() { return "Number of pipelines per process (i.e. simultaneously processed work-items)."; }
            public String argname()     { return "integer"; }
            public String deflt()       { return "4"; }
        },            

        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 deflt()       { return "$$ducc.default.process.per.item.time.max"; }
        },            

        Query       { 
            public String pname()       { return "query"; } 
            public String argname()     { return "service-id-or-endpoint" ; } 
            public boolean optargs()    { return true; }
            public String deflt()       { return ""; }    // No service name => all services
            public String description() { return "Query a registered service, or all." ; } 
        },

        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"; }
        },            

        ReservationMemorySize { 
            public String pname()       { return ReservationSpecificationProperties.key_memory_size; }
            public String argname()     { return "size-in-GB"; }
            public String description() { return "Size of instance's memory, in GB."; }
            public String example()     { return "64"; }
            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"; }
        },            

        RoleAdministrator { 
            public String pname()       { return JobSpecificationProperties.key_role_administrator; }
            public boolean noargs()     { return true; }
            public String description() { return "Act in the capacity of DUCC administrator."; }
        },     
        
        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 "normal (or fixed or reserve)"; }
        },            

        ServiceLinger { 
            public String pname()       { return "service_linger"; }
            public String argname()     { return "milliseconds"; }
            public String description() { return "Time in milliseconds to wait after last referring job or service exits before stopping a non-autostarted service."; }
            public String deflt()       { return "300000"; } // 5 minutes
        },            

        ServiceDependency { 
            public String pname()       { return JobSpecificationProperties.key_service_dependency; }
            public String argname()     { return "dependency list"; }
            public String description() { return "List of blank-delimited service names."; }
            public String example()     { return "UIMA-AS:RandomSleepAE:tcp://node1:61616 CUSTOM:myservice";}
        },            

        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"; }
        },            

        Signature { 
            // generated, not public
            public String pname()       { return JobSpecificationProperties.key_signature; }
            public String argname()     { return null; }
            public boolean optargs()    { return true; }
        },            

        Specification { 
            public String pname()       { return JobSpecificationProperties.key_specification; }
            public String sname()       { return "f"; }
            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."; }
        },            

        SubmitErrors { 
            // generated, not public
            public String pname()       { return JobSpecificationProperties.key_submit_errors; }
            public String argname()     { return null; }
            public boolean optargs()    { return true; }
        },            

        SubmitWarnings { 
            // generated, not public
            public String pname()       { return JobSpecificationProperties.key_submit_warnings; }
            public String argname()     { return null; }
            public boolean optargs()    { return true; }
        },            
 
        SuppressConsoleLog { 
            public String pname()       { return "suppress_console_log"; }
            public String argname()     { return null; }
            public boolean noargs()     { return true; }
            public String description() { return "Do not copy stdout to a log file."; }
        }, 
        
        Timestamp { 
            public String pname()       { return "timestamp"; }
            public String argname()     { return null; }
            public boolean noargs()     { return true; }
            public String description() { return "Enables timestamp on monitor messages."; }
        },            

        Unregister  { 
            public String pname()       { return "unregister" ; } 
            public String argname()     { return "service-id-or-endpoint" ; } 
            public String description() { return "Unregister a service." ; } 
        },

        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."; }
        },            

        WaitForCompletion { 
            public String pname()       { return "wait_for_completion"; }
            public boolean optargs()    { return true; }
            public String deflt()       { return "true"; }
            public String argname()     { return null; }
            public String description() { return "Do not exit until job is completed."; }
        },            

        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 deflt()       { return "."; }
        },            
        ;

        public String  argname()   { return null; }  // the type of argument, if any
        public boolean multiargs() { return false; } // the option can have >1 arg
        public boolean required()  { return false; } // this option must be specified in the command line
        public String  deflt()     { return null; }  // default, required if optargs == true
        public String  sname()     { return null; }  // short name of option
        public boolean optargs()   { return false; } // this option takes 0 or more arguments
        public boolean noargs()    { return false; } // this option takes no arguments
        public String  example()   { return null; }  // example uf usage
        public String  description() { return null; }// description of option
        
                 
    };

}
