You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by bu...@apache.org on 2014/04/11 23:18:23 UTC

svn commit: r1586777 - in /uima/sandbox/uima-ducc/trunk: uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/ uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/aio/ uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/ uima-ducc-orchest...

Author: burn
Date: Fri Apr 11 21:18:22 2014
New Revision: 1586777

URL: http://svn.apache.org/r1586777
Log:
UIMA-3741 - Allow CLI requests to be sent to another runtime if the CLI versions match

Added:
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliVersion.java   (with props)
    uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/utilities/CliVersion.java   (with props)
    uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/CliVersion.java   (with props)
Modified:
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobCancel.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationCancel.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationSubmit.java
    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/DuccServiceCancel.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceSubmit.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/aio/AllInOneLauncher.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Utils.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Version.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/Validate.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceHandler.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceManagerComponent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/dispatcher/DuccEventHttpDispatcher.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AServiceRequest.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AbstractDuccEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelJobDuccEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelReservationDuccEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelServiceDuccEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceModifyEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceQueryEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceRegisterEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStartEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStopEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceUnregisterEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitJobDuccEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitReservationDuccEvent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitServiceDuccEvent.java

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliBase.java Fri Apr 11 21:18:22 2014
@@ -23,7 +23,6 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
-import java.lang.management.ManagementFactory;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
@@ -336,8 +335,6 @@ public abstract class CliBase
             setDefaults(uiOpts, suppress_console_log);
         }
         
-        cli_props.setProperty(UiOption.SubmitPid.pname(), ManagementFactory.getRuntimeMXBean().getName());
-
         if ( load_defaults && (getLogDirectory() == null) ) {
             throw new IllegalArgumentException("Cannot access log directory.");
         }
@@ -435,7 +432,7 @@ public abstract class CliBase
             } else {
                 Option opt = cliOptions.getOption(key);
                 if (opt == null) {
-                    throw new IllegalArgumentException("Invalid option " + key + " in specification file");
+                    throw new IllegalArgumentException("Invalid option '" + key + "' in specification file");
                 }
                 if (!opt.hasArg()) {
                     String val = props.getProperty(key);
@@ -807,28 +804,4 @@ public abstract class CliBase
         return args;
     }
     
-    /*
-     * Get specified class path (or the default) and remove any DUCC jars (except examples) 
-     * so they cannot accidentally replace any in the user's class path.
-     * But if it has only DUCC jars return null as this must be an error.
-     */
-    protected String fixupClasspath(String key_cp) {
-        String classpath = cli_props.getStringProperty(key_cp,
-                        System.getProperty("java.class.path"));
-        StringBuilder sb = new StringBuilder();
-        String duccPrefix = ducc_home + "/lib";
-        for (String jar : classpath.split(":")) {
-            if (!jar.startsWith(duccPrefix) || jar.contains("examples")) {
-                sb.append(":").append(jar);
-            }
-        }
-        if (sb.length() > 0) {
-            classpath = sb.substring(1);
-            cli_props.setProperty(key_cp, classpath);
-            return classpath;
-        } else {
-            return null;
-        }
-    }
-    
 }

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliVersion.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliVersion.java?rev=1586777&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliVersion.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliVersion.java Fri Apr 11 21:18:22 2014
@@ -0,0 +1,34 @@
+/*
+ * 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.utils.Version;
+
+public class CliVersion {
+    
+    static private final int cliVersion = Version.cliVersion;
+
+    /*
+     * Return copy of the current CLI version number
+     */
+    static public int getVersion() {
+        return cliVersion;
+    }
+}

Propchange: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/CliVersion.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobCancel.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobCancel.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobCancel.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobCancel.java Fri Apr 11 21:18:22 2014
@@ -112,7 +112,7 @@ public class DuccJobCancel 
         throws Exception 
     {
 
-        CancelJobDuccEvent      cancelJobDuccEvent      = new CancelJobDuccEvent(jobRequestProperties);
+        CancelJobDuccEvent      cancelJobDuccEvent      = new CancelJobDuccEvent(jobRequestProperties, CliVersion.getVersion());
         CancelJobReplyDuccEvent cancelJobReplyDuccEvent = null;
         try {
             cancelJobReplyDuccEvent = (CancelJobReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(cancelJobDuccEvent);

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccJobSubmit.java Fri Apr 11 21:18:22 2014
@@ -18,7 +18,6 @@
 */
 package org.apache.uima.ducc.cli;
 
-import java.lang.management.ManagementFactory;
 import java.util.ArrayList;
 import java.util.Properties;
 
@@ -278,11 +277,11 @@ public class DuccJobSubmit 
         }
 
         /*
-         * Set default classpath if not specified & remove DUCC jars
+         * Set default classpath if not specified
          */
-        if (fixupClasspath(UiOption.Classpath.pname()) == null){
-            message("Classpath contains only DUCC jars");
-            return false;
+        String key_cp = UiOption.Classpath.pname();
+        if (!jobRequestProperties.containsKey(key_cp)) {
+            jobRequestProperties.setProperty(key_cp, System.getProperty("java.class.path"));
         }
 
         if (jobRequestProperties.containsKey(UiOption.Debug.pname())) {
@@ -290,18 +289,13 @@ public class DuccJobSubmit 
         }
 
         /*
-         * identify invoker
-         */
-        jobRequestProperties.setProperty(UiOption.SubmitPid.pname(), ManagementFactory.getRuntimeMXBean().getName());
-
-        /*
          * resolve ${defaultBrokerURL} in service dependencies - must fail if resolution needed but can't resolve
          */
         if ( ! check_service_dependencies(null) ) {
             return false;
         }
 
-        SubmitJobDuccEvent      submitJobDuccEvent      = new SubmitJobDuccEvent(jobRequestProperties);
+        SubmitJobDuccEvent      submitJobDuccEvent      = new SubmitJobDuccEvent(jobRequestProperties, CliVersion.getVersion());
         SubmitJobReplyDuccEvent submitJobReplyDuccEvent = null;
         try {
             submitJobReplyDuccEvent = (SubmitJobReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(submitJobDuccEvent);

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationCancel.java Fri Apr 11 21:18:22 2014
@@ -88,15 +88,16 @@ public class DuccManagedReservationCance
 	}
 
     /**
-     * Execute collects the parameters for job cancelation and sends them to the DUCC Orchestrator
-     * to effect the cancelation.
+     * Execute collects the parameters for job cancellation and sends them to the DUCC Orchestrator
+     * to effect the cancellation.
      *
-     * @return True if the orchestrator accepts the job cancelation.
+     * @return True if the orchestrator accepts the job cancellation.
      */
 	public boolean execute() 
         throws Exception 
     {
-        CancelServiceDuccEvent      cancelServiceDuccEvent      = new CancelServiceDuccEvent(requestProperties, DuccContext.ManagedReservation);
+        CancelServiceDuccEvent cancelServiceDuccEvent = new CancelServiceDuccEvent(
+                        requestProperties, DuccContext.ManagedReservation, CliVersion.getVersion());
         CancelServiceReplyDuccEvent cancelServiceReplyDuccEvent = null;
         try {
             cancelServiceReplyDuccEvent = (CancelServiceReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(cancelServiceDuccEvent);

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccManagedReservationSubmit.java Fri Apr 11 21:18:22 2014
@@ -152,7 +152,7 @@ public class DuccManagedReservationSubmi
         serviceRequestProperties.setProperty(UiOption.ProcessDeploymentsMax.pname(), "1");     
         serviceRequestProperties.setProperty(UiOption.ServiceTypeOther.pname(), "");
         
-        SubmitServiceDuccEvent ev = new SubmitServiceDuccEvent(serviceRequestProperties);
+        SubmitServiceDuccEvent ev = new SubmitServiceDuccEvent(serviceRequestProperties, CliVersion.getVersion());
         SubmitServiceReplyDuccEvent reply = null;
         
         try {

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationCancel.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationCancel.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationCancel.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationCancel.java Fri Apr 11 21:18:22 2014
@@ -98,7 +98,7 @@ public class DuccReservationCancel 
         throws Exception 
     {
 
-        CancelReservationDuccEvent      cancelReservationDuccEvent      = new CancelReservationDuccEvent(requestProperties);
+        CancelReservationDuccEvent      cancelReservationDuccEvent      = new CancelReservationDuccEvent(requestProperties, CliVersion.getVersion());
         CancelReservationReplyDuccEvent cancelReservationReplyDuccEvent = null;
         try {
             cancelReservationReplyDuccEvent = (CancelReservationReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(cancelReservationDuccEvent);

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationSubmit.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationSubmit.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationSubmit.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccReservationSubmit.java Fri Apr 11 21:18:22 2014
@@ -92,7 +92,7 @@ public class DuccReservationSubmit 
      */
 	public boolean execute()
     {		
-        SubmitReservationDuccEvent      ev    = new SubmitReservationDuccEvent(requestProperties);
+        SubmitReservationDuccEvent      ev    = new SubmitReservationDuccEvent(requestProperties, CliVersion.getVersion());
         SubmitReservationReplyDuccEvent reply = null;
         
         try {

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=1586777&r1=1586776&r2=1586777&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 Fri Apr 11 21:18:22 2014
@@ -343,10 +343,10 @@ public class DuccServiceApi 
             if (customCmd != null) {
                 message("WARN", "--process_executable is ignored for UIMA-AS services");
             }
-            // Infer the classpath (DuccProperties will return the default if the value isn't found.)
-            // Note: only used for UIMA-AS services
-            if (fixupClasspath(UiOption.Classpath.pname()) == null) {
-                throw new IllegalArgumentException("Specified classpath contains only DUCC jars");
+            // Set default classpath if not specified - only used for UIMA-AS services
+            String key_cp = UiOption.Classpath.pname();
+            if (!cli_props.containsKey(key_cp)) {
+                cli_props.setProperty(key_cp, System.getProperty("java.class.path"));
             }
 
             // Given ep must match inferred ep. Use case: an application is wrapping DuccServiceApi and has to construct
@@ -376,7 +376,10 @@ public class DuccServiceApi 
             if ( ! cli_props.containsKey(UiOption.ServicePingClass.pname()) ) {
                 throw new IllegalArgumentException("Custom service is missing ping class name.");
             }
-            fixupClasspath(UiOption.ServicePingClasspath.pname());
+            String key_cp = UiOption.ServicePingClasspath.pname();
+            if (!cli_props.containsKey(key_cp)) {
+                cli_props.setProperty(key_cp, System.getProperty("java.class.path"));
+            }
         
         } else {
             throw new IllegalArgumentException("Invalid service endpoint: " + endpoint);
@@ -406,7 +409,7 @@ public class DuccServiceApi 
         cli_props.remove(UiOption.Instances.pname());
         cli_props.remove(UiOption.Autostart.pname());
 
-        ServiceRegisterEvent ev = new ServiceRegisterEvent(user, instances, autostart, endpoint, cli_props, auth_block);
+        ServiceRegisterEvent ev = new ServiceRegisterEvent(user, instances, autostart, endpoint, cli_props, auth_block, CliVersion.getVersion());
 
         try {
             return (IServiceReply) dispatcher.dispatchAndWaitForDuccReply(ev);
@@ -433,7 +436,7 @@ public class DuccServiceApi 
         String user = dp.getProperty(UiOption.User.pname());
         byte[] auth_block = (byte[]) dp.get(UiOption.Signature.pname());
 
-        ServiceUnregisterEvent ev = new ServiceUnregisterEvent(user, id.first(), id.second(), auth_block);
+        ServiceUnregisterEvent ev = new ServiceUnregisterEvent(user, id.first(), id.second(), auth_block, CliVersion.getVersion());
         
         try {
             return (IServiceReply) dispatcher.dispatchAndWaitForDuccReply(ev);
@@ -459,7 +462,7 @@ public class DuccServiceApi 
         String user = dp.getProperty(UiOption.User.pname());
         byte[] auth_block = (byte[]) dp.get(UiOption.Signature.pname());
 
-        ServiceStartEvent ev = new ServiceStartEvent(user, id.first(), id.second(), auth_block);
+        ServiceStartEvent ev = new ServiceStartEvent(user, id.first(), id.second(), auth_block, CliVersion.getVersion());
 
         int instances = getInstances(-1);
         boolean update = getUpdate();
@@ -491,7 +494,7 @@ public class DuccServiceApi 
         String user = dp.getProperty(UiOption.User.pname());
         byte[] auth_block = (byte[]) dp.get(UiOption.Signature.pname());
 
-        ServiceStopEvent ev = new ServiceStopEvent(user, id.first(), id.second(), auth_block);
+        ServiceStopEvent ev = new ServiceStopEvent(user, id.first(), id.second(), auth_block, CliVersion.getVersion());
 
         int instances = getInstances(-1);
         boolean update = getUpdate();
@@ -527,7 +530,7 @@ public class DuccServiceApi 
         String user = dp.getProperty(UiOption.User.pname());
         byte[] auth_block = (byte[]) dp.get(UiOption.Signature.pname());
 
-        ServiceModifyEvent ev = new ServiceModifyEvent(user, id.first(), id.second(), dp, auth_block);        
+        ServiceModifyEvent ev = new ServiceModifyEvent(user, id.first(), id.second(), dp, auth_block, CliVersion.getVersion());        
 
         try {
             return (IServiceReply) dispatcher.dispatchAndWaitForDuccReply(ev);
@@ -555,7 +558,7 @@ public class DuccServiceApi 
         byte[] auth_block = (byte[]) dp.get(UiOption.Signature.pname());
 
         DuccProperties mods = new DuccProperties();        
-        ServiceModifyEvent ev = new ServiceModifyEvent(user, id.first(), id.second(), mods, auth_block);
+        ServiceModifyEvent ev = new ServiceModifyEvent(user, id.first(), id.second(), mods, auth_block, CliVersion.getVersion());
         int instances = getInstances(-1);
         Trinary autostart = getAutostart();
         boolean activate = getActivate();
@@ -616,7 +619,7 @@ public class DuccServiceApi 
         String user = dp.getProperty(UiOption.User.pname());
         byte[] auth_block = (byte[]) dp.get(UiOption.Signature.pname());
 
-        ServiceQueryEvent ev = new ServiceQueryEvent(user, id.first(), id.second(), auth_block);
+        ServiceQueryEvent ev = new ServiceQueryEvent(user, id.first(), id.second(), auth_block, CliVersion.getVersion());
 
         try {
             return (IServiceReply) dispatcher.dispatchAndWaitForDuccReply(ev);

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccServiceCancel.java Fri Apr 11 21:18:22 2014
@@ -100,7 +100,8 @@ public class DuccServiceCancel 
         throws Exception 
     {
 
-        CancelServiceDuccEvent      cancelServiceDuccEvent      = new CancelServiceDuccEvent(requestProperties, DuccContext.Service);
+        CancelServiceDuccEvent cancelServiceDuccEvent = new CancelServiceDuccEvent(
+                        requestProperties, DuccContext.Service, CliVersion.getVersion());
         CancelServiceReplyDuccEvent cancelServiceReplyDuccEvent = null;
         try {
             cancelServiceReplyDuccEvent = (CancelServiceReplyDuccEvent) dispatcher.dispatchAndWaitForDuccReply(cancelServiceDuccEvent);

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=1586777&r1=1586776&r2=1586777&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 Fri Apr 11 21:18:22 2014
@@ -187,9 +187,9 @@ public class DuccServiceSubmit 
             }
             
             // This should have already been done when registered, but perhaps not in old services.
-            if (fixupClasspath(UiOption.Classpath.pname()) == null){
-                message("Classpath contains only DUCC jars");
-                return false;
+            String key_cp = UiOption.Classpath.pname();
+            if (!cli_props.containsKey(key_cp)) {
+                cli_props.setProperty(key_cp, System.getProperty("java.class.path"));
             }
             
             //
@@ -243,7 +243,7 @@ public class DuccServiceSubmit 
 
         requestProperties.put(UiOption.ProcessThreadCount.pname(), "1");         // enforce this - OR will complain if it's missing
 
-        SubmitServiceDuccEvent      ev    = new SubmitServiceDuccEvent(requestProperties);
+        SubmitServiceDuccEvent      ev    = new SubmitServiceDuccEvent(requestProperties, CliVersion.getVersion());
         SubmitServiceReplyDuccEvent reply = null;
         
         try {

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/aio/AllInOneLauncher.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/aio/AllInOneLauncher.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/aio/AllInOneLauncher.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/aio/AllInOneLauncher.java Fri Apr 11 21:18:22 2014
@@ -309,9 +309,9 @@ public class AllInOneLauncher extends Cl
         String mid = "examine_classpath";
         mh.frameworkTrace(cid, mid, enter);
         String pname = UiOption.Classpath.pname();
-        classpath = fixupClasspath(pname);
+        classpath = jobRequestProperties.getProperty(pname);
         if (classpath == null) {
-            throw new IllegalArgumentException("Specified classpath contains only DUCC jars");
+            classpath = System.getProperty("java.class.path");
         }
         used(pname);
         String message = classpath;

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Utils.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Utils.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Utils.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Utils.java Fri Apr 11 21:18:22 2014
@@ -350,54 +350,71 @@ public class Utils {
 
     static String DUCC_HOME = null;
     
+    /*
+     * Return the value of DUCC_HOME
+     */
     public static String findDuccHome() {
 
         if ( DUCC_HOME != null ) {
             return DUCC_HOME;
         }
 
-        String sys_ducc_home = System.getProperty("DUCC_HOME");
+        // Infer DUCC_HOME from location of this class 
+        // but let system property override, and warn when different.
         
-        // Always assume that DUCC_HOME is where this code resides
-        // Locate the jar (or class file) that holds this class
+        String jar_ducc_home = inferDuccHome();
+        DUCC_HOME = System.getProperty("DUCC_HOME");
+        if (DUCC_HOME != null) {
+            if (jar_ducc_home != null) {
+                // Resolve any symbolic links, e.g. /users -> /users1
+                try {
+                    DUCC_HOME = (new File((DUCC_HOME))).getCanonicalPath();
+                } catch (IOException e) {
+                }
+                if (!jar_ducc_home.equals(DUCC_HOME)) {
+                    System.out.println("WARNING: Setting DUCC_HOME = " + DUCC_HOME + " but the CLI request is from " + jar_ducc_home);
+                }
+            }
+        } else {
+            DUCC_HOME = jar_ducc_home;
+            if (DUCC_HOME != null) {
+                System.setProperty("DUCC_HOME", DUCC_HOME);
+            } else {
+                throw new IllegalArgumentException("Cannot infer DUCC_HOME and no system property provided");
+            }
+        }
+        
+        return DUCC_HOME;
+    }
+
+    /*
+     * Locate the jar file that holds this class and deduce DUCC_HOME
+     */
+    private static String inferDuccHome() {
         // (Theoretically could get a null from the first 2 gets)
         URL res = Utils.class.getProtectionDomain().getCodeSource().getLocation();
-        String p = res.getFile();
+        String p = res.getPath();
         if ( !p.endsWith(".jar") ) {
-            System.out.println("Class file: " + p);
-            if (sys_ducc_home == null) {
-                throw new IllegalArgumentException("Cannot infer DUCC_HOME --- must be invoked from a DUCC jar.");
-            } else {
-                System.out.println("WARNING: Cannot infer DUCC_HOME as not in a jar, so using the system property value: " + sys_ducc_home);
-                DUCC_HOME = sys_ducc_home;
-                return DUCC_HOME;
-            }
+            System.out.println("WARNING: Cannot infer DUCC_HOME as not running from a jar");
+            return null;
         }
                 
-        // File name should be:  <ducc-home>/lib/uima-ducc/uima-ducc-common-<vesrion>.jar
+        // File name should be:  <ducc-home>/lib/uima-ducc/uima-ducc-common-<version>.jar
         // Strip off the jar file and the 2 directories above 
         int ndx = p.lastIndexOf("/");
         ndx = p.lastIndexOf("/", ndx-1);
         ndx = p.lastIndexOf("/", ndx-1);
         p = p.substring(0, ndx);
-        ndx = p.indexOf(':');   
-        DUCC_HOME =  p.substring(ndx+1);
 
-        File props = new File(DUCC_HOME + "/resources/ducc.properties");
+        File props = new File(p + "/resources/ducc.properties");
         if ( ! props.exists() ) {
-            System.out.println("Class resource: " + res);
-        	throw new IllegalArgumentException("Cannot infer DUCC_HOME - " + DUCC_HOME + " is invalid.");
-        }
-
-        // Fail if system property specifies a different DUCC_HOME
-        if ( sys_ducc_home != null && !sys_ducc_home.equals(DUCC_HOME)) {
-            throw new IllegalArgumentException("The inferred DUCC_HOME = " + DUCC_HOME + " but the system property = " + sys_ducc_home);
+            System.out.println("WARNING: Cannot infer DUCC_HOME as running from " + res + " that is not part of a valid DUCC installation");
+            return null;
         }
-
-        System.setProperty("DUCC_HOME", DUCC_HOME);
-        return DUCC_HOME;
+        return p;
     }
-
+    
+    
 	public static void main(String[] args) {
 		try {
 			if ( Utils.isThisNode("192.168.3.3", "192.168.3.3") ) {

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Version.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Version.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Version.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-common/src/main/java/org/apache/uima/ducc/common/utils/Version.java Fri Apr 11 21:18:22 2014
@@ -62,6 +62,12 @@ public class Version
 
         return sb.toString();
     }
+    
+    /*
+     * This version number is included on each CLI request and checked by DUCC.
+     * Change the value when requests are changed in an incompatible way.
+     */
+    public final static int cliVersion = 1;
 
     public static void main(String[] args)
     {

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/Validate.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/Validate.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/Validate.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/Validate.java Fri Apr 11 21:18:22 2014
@@ -26,6 +26,8 @@ import org.apache.uima.ducc.common.utils
 import org.apache.uima.ducc.common.utils.DuccPropertiesResolver;
 import org.apache.uima.ducc.orchestrator.authentication.DuccWebAdministrators;
 import org.apache.uima.ducc.orchestrator.utilities.MemorySpecification;
+import org.apache.uima.ducc.orchestrator.utilities.CliVersion;
+import org.apache.uima.ducc.transport.event.AbstractDuccOrchestratorEvent;
 import org.apache.uima.ducc.transport.event.CancelJobDuccEvent;
 import org.apache.uima.ducc.transport.event.CancelReservationDuccEvent;
 import org.apache.uima.ducc.transport.event.CancelServiceDuccEvent;
@@ -110,6 +112,9 @@ public class Validate {
 	}
 	public static boolean request(SubmitJobDuccEvent duccEvent) {
 		boolean retVal = true;
+		if (!validate_cli_version(duccEvent)) {
+			return false;
+		}	
 		JobRequestProperties properties = (JobRequestProperties) duccEvent.getProperties();
 		String key;
 		String value;
@@ -132,6 +137,9 @@ public class Validate {
 	}
 	
 	public static boolean request(CancelJobDuccEvent duccEvent) {
+		if (!validate_cli_version(duccEvent)) {
+			return false;
+		}		
 		boolean retVal = true;
 		//TODO
 		return retVal;
@@ -145,6 +153,9 @@ public class Validate {
 		
 	public static boolean request(SubmitReservationDuccEvent duccEvent) {
 		boolean retVal = true;
+		if (!validate_cli_version(duccEvent)) {
+			return false;
+		}	
 		ReservationRequestProperties properties = (ReservationRequestProperties) duccEvent.getProperties();
 		String key;
 		String value;
@@ -180,6 +191,9 @@ public class Validate {
 	public static boolean request(CancelReservationDuccEvent duccEvent, DuccWorkReservation duccWorkReservation) {
 		String location = "request";
 		boolean retVal = false;
+		if (!validate_cli_version(duccEvent)) {
+			return false;
+		}
 		Properties properties = duccEvent.getProperties();
 		String userid = properties.getProperty(JobSpecificationProperties.key_user);
 		String ownerid = duccWorkReservation.getStandardInfo().getUser();
@@ -205,6 +219,9 @@ public class Validate {
 	
 	public static boolean request(SubmitServiceDuccEvent duccEvent) {
 		boolean retVal = true;
+		if (!validate_cli_version(duccEvent)) {
+			return false;
+		}		
 		JobRequestProperties properties = (JobRequestProperties) duccEvent.getProperties();
 		String key;
 		String value;
@@ -228,7 +245,20 @@ public class Validate {
 	
 	public static boolean request(CancelServiceDuccEvent duccEvent) {
 		boolean retVal = true;
+		if (!validate_cli_version(duccEvent)) {
+			return false;
+		}
 		//TODO
 		return retVal;
 	}
+	
+	private static boolean validate_cli_version(AbstractDuccOrchestratorEvent ev) {
+		if (ev.getCliVersion() == CliVersion.getVersion()) {
+			return true;
+		}
+		String reason = ev.getEventType() + " rejected. Incompatible CLI request using version " + ev.getCliVersion() + " while DUCC expects version " + CliVersion.getVersion() ;
+		addError(ev.getProperties(),reason);
+		logger.warn("validate_cli_request", null, reason);
+		return false;
+	}
 }

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/utilities/CliVersion.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/utilities/CliVersion.java?rev=1586777&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/utilities/CliVersion.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/utilities/CliVersion.java Fri Apr 11 21:18:22 2014
@@ -0,0 +1,34 @@
+/*
+ * 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.orchestrator.utilities;
+
+import org.apache.uima.ducc.common.utils.Version;
+
+public class CliVersion {
+
+    static private final int cliVersion = Version.cliVersion;
+
+    /*
+     * Return copy of the current CLI version number
+     */
+    static public int getVersion() {
+        return cliVersion;
+    }
+}

Propchange: uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/utilities/CliVersion.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/CliVersion.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/CliVersion.java?rev=1586777&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/CliVersion.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/CliVersion.java Fri Apr 11 21:18:22 2014
@@ -0,0 +1,34 @@
+/*
+ * 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.sm;
+
+import org.apache.uima.ducc.common.utils.Version;
+
+public class CliVersion {
+    
+    static private final int cliVersion = Version.cliVersion;
+
+    /*
+     * Return copy of the current CLI version number
+     */
+    static public int getVersion() {
+        return cliVersion;
+    }
+}

Propchange: uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/CliVersion.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceHandler.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceHandler.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceHandler.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceHandler.java Fri Apr 11 21:18:22 2014
@@ -674,7 +674,7 @@ public class ServiceHandler
         String userout = sset.getUser();
 
         if ( !userin.equals(userout) && !serviceManager.isAdministrator(userin) ) {
-            return new ServiceReplyEvent(false, "Owned by " + userout,  url, id);
+            return new ServiceReplyEvent(false, "Owned by " + userout,  url, sset.getId().getFriendly());
         }
 
         int running    = sset.countImplementors();
@@ -772,7 +772,7 @@ public class ServiceHandler
         String userout = sset.getUser();
 
         if ( !userin.equals(userout) && !serviceManager.isAdministrator(userin) ) {
-            return new ServiceReplyEvent(false, "Owned by " + userout,  url, id);
+            return new ServiceReplyEvent(false, "Owned by " + userout,  url, sset.getId().getFriendly());
         }
 
         if ( sset.isStopped() ) {
@@ -820,7 +820,7 @@ public class ServiceHandler
         ServiceSet sset = serviceStateHandler.getServiceByUrl(url);
         if (sset != null ) {
             error = "Duplicate registered by " + sset.getUser();
-            return new ServiceReplyEvent(false, error, url, id.getFriendly());
+            return new ServiceReplyEvent(false, error, url, sset.getId().getFriendly());
         }
 
         try {
@@ -886,7 +886,7 @@ public class ServiceHandler
         String userout = sset.getUser();
 
         if ( !userin.equals(userout) && !serviceManager.isAdministrator(userin) ) {
-            return new ServiceReplyEvent(false, "Owned by " + userout,  url, id);
+            return new ServiceReplyEvent(false, "Owned by " + userout,  url, sset.getId().getFriendly());
         }
         
         pendingRequests.add(new ApiHandler(ev, this));
@@ -1120,7 +1120,7 @@ public class ServiceHandler
         logger.info(methodName, sset.getId(), "Unregister received from", userin);
 
         if ( !userin.equals(userout) && !serviceManager.isAdministrator(userin) ) {
-            return new ServiceReplyEvent(false, "Owned by " + userout,  url, id);
+            return new ServiceReplyEvent(false, "Owned by " + userout,  url, sset.getId().getFriendly());
         }
         
         serviceStateHandler.unregister(sset);

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceManagerComponent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceManagerComponent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceManagerComponent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ServiceManagerComponent.java Fri Apr 11 21:18:22 2014
@@ -633,6 +633,16 @@ public class ServiceManagerComponent 
     private boolean validate_user(String action, AServiceRequest req)
     {
     	String methodName = "validate_user";
+        
+        // First check that request is from a compatible cli
+        if (req.getCliVersion() != CliVersion.getVersion()) {
+            String reason = "Incompatible CLI request using version " + req.getCliVersion()
+                            + " while DUCC expects version " + CliVersion.getVersion();
+            logger.warn(methodName, null, action + " rejected. " + reason);
+            req.setReply(new ServiceReplyEvent(false, reason, action, -1));
+            return false;
+        }
+        
         String user = req.getUser();                
         byte[] auth_block= req.getAuth();
         boolean validated = false;

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/dispatcher/DuccEventHttpDispatcher.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/dispatcher/DuccEventHttpDispatcher.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/dispatcher/DuccEventHttpDispatcher.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/dispatcher/DuccEventHttpDispatcher.java Fri Apr 11 21:18:22 2014
@@ -105,7 +105,7 @@ public class DuccEventHttpDispatcher {
     try {
       DuccEventHttpDispatcher dispatcher = 
               new DuccEventHttpDispatcher("http://"+args[0]+":19988/or",1000*4);
-      SubmitJobDuccEvent duccEvent = new SubmitJobDuccEvent(null);
+      SubmitJobDuccEvent duccEvent = new SubmitJobDuccEvent(null, 1);
       DuccEvent event = dispatcher.dispatchAndWaitForDuccReply(duccEvent);
       if ( event instanceof SubmitJobReplyDuccEvent ) {
         System.out.println("Client received SubmitJobReplyDuccEvent");

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AServiceRequest.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AServiceRequest.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AServiceRequest.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AServiceRequest.java Fri Apr 11 21:18:22 2014
@@ -31,12 +31,15 @@ public abstract class AServiceRequest
     byte[] auth_block;
 
     ServiceReplyEvent reply;
-	public AServiceRequest(EventType eventType, String user, byte[] auth_block)
-	{
-		super(eventType);
+    private int cli_version;
+    
+    public AServiceRequest(EventType eventType, String user, byte[] auth_block, int cli_version)
+    {
+        super(eventType);
         this.user = user;
         this.auth_block = auth_block;
-	}
+        this.cli_version = cli_version;
+    }
 
     public ServiceReplyEvent getReply()
     {
@@ -58,8 +61,13 @@ public abstract class AServiceRequest
         return auth_block;
     }
 
-	@Override
-	public String toString() {
-		return "AServiceRequest [reply=" + reply + "]";
-	}
+    public int getCliVersion()
+    {
+        return cli_version;
+    }
+    
+    @Override
+    public String toString() {
+        return "AServiceRequest [reply=" + reply + "]";
+    }
 };

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AbstractDuccEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AbstractDuccEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AbstractDuccEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/AbstractDuccEvent.java Fri Apr 11 21:18:22 2014
@@ -28,6 +28,8 @@ implements DuccEvent { 
 	private Long eventSize = new Long(0);
 	private EventType eventType;
 	
+	private int cliVersion;
+	
 	public AbstractDuccEvent(EventType eventType) {
 		this.eventType = eventType;
 	}
@@ -48,5 +50,12 @@ implements DuccEvent { 
 	public void setSequence(long sequence) {
 		this.sequence = sequence;
 	}
+	
+	public int getCliVersion() {
+	    return cliVersion;
+	}
 
+	public void setCliVersion(int version) {
+	    cliVersion = version;
+	}
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelJobDuccEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelJobDuccEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelJobDuccEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelJobDuccEvent.java Fri Apr 11 21:18:22 2014
@@ -23,8 +23,9 @@ import org.apache.uima.ducc.common.utils
 @SuppressWarnings("serial")
 public class CancelJobDuccEvent extends AbstractDuccJobEvent {
 	
-	public CancelJobDuccEvent(DuccProperties props) {
+	public CancelJobDuccEvent(DuccProperties props, int cli_version) {
 		super(EventType.CANCEL_JOB);
 		setProperties(props);
+		setCliVersion(cli_version);
 	}
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelReservationDuccEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelReservationDuccEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelReservationDuccEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelReservationDuccEvent.java Fri Apr 11 21:18:22 2014
@@ -23,8 +23,9 @@ import org.apache.uima.ducc.common.utils
 @SuppressWarnings("serial")
 public class CancelReservationDuccEvent extends AbstractDuccReservationEvent {
 	
-	public CancelReservationDuccEvent(DuccProperties props) {
+	public CancelReservationDuccEvent(DuccProperties props, int cli_version) {
 		super(EventType.CANCEL_RESERVATION);
 		setProperties(props);
+		setCliVersion(cli_version);
 	}
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelServiceDuccEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelServiceDuccEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelServiceDuccEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/CancelServiceDuccEvent.java Fri Apr 11 21:18:22 2014
@@ -31,9 +31,10 @@ public class CancelServiceDuccEvent exte
 	}
 	*/
 	
-	public CancelServiceDuccEvent(DuccProperties props, DuccContext context) {
+	public CancelServiceDuccEvent(DuccProperties props, DuccContext context, int cli_version) {
 		super(EventType.CANCEL_SERVICE);
 		setProperties(props);
 		setContext(context);
+		setCliVersion(cli_version);
 	}
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceModifyEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceModifyEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceModifyEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceModifyEvent.java Fri Apr 11 21:18:22 2014
@@ -33,9 +33,9 @@ public class ServiceModifyEvent 
 
     private DuccProperties props;
 
-	public ServiceModifyEvent(String user, long friendly, String epname, DuccProperties props, byte[] auth_block)
+	public ServiceModifyEvent(String user, long friendly, String epname, DuccProperties props, byte[] auth_block, int cli_version)
     {
-		super(EventType.SERVICE_STOP, user, auth_block);
+		super(EventType.SERVICE_STOP, user, auth_block, cli_version);
         this.friendly = friendly;
         this.epname = epname;
         this.props = props;

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceQueryEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceQueryEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceQueryEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceQueryEvent.java Fri Apr 11 21:18:22 2014
@@ -25,9 +25,9 @@ public class ServiceQueryEvent 
     long friendly;
     String epname;
 
-	public ServiceQueryEvent(String user, long friendly, String epname, byte[] auth_block)
+	public ServiceQueryEvent(String user, long friendly, String epname, byte[] auth_block, int cli_version)
     {
-        super(EventType.SERVICE_QUERY, user, auth_block);
+        super(EventType.SERVICE_QUERY, user, auth_block, cli_version);
         this.friendly = friendly;
         this.epname = epname;
 	}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceRegisterEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceRegisterEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceRegisterEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceRegisterEvent.java Fri Apr 11 21:18:22 2014
@@ -31,9 +31,10 @@ public class ServiceRegisterEvent 
     private String endpoint;
     private DuccProperties descriptor;
 
-	public ServiceRegisterEvent(String user, int ninstances, Trinary autostart, String endpoint, DuccProperties descriptor, byte[] auth_block)
+	public ServiceRegisterEvent(String user, int ninstances, Trinary autostart, String endpoint, DuccProperties descriptor, byte[] auth_block, 
+	                int cli_version)
     {
-		super(EventType.SERVICE_REGISTER, user, auth_block);
+		super(EventType.SERVICE_REGISTER, user, auth_block, cli_version);
         this.ninstances = ninstances;
         this.autostart = autostart;
         this.endpoint = endpoint;

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStartEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStartEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStartEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStartEvent.java Fri Apr 11 21:18:22 2014
@@ -27,9 +27,9 @@ public class ServiceStartEvent 
     private int instances;
     private boolean update;
 
-	public ServiceStartEvent(String user, int friendly, String epname, byte[] auth_block)
+	public ServiceStartEvent(String user, int friendly, String epname, byte[] auth_block, int cli_version)
     {
-		super(EventType.SERVICE_START, user, auth_block);
+		super(EventType.SERVICE_START, user, auth_block, cli_version);
         this.friendly = friendly;
         this.epname = epname;
         this.instances = -1;         // default, don't change number of instances

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStopEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStopEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStopEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceStopEvent.java Fri Apr 11 21:18:22 2014
@@ -28,9 +28,9 @@ public class ServiceStopEvent 
     private int instances;
     private boolean update;
 
-	public ServiceStopEvent(String user, long friendly, String epname, byte[] auth_block)
+	public ServiceStopEvent(String user, long friendly, String epname, byte[] auth_block, int cli_version)
     {
-		super(EventType.SERVICE_STOP, user, auth_block);
+		super(EventType.SERVICE_STOP, user, auth_block, cli_version);
         this.friendly = friendly;
         this.epname = epname;
         this.instances = -1;

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceUnregisterEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceUnregisterEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceUnregisterEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceUnregisterEvent.java Fri Apr 11 21:18:22 2014
@@ -26,9 +26,9 @@ public class ServiceUnregisterEvent 
     private long friendly;
     private String epname;
 
-	public ServiceUnregisterEvent(String user, long friendly, String epname, byte[] auth_block)
+	public ServiceUnregisterEvent(String user, long friendly, String epname, byte[] auth_block, int cli_version)
     {
-		super(EventType.SERVICE_UNREGISTER, user, auth_block);
+		super(EventType.SERVICE_UNREGISTER, user, auth_block, cli_version);
         this.friendly = friendly;
         this.epname = epname;
 	}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitJobDuccEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitJobDuccEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitJobDuccEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitJobDuccEvent.java Fri Apr 11 21:18:22 2014
@@ -23,8 +23,9 @@ import org.apache.uima.ducc.common.utils
 @SuppressWarnings("serial")
 public class SubmitJobDuccEvent extends AbstractDuccJobEvent {
 
-	public SubmitJobDuccEvent(DuccProperties props) {
+	public SubmitJobDuccEvent(DuccProperties props, int cli_version) {
 		super(EventType.SUBMIT_JOB);
         setProperties(props);
+        setCliVersion(cli_version);
 	}
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitReservationDuccEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitReservationDuccEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitReservationDuccEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitReservationDuccEvent.java Fri Apr 11 21:18:22 2014
@@ -23,8 +23,9 @@ import org.apache.uima.ducc.common.utils
 @SuppressWarnings("serial")
 public class SubmitReservationDuccEvent extends AbstractDuccReservationEvent {
 
-	public SubmitReservationDuccEvent(DuccProperties props) {
+	public SubmitReservationDuccEvent(DuccProperties props, int cli_version) {
 		super(EventType.SUBMIT_RESERVATION);
 		setProperties(props);
+		setCliVersion(cli_version);
 	}
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitServiceDuccEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitServiceDuccEvent.java?rev=1586777&r1=1586776&r2=1586777&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitServiceDuccEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/SubmitServiceDuccEvent.java Fri Apr 11 21:18:22 2014
@@ -27,9 +27,10 @@ public class SubmitServiceDuccEvent exte
 		super(EventType.SUBMIT_SERVICE);
 	}
 	
-	public SubmitServiceDuccEvent(DuccProperties props)
+	public SubmitServiceDuccEvent(DuccProperties props, int cli_version)
 	{
 		super(EventType.SUBMIT_SERVICE);
 		setProperties(props);
+		setCliVersion(cli_version);
 	}
 }