Author: challngr
Date: Wed Apr  9 19:43:15 2014
New Revision: 1586101

URL: http://svn.apache.org/r1586101
Log:
UIMA-3726 Dynamic modification of registration parameters.  Also support for 
process_debug in services.

Modified:
    
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java
    
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java?rev=1586101&r1=1586100&r2=1586101&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceApi.java
 Wed Apr  9 19:43:15 2014
@@ -67,6 +67,7 @@ public class DuccServiceApi 
         UiOption.ProcessExecutable,
         UiOption.ProcessExecutableArgs,
         UiOption.ProcessInitializationTimeMax,
+        UiOption.ProcessDebug,
 
         UiOption.ClasspathOrder,
         // UiOption.Specification          // not used for registration
@@ -116,28 +117,30 @@ public class DuccServiceApi 
         UiOption.Update,
     }; 
 
-    // For use by SM, final to insure no accidental modification
-    final UiOption[] modify_options = {
-        UiOption.Help,
-        UiOption.Debug,
-        UiOption.Modify,
-        UiOption.Instances,
-        UiOption.Autostart,
-        UiOption.Activate,
-
-        UiOption.ProcessInitializationTimeMax,
-
-        UiOption.ServicePingArguments,
-        UiOption.ServicePingClass,
-        UiOption.ServicePingClasspath,
-        UiOption.ServicePingJvmArgs,
-        UiOption.ServicePingTimeout,
-        UiOption.ServicePingDoLog,
-
-        UiOption.InstanceFailureWindow,
-        UiOption.InstanceFailureLimit,
-        UiOption.InstanceInitFailureLimit,
-    }; 
+    // This gets generated from the registratoin_options.
+    UiOption[] modify_options;
+    // // For use by SM, final to insure no accidental modification
+    // UiOption[] modify_options = {
+    //     UiOption.Help,
+    //     UiOption.Debug,
+    //     UiOption.Modify,
+    //     UiOption.Instances,
+    //     UiOption.Autostart,
+    //     UiOption.Activate,
+
+    //     UiOption.ProcessInitializationTimeMax,
+
+    //     UiOption.ServicePingArguments,
+    //     UiOption.ServicePingClass,
+    //     UiOption.ServicePingClasspath,
+    //     UiOption.ServicePingJvmArgs,
+    //     UiOption.ServicePingTimeout,
+    //     UiOption.ServicePingDoLog,
+
+    //     UiOption.InstanceFailureWindow,
+    //     UiOption.InstanceFailureLimit,
+    //     UiOption.InstanceInitFailureLimit,
+    // }; 
 
     UiOption[] query_options = {
         UiOption.Help,
@@ -148,6 +151,17 @@ public class DuccServiceApi 
     public DuccServiceApi(IDuccCallback cb)
     {
         this.callback = cb;
+
+        // generate modify options, same as registration options, only with 
the verb
+        // Modify insteady of Register, and on extra option, Activate.
+        modify_options = new UiOption[registration_options.length + 1];
+        int i = 0;
+        for ( ; i < registration_options.length; i++ ) {
+            UiOption o = registration_options[i];
+            if ( o == UiOption.Register ) o = UiOption.Modify;
+            modify_options[i] = o;
+        }
+        modify_options[i++] = UiOption.Activate;
     }
 
     private Pair<Integer, String> getId(UiOption opt)
@@ -230,6 +244,27 @@ public class DuccServiceApi 
         }
     }
 
+    /**
+     * Attempt a fast-fail if a bad debug port is specified.
+     */
+    private void enrichPropertiesForDebug()
+    {
+        String debug_port = 
cli_props.getProperty(UiOption.ProcessDebug.pname());
+        if ( debug_port == null ) return; 
+        
+        try {
+            int port = Integer.parseInt(debug_port);
+        } catch ( NumberFormatException e ) {
+            throw new IllegalArgumentException("Invalid debug port specified, 
not numeric: " + debug_port);
+        }
+
+        String debug_host = 
cli_props.getProperty(UiOption.ProcessDebugHost.pname());
+        if ( debug_host == null ) {
+            cli_props.put(UiOption.ProcessDebugHost.pname(), host_address);
+        }
+
+    }
+
     String extractEndpoint(String jvmargs)
     {
         String dd = cli_props.getStringProperty(UiOption.ProcessDD.pname()); 
// will throw if can't find the prop
@@ -299,6 +334,8 @@ public class DuccServiceApi 
                                                    + "\n 
--service_request_endpoint: " + endpoint 
                                                    + "\n                  
extracted: " + inferred_endpoint );
             }
+
+            enrichPropertiesForDebug();
             
         } else if (endpoint.startsWith(ServiceType.Custom.decode())) {
 

Modified: 
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java?rev=1586101&r1=1586100&r2=1586101&view=diff
==============================================================================
--- 
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java
 (original)
+++ 
uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java
 Wed Apr  9 19:43:15 2014
@@ -58,6 +58,9 @@ public class DuccServiceSubmit 
         UiOption.ProcessExecutableArgs,
         UiOption.ProcessInitializationTimeMax,
 
+        UiOption.ProcessDebug,
+        UiOption.ProcessDebugHost,
+
         UiOption.InstanceFailureLimit,
         UiOption.ClasspathOrder,
         UiOption.Specification,
@@ -106,6 +109,49 @@ public class DuccServiceSubmit 
     {
         init (this.getClass().getName(), opts, props, requestProperties, null);
     }
+
+    private void set_debug_parms(Properties props, int port)
+    {
+    }
+    
+    protected void enrich_parameters_for_debug(Properties props)
+        throws Exception
+    {
+        try {        
+            int debug_port = -1;
+            String debug_host = null;
+            
+            // we allow both jd and jp to debug, but the ports have to differ
+            String do_debug = UiOption.ProcessDebug.pname();
+            if ( props.containsKey(do_debug) ) {
+                String port_s = props.getProperty(do_debug);
+                if ( port_s == null ) {
+                    throw new IllegalArgumentException("Missing port for " + 
do_debug);
+                }
+                debug_port = Integer.parseInt(port_s);
+                debug_host = 
props.getProperty(UiOption.ProcessDebugHost.pname());
+                if ( debug_host == null ) {
+                    throw new IllegalArgumentException("Debug is requested but 
process_debug_host is missing");
+                }
+
+                String debug_jvmargs = "-Xdebug 
-Xrunjdwp:transport=dt_socket,address=" + debug_host + ":" + debug_port;
+                String jvmargs = 
props.getProperty(UiOption.ProcessJvmArgs.pname());
+                if (jvmargs == null) {
+                    jvmargs = debug_jvmargs;
+                } else {
+                    jvmargs += " " + debug_jvmargs;
+                }
+                props.put(UiOption.ProcessJvmArgs.pname(), jvmargs);
+                
+                // For debugging, if the JP is being debugged, insure these 
are conservative
+                props.setProperty(UiOption.ProcessDeploymentsMax.pname(), "1");
+                props.setProperty(UiOption.ProcessFailuresLimit.pname(), "1");
+            }
+
+        } catch (NumberFormatException e) {
+            throw new IllegalArgumentException("Invalid debug port (not 
numeric)");
+        }
+    }
     
     /**
      * Execute collects the service parameters, does basic error and 
correctness checking, and sends
@@ -124,6 +170,8 @@ public class DuccServiceSubmit 
         
         String endpoint = 
requestProperties.getProperty(UiOption.ServiceRequestEndpoint.pname());
         
+        boolean isUimaAs = true;
+
         if (endpoint == null || 
endpoint.startsWith(ServiceType.UimaAs.decode())) {
             requestProperties.put(UiOption.ServiceTypeUima.pname(), "");
             if (uimaDD == null) {
@@ -167,6 +215,7 @@ public class DuccServiceSubmit 
             }
 
         } else if (endpoint.startsWith(ServiceType.Custom.decode())) {
+            isUimaAs = false;
             if (uimaDD != null) {
                 message("WARN: --process_DD is ignored for CUSTOM endpoints");
             }
@@ -183,7 +232,11 @@ public class DuccServiceSubmit 
         if ( debug ) {
             requestProperties.dump();
         }
-    
+
+        if ( isUimaAs ) {
+            enrich_parameters_for_debug(requestProperties);
+        }
+
         requestProperties.put(UiOption.ProcessThreadCount.pname(), "1");       
  // enforce this - OR will complain if it's missing
 
         SubmitServiceDuccEvent      ev    = new 
SubmitServiceDuccEvent(requestProperties);


Reply via email to