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

svn commit: r1455662 [2/2] - in /uima/sandbox/uima-ducc/trunk: uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/ uima-ducc-rm/src/main/java/org/apache/uima/ducc/rm/scheduler/ uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/ uima-ducc-sm/src/main...

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=1455662&r1=1455661&r2=1455662&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 Tue Mar 12 18:23:00 2013
@@ -715,7 +715,7 @@ public class ServiceHandler
             if ( sset == null ) {
                 reply.setMessage("Unrecognized service ID[" + friendly + "] Endpoint[" + epname + "]");
                 reply.setEndpoint(epname);
-                reply.setReturnCode(ServiceCode.NOTOK);
+                reply.setReturnCode(false);
             } else {
                 IServiceDescription sd = sset.query();
                 updateServiceQuery(sd, sset);
@@ -736,7 +736,7 @@ public class ServiceHandler
         ServiceSet sset = serviceStateHandler.getServiceForApi(friendly, epname);
 
         if ( sset == null ) {
-            return new ServiceReplyEvent(ServiceCode.NOTOK, "Service " + serviceIdString + " does not exist.", null, null);
+            return new ServiceReplyEvent(false, "Service " + serviceIdString + " does not exist.", null, null);
         }
 
         if ( sset.isRegistered() ) {
@@ -751,8 +751,8 @@ public class ServiceHandler
                 wanted = instances;
             }
             if ( wanted == 0 ) {
-                return new ServiceReplyEvent(ServiceCode.NOTOK, 
-                                             "Service " + serviceIdString + " is started, instances[" + running + "]: ", 
+                return new ServiceReplyEvent(true, 
+                                             "Service " + serviceIdString + " instances[" + running + "], no additional instances started. ", 
                                              sset.getKey(), 
                                              sset.getId());
             }
@@ -764,12 +764,12 @@ public class ServiceHandler
 //             Thread t = new Thread(apih);
 //             t.start();
 
-            return new ServiceReplyEvent(ServiceCode.OK, 
+            return new ServiceReplyEvent(true, 
                                          "Service " + serviceIdString + " start request accepted, new instances[" + wanted + "]", 
                                          sset.getKey(), 
                                          sset.getId());
         } else {
-            return new ServiceReplyEvent(ServiceCode.NOTOK, 
+            return new ServiceReplyEvent(false, 
                                          "Service " + serviceIdString + " is not a registered service.", 
                                          sset.getKey(), 
                                          null);    
@@ -821,12 +821,12 @@ public class ServiceHandler
         ServiceSet sset = serviceStateHandler.getServiceForApi(friendly, epname);
 
         if ( sset == null ) {
-            return new ServiceReplyEvent(ServiceCode.NOTOK, "Service " + serviceIdString + " does not exist.", null, null);
+            return new ServiceReplyEvent(false, "Service " + serviceIdString + " does not exist.", null, null);
         }
 
         if ( sset.isRegistered() ) {
             if ( (sset.countImplementors() == 0) && ( sset.isUimaAs()) ) {
-                return new ServiceReplyEvent(ServiceCode.NOTOK, "Service " + serviceIdString + " is already stopped.", sset.getKey(), sset.getId());
+                return new ServiceReplyEvent(false, "Service " + serviceIdString + " is already stopped.", sset.getKey(), sset.getId());
             }
 
             int running    = sset.countImplementors();
@@ -846,9 +846,9 @@ public class ServiceHandler
 //                 t.start();
             }
 
-            return new ServiceReplyEvent(ServiceCode.OK, "Service " + serviceIdString + " stop request accepted for [" + tolose + "] instances.", sset.getKey(), sset.getId());
+            return new ServiceReplyEvent(true, "Service " + serviceIdString + " stop request accepted for [" + tolose + "] instances.", sset.getKey(), sset.getId());
         } else {
-            return new ServiceReplyEvent(ServiceCode.NOTOK, "Service " + friendly + " is not a registered service.", sset.getKey(), null);            
+            return new ServiceReplyEvent(false, "Service " + friendly + " is not a registered service.", sset.getKey(), null);            
         }
 
     }
@@ -897,7 +897,7 @@ public class ServiceHandler
             sset = new ServiceSet(id, props_filename, meta_filename, props, meta);
         } catch (Throwable t) {
             error = t.getMessage();
-            return new ServiceReplyEvent(ServiceCode.NOTOK, t.getMessage(), "New Service", id);            
+            return new ServiceReplyEvent(false, t.getMessage(), "New Service", id);            
         }
 
         String key = sset.getKey();
@@ -936,14 +936,14 @@ public class ServiceHandler
 
         if ( error == null ) {
             serviceStateHandler.putServiceByName(sset.getKey(), sset);
-            return new ServiceReplyEvent(ServiceCode.OK, "Registered service.", key, id);
+            return new ServiceReplyEvent(true, "Registered service.", key, id);
         } else {
             File mf = new File(meta_filename);
             mf.delete();
             
             File pf = new File(props_filename);
             pf.delete();
-            return new ServiceReplyEvent(ServiceCode.NOTOK, error, key, id);
+            return new ServiceReplyEvent(false, error, key, id);
         }
     }
 
@@ -955,7 +955,7 @@ public class ServiceHandler
     	ServiceSet sset = serviceStateHandler.getServiceForApi(friendly, epname);
         
         if ( sset == null ) {
-            return new ServiceReplyEvent(ServiceCode.NOTOK, "Unrecognized service ID[" + friendly + "] Endpoint[" + epname + "]", "?", null);
+            return new ServiceReplyEvent(false, "Unrecognized service ID[" + friendly + "] Endpoint[" + epname + "]", "?", null);
         }
 
     	if ( sset.isRegistered() ) {            
@@ -963,9 +963,9 @@ public class ServiceHandler
 //             ApiHandler  apih = new ApiHandler(ev, this);
 //             Thread t = new Thread(apih);
 //             t.start();
-            return new ServiceReplyEvent(ServiceCode.OK, "Service " + serviceIdString + " modify request accepted.", sset.getKey(), sset.getId());
+            return new ServiceReplyEvent(true, "Service " + serviceIdString + " modify request accepted.", sset.getKey(), sset.getId());
         } else {
-            return new ServiceReplyEvent(ServiceCode.NOTOK, "Service " + friendly + " is not a known service.", sset.getKey(), null);            
+            return new ServiceReplyEvent(false, "Service " + friendly + " is not a known service.", sset.getKey(), null);            
         }
     }
 
@@ -1008,7 +1008,7 @@ public class ServiceHandler
         ServiceSet sset = serviceStateHandler.getServiceForApi(friendly, epname);
 
         if ( sset == null ) {
-            return new ServiceReplyEvent(ServiceCode.NOTOK, "Service " + serviceIdString + " does not exist.",  serviceIdString, null);
+            return new ServiceReplyEvent(false, "Service " + serviceIdString + " does not exist.",  serviceIdString, null);
         }
 
         if ( sset.isRegistered() ) {            
@@ -1017,9 +1017,9 @@ public class ServiceHandler
 //             ApiHandler  apih = new ApiHandler(ev, this);
 //             Thread t = new Thread(apih);
 //             t.start();
-            return new ServiceReplyEvent(ServiceCode.OK, "Service " + serviceIdString + " unregistered. Shutting down implementors.", sset.getKey(), sset.getId());
+            return new ServiceReplyEvent(true, "Service " + serviceIdString + " unregistered. Shutting down implementors.", sset.getKey(), sset.getId());
         } else {
-            return new ServiceReplyEvent(ServiceCode.NOTOK, "Service " + serviceIdString + " is not a registered service.", sset.getKey(), null);            
+            return new ServiceReplyEvent(false, "Service " + serviceIdString + " is not a registered service.", sset.getKey(), null);            
         }
         
     }

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=1455662&r1=1455661&r2=1455662&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 Tue Mar 12 18:23:00 2013
@@ -29,18 +29,22 @@ import org.apache.camel.CamelContext;
 import org.apache.uima.ducc.common.boot.DuccDaemonRuntimeProperties;
 import org.apache.uima.ducc.common.boot.DuccDaemonRuntimeProperties.DaemonName;
 import org.apache.uima.ducc.common.component.AbstractDuccComponent;
+import org.apache.uima.ducc.common.crypto.Crypto;
+import org.apache.uima.ducc.common.crypto.Crypto.AccessType;
 import org.apache.uima.ducc.common.main.DuccService;
 import org.apache.uima.ducc.common.utils.DuccCollectionUtils;
 import org.apache.uima.ducc.common.utils.DuccCollectionUtils.DuccMapDifference;
 import org.apache.uima.ducc.common.utils.DuccCollectionUtils.DuccMapValueDifference;
 import org.apache.uima.ducc.common.utils.DuccLogger;
 import org.apache.uima.ducc.common.utils.DuccProperties;
+import org.apache.uima.ducc.common.utils.LinuxUtils;
 import org.apache.uima.ducc.common.utils.MissingPropertyException;
 import org.apache.uima.ducc.common.utils.SystemPropertyResolver;
 import org.apache.uima.ducc.common.utils.Version;
 import org.apache.uima.ducc.common.utils.id.DuccId;
 import org.apache.uima.ducc.common.utils.id.DuccIdFactory;
 import org.apache.uima.ducc.transport.dispatcher.DuccEventDispatcher;
+import org.apache.uima.ducc.transport.event.AServiceRequest;
 import org.apache.uima.ducc.transport.event.ServiceModifyEvent;
 import org.apache.uima.ducc.transport.event.ServiceQueryEvent;
 import org.apache.uima.ducc.transport.event.ServiceQueryReplyEvent;
@@ -97,8 +101,10 @@ public class ServiceManagerComponent 
     private DuccProperties sm_props = null;
     private String service_seqno = "service.seqno";
     private DuccIdFactory idFactory = new DuccIdFactory();
-
+    
+    private boolean signature_required = true;
     private boolean initialized = false;
+    private boolean testmode = false;
 
 	public ServiceManagerComponent(CamelContext context) 
     {
@@ -231,6 +237,17 @@ public class ServiceManagerComponent 
         meta_ping_timeout = SystemPropertyResolver.getIntProperty("ducc.sm.meta.ping.timeout", meta_ping_timeout);
         meta_ping_stability = SystemPropertyResolver.getIntProperty("ducc.sm.meta.ping.stability", meta_ping_stability);
         default_ping_class = SystemPropertyResolver.getStringProperty("ducc.sm.default.uima-as.ping.class", UimaAsPing.class.getName());
+        String rm = SystemPropertyResolver.getStringProperty("ducc.runmode", "");
+        if ( rm.equals("Test") ) testmode = true;
+
+        // yuck
+        String sig = SystemPropertyResolver.getStringProperty("ducc.signature.required", "on");
+        signature_required = true;
+        if      ( sig.equals("on")  ) signature_required = true;
+        else if ( sig.equals("off") ) signature_required = false;
+        else {
+            logger.warn(methodName, null, "Incorrect value for property ducc.signature.required: " + sig + ". Setting to default of \"on\"");
+        }
 
         logger.info(methodName, null, "------------------------------------------------------------------------------------");
         logger.info(methodName, null, "Service Manager starting:");
@@ -242,6 +259,8 @@ public class ServiceManagerComponent 
         logger.info(methodName, null, "    JVM Path                : ", System.getProperty("ducc.jvm"));
         logger.info(methodName, null, "    JMX URL                 : ", System.getProperty("ducc.jmx.url"));
         logger.info(methodName, null, "    OS Architecture         : ", System.getProperty("os.arch"));
+        logger.info(methodName, null, "    Crypto enabled          : ", signature_required);
+        logger.info(methodName, null, "    Test mode enabled       : ", testmode);
         logger.info(methodName, null, "    Service ping rate       : ", meta_ping_rate);
         logger.info(methodName, null, "    Service ping timeout    : ", meta_ping_timeout);
         logger.info(methodName, null, "    Service ping stability  : ", meta_ping_stability);
@@ -460,176 +479,6 @@ public class ServiceManagerComponent 
         }
     }
 
-    /**
-    public void processIncomingOld(DuccWorkMap workMap) 
-    {
-		String methodName = "evaluateServiceRequirements";
-		logger.debug(methodName, null, "---Received Orchestrator State---");
-		synchronized(serviceMap) {
-			jobDisappeared(workMap);
-			jobNotActive(workMap);
-			servicesUpdate(workMap);
-		}
-	}
-	
-	private int jobDisappeared(DuccWorkMap workMap) 
-    {
-		String methodName = "jobDisappeared";
-		int count = 0;
-		Iterator<DuccId> serviceMapIterator = serviceMap.keySet().iterator();
-		while(serviceMapIterator.hasNext()) {
-			DuccId duccId = serviceMapIterator.next();
-			if(!workMap.containsKey(duccId)) {
-				count++;
-				serviceMap.removeService(duccId);
-				logger.info(methodName, duccId, "Job removed (disappeared)");
-			}
-		}
-		return count;
-	}
-	
-	private int jobNotActive(DuccWorkMap workMap) 
-    {
-		String methodName = "jobNotActive";
-		int count = 0;
-		Iterator<DuccId> workMapIterator = workMap.keySet().iterator();
-		while(workMapIterator.hasNext()) {
-			DuccId duccId = workMapIterator.next();
-			IDuccWork duccWork = workMap.findDuccWork(duccId);
-			switch(duccWork.getDuccType()) {
-			case Job:
-			case Service:
-				DuccWorkJob duccWorkJob = (DuccWorkJob) duccWork;
-				if(!duccWorkJob.isActive() && serviceMap.containsKey(duccId)) {
-					count++;
-					serviceMap.removeService(duccId);
-					logger.info(methodName, duccId, "Job removed");
-				}
-				break;
-			default:
-				break;
-			}
-		}
-		return count;
-	}
-	
-	private int servicesUpdate(DuccWorkMap workMap) 
-    {
-		String methodName = "servicesUpdate";
-		int count = 0;
-		Iterator<DuccId> workMapIterator = workMap.keySet().iterator();
-		while(workMapIterator.hasNext()) {
-			DuccId duccId = workMapIterator.next();
-			IDuccWork duccWork = workMap.findDuccWork(duccId);
-			switch(duccWork.getDuccType()) 
-            {
-                case Job:
-                case Service:
-                    DuccWorkJob job = (DuccWorkJob) duccWork;
-                    if ( job.isActive() ) {
-
-                        count++;
-                        Services jobServices = new Services();                    
-                        if( !serviceMap.containsKey(duccId) ) {
-                            serviceMap.addService(duccId, jobServices);
-                        }
-                        
-                        //
-                        // TODO: For now this always sets Running
-                        //
-                        boolean enabled = true;
-                        if ( !enabled ) {
-                            logger.info(methodName, job.getDuccId(), "Service check bypassed: return ServiceState.Running");
-                            jobServices.setState(ServiceState.Running);
-                        } else {
-                            
-                            //   TODO: Service manager will do this once it's ready.
-                            //         Will track state of service from OR state as a submitted POP.  Once
-                            //         state Running is reached a ping is needed.
-                            //   TODO: jobServices needs space for a collection of service states.
-                            //
-                            if ( dependenciesSatisfied(job) ) {
-                                jobServices.setState(ServiceState.Running);
-                            } else {
-                                jobServices.setState(ServiceState.NotAvailable);
-                            }
-                        }
-                        
-                        logger.info(methodName, duccId, "Job updated. State:", jobServices.getState());
-                    }
-                    break;
-    			default:
-                    break;
-			}
-		}
-		return count;
-	}
-*/
-//
-//	/**
-//	 * Returns true if job service dependencies are satisfied. False otherwise.
-//	 * 
-//	 * @param duccWorkJob - Job with (possible) dependencies on remote services
-//	 * @return - true if job's dependencies are satisfied. False otherwise
-//	 */
-//	private boolean dependenciesSatisfied(DuccWorkJob duccWorkJob) 
-//    {
-//		String methodName = "dependenciesSatisfied";
-//		try {
-//            String[] deps = duccWorkJob.getServiceDependencies();
-//            if ( deps == null ) {
-//                logger.info(methodName, duccWorkJob.getDuccId(), "No service dependencies, returns satisfied.");
-//                return true;
-//            }
-//
-//			List<ServiceSpecifier> remoteDependencies = new ArrayList<ServiceSpecifier>();
-//            for ( String dep : deps ) {
-//                remoteDependencies.add(new ServiceSpecifier(dep));
-//			}
-//			return validDependencies(duccWorkJob.getDuccId(),remoteDependencies);
-//		} catch( Exception e) {
-//			logger.error(methodName, duccWorkJob.getDuccId(), e);
-//		}
-//		return false;
-//	}
-
-	/**
-	 * Validates availability of remote services. Reads given deployment descriptor,
-	 * extracts AE descriptor and parses it to get ResourceSpecifier. The code then 
-	 * iterates over delegates looking for CustomResourceSpecifier type. If found, 
-	 * a delegate is a remote service which must be tested for availability. An instance
-	 * of UIMA AS client is created for each remote service to test GetMeta response. If 
-	 * a remote service does not respond, the client times out and service is considered
-	 * as not available.
-	 * 
-	 * @param ddFile - deployment descriptor file
-	 * @param duccId - job ducc id
-	 * @return - true is dependent services are available. False, otherwise.
-	 * @throws Exception
-	 */
-//	private boolean validDependencies(DuccId duccId, List<ServiceSpecifier> remotes) throws Exception 
-//    {
-//		String methodName = "validDependencies";
-//		boolean answer = true; 
-//
-//		//	iterate over remotes. Send GetMeta request to each one and wait for reply.
-//		//  If the remote is available it will respond. Otherwise, either a
-//		//  broker is down or service is not available and we time out.
-//		for( ServiceSpecifier remote : remotes ) {
-//            BaseUimaAsService sd = services.get(remote.key());
-//            if ( sd == null ) {                                         // make sure its registered
-//                logger.info(methodName, duccId, "Service not registered:", remote.key());
-//                answer = false;
-//            } else {
-//                boolean p = ping(sd);        // use a tmp so we can log
-//                answer &= p;
-//                logger.info(methodName, duccId, "Dependency available for", remote.key, ":", p);
-//            }
-//		} 
-//		return answer;
-//	}
-
-
     public void setTransportConfiguration(DuccEventDispatcher eventDispatcher, String endpoint)
     {
         this.eventDispatcher = eventDispatcher;
@@ -677,26 +526,6 @@ public class ServiceManagerComponent 
         notify();
     }
 
-    /**
-     * Every ping needs to update state if it changes
-     */
-//    private boolean ping(BaseUimaAsService sd)
-//    {
-//    	String methodName = "ping";
-//        boolean answer = false;
-//        ServiceState oldState = sd.getState();
-//        answer = sd.ping();
-//        if ( sd.getState() != oldState ) {
-//        	try {
-//        		writeProps(sd);
-//        	} catch ( Throwable t ) {
-//        		// log the problem but this isn't a good reason to crash anything.
-//        		logger.error(methodName, null, "Cannot update state file after ping:", t.getMessage());
-//        	}
-//        }
-//        return answer;
-//    }
-
     private String serviceFileLocation()
     {
         return System.getProperty("DUCC_HOME") + "/state/services";
@@ -707,15 +536,42 @@ public class ServiceManagerComponent 
         return serviceFileLocation() + "/" + fn;
     }
 
-//    public void writeProps(BaseUimaAsService sd)
-//    	throws Throwable
-//    {
-//        DuccProperties props = sd.getProperties();
-//        String fn = serviceFileKey(sd.getStringProperty("service-file-key"));
-//        FileOutputStream fos = new FileOutputStream(fn);
-//        props.store(fos, "Service Descriptor for " + sd.getKey());
-//        fos.close();        
-//    }
+	private boolean check_signature(String user, byte[] auth_block)
+        throws Throwable
+    {
+        String userHome = null;
+        if ( testmode ) {    
+            userHome = System.getProperty("user.home");
+        } else {
+            userHome = LinuxUtils.getUserHome(user);
+        }
+        
+        Crypto crypto = new Crypto(userHome,AccessType.READER);
+        String signature = (String)crypto.decrypt(auth_block);
+        
+        return user.equals(signature);
+	}
+
+    private boolean validate_user(String action, AServiceRequest req)
+    {
+    	String methodName = "validate_user";
+        String user = req.getUser();                
+        byte[] auth_block= req.getAuth();
+        boolean validated = false;
+
+        try {
+            validated = signature_required && check_signature(user, auth_block);
+        } catch ( Throwable t ) {
+            logger.error(methodName, null, "Crypto failure:", t.toString());
+        }
+
+        if ( ! validated ) {
+            logger.warn(methodName, null, "User", user, "cannot be validated.", action, "rejected.");
+            req.setReply(new ServiceReplyEvent(false, "User " + user + " cannot be validated. " + action + " rejected.", "NONE", null));
+            return false;
+        }
+        return true;
+    }
 
     public synchronized void register(ServiceRegisterEvent ev)
     {
@@ -724,15 +580,16 @@ public class ServiceManagerComponent 
         String endpoint = ev.getEndpoint();
         int instances = ev.getNinstances();
         Trinary autostart = ev.getAutostart();
-        String user = ev.getUser();
-
+        String user = ev.getUser();        
+        
+        if ( ! validate_user("Register", ev) ) return;   // necessary messages emitted in here
 
         DuccId id = null;
         try {
             id = newId();
         } catch ( Exception e ) {
             logger.error(methodName, null, e);
-            ev.setReply(new ServiceReplyEvent(ServiceCode.NOTOK, "Internal error; unable to generate id", endpoint, null));
+            ev.setReply(new ServiceReplyEvent(false, "Internal error; unable to generate id", endpoint, null));
             return;
         }
         logger.debug(methodName, id, "Unique:", id.getUnique());
@@ -756,14 +613,10 @@ public class ServiceManagerComponent 
         ev.setReply(reply);
 
         // Draw attentipn in the log on registration failures
-        switch ( reply.getReturnCode() ) {
-            case OK:
-                logger.info(methodName, id, ev.toString());
-                break;
-
-            case NOTOK:
-                logger.warn(methodName, id, ev.toString());
-                break;
+        if ( reply.getReturnCode() ) {
+            logger.info(methodName, id, ev.toString());
+        } else {
+            logger.warn(methodName, id, ev.toString());
         }
     }
 
@@ -771,6 +624,9 @@ public class ServiceManagerComponent 
     {
         String methodName = "unregister";
         long id = ev.getFriendly();
+
+        if ( ! validate_user("Unregister", ev) ) return;   // necessary messages emitted in here
+
         logger.info(methodName, null, "De-registering service", id);
         ServiceReplyEvent reply = handler.unregister(ev);
         ev.setReply(reply);       
@@ -779,6 +635,9 @@ public class ServiceManagerComponent 
     public synchronized void start(ServiceStartEvent ev)
     {
         String methodName = "startService";
+
+        if ( ! validate_user("Start", ev) ) return;   // necessary messages emitted in here
+
         logger.info(methodName, null, "Starting service", ev.toString());
         ServiceReplyEvent reply = handler.start(ev);
         ev.setReply(reply);
@@ -788,6 +647,9 @@ public class ServiceManagerComponent 
     public synchronized void stop(ServiceStopEvent ev)
     {
         String methodName = "stopService";
+
+        if ( ! validate_user("Stop", ev) ) return;   // necessary messages emitted in here
+
         logger.info(methodName, null, "Stopping service", ev.toString());
         ServiceReplyEvent reply = handler.stop(ev);
         ev.setReply(reply);
@@ -797,6 +659,9 @@ public class ServiceManagerComponent 
     public synchronized void query(ServiceQueryEvent ev)
     {
         String methodName = "query";
+
+        if ( ! validate_user("Query", ev) ) return;   // necessary messages emitted in here
+
         logger.info(methodName, null, "Query", ev.toString());
         ServiceQueryReplyEvent reply = handler.query(ev);
         ev.setReply(reply);
@@ -806,6 +671,9 @@ public class ServiceManagerComponent 
     public synchronized void modify(ServiceModifyEvent ev)
     {
         String methodName = "modify";
+
+        if ( ! validate_user("Modify", ev) ) return;   // necessary messages emitted in here
+
         logger.info(methodName, null, "Modify", ev.toString());
         ServiceReplyEvent reply = handler.modify(ev);
         ev.setReply(reply);
@@ -822,18 +690,4 @@ public class ServiceManagerComponent 
         fos.close();
         return id;
     }
-
-    /**
-	public static void main(String[] args) 
-    {
-		try {
-			ServiceManagerComponent sm = new ServiceManagerComponent(new DefaultCamelContext());
-			if ( sm.validDependencies( new DuccId(100), new ArrayList<RemoteService>()) ) {
-			}
-
-		} catch( Exception e) {
-			e.printStackTrace();
-		}
-	}
-	*/
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/event/ServiceManagerEventListener.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/event/ServiceManagerEventListener.java?rev=1455662&r1=1455661&r2=1455662&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/event/ServiceManagerEventListener.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-sm/src/main/java/org/apache/uima/ducc/sm/event/ServiceManagerEventListener.java Tue Mar 12 18:23:00 2013
@@ -75,7 +75,7 @@ public class ServiceManagerEventListener
 
     private ServiceReplyEvent failureEvent(String message)
     {
-        return new ServiceReplyEvent(ServiceCode.NOTOK, message, "no.endpoint", null);
+        return new ServiceReplyEvent(false, message, "no.endpoint", null);
     }
 
     private ServiceReplyEvent failureEvent()

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=1455662&r1=1455661&r2=1455662&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 Tue Mar 12 18:23:00 2013
@@ -18,31 +18,46 @@
 */
 package org.apache.uima.ducc.transport.event;
 
-import org.apache.uima.ducc.transport.event.sm.IService;
-
 /**
  * Common service constants.
  */
 @SuppressWarnings("serial")
 public abstract class AServiceRequest
     extends AbstractDuccEvent
-    implements IService
+    //implements IService
 {
+
+    String user;
+    byte[] auth_block;
+
     ServiceReplyEvent reply;
-	public AServiceRequest(EventType eventType)
+	public AServiceRequest(EventType eventType, String user, byte[] auth_block)
 	{
 		super(eventType);
+        this.user = user;
+        this.auth_block = auth_block;
 	}
 
     public ServiceReplyEvent getReply()
     {
         return reply;
     }
+
     public void setReply(ServiceReplyEvent reply)
     {
         this.reply = reply;
     }
 
+    public String getUser()
+    {
+        return user;
+    }
+
+    public byte[] getAuth()
+    {
+        return auth_block;
+    }
+
 	@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/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=1455662&r1=1455661&r2=1455662&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 Tue Mar 12 18:23:00 2013
@@ -18,26 +18,23 @@
 */
 package org.apache.uima.ducc.transport.event;
 
-import org.apache.uima.ducc.transport.event.sm.IService;
+import org.apache.uima.ducc.transport.event.sm.IService.Trinary;
 
 @SuppressWarnings("serial")
 public class ServiceModifyEvent 
     extends AServiceRequest
-    implements IService
 {
     private long friendly;      // the "friendly" part of a DuccId
     private String epname;
-	private String user;
     private int instances;      // 0 ==> don't modify instances
     private Trinary autostart;
     private boolean activate;
 
-	public ServiceModifyEvent(String user, long friendly, String epname)
+	public ServiceModifyEvent(String user, long friendly, String epname, byte[] auth_block)
     {
-		super(EventType.SERVICE_STOP);
+		super(EventType.SERVICE_STOP, user, auth_block);
         this.friendly = friendly;
         this.epname = epname;
-        this.user = user;
         this.instances = -1;   // default, instances aren't changed
         this.autostart = Trinary.Unset;
         this.activate = false;
@@ -82,10 +79,6 @@ public class ServiceModifyEvent 
         return epname;
     }
 
-	public String getUser() {
-		return user;
-	}
-
 	@Override
 	public String toString() {
 		return "ServiceModifyEvent [friendly=" + friendly + ", user=" + user + ", instances=" + instances 

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=1455662&r1=1455661&r2=1455662&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 Tue Mar 12 18:23:00 2013
@@ -22,14 +22,12 @@ package org.apache.uima.ducc.transport.e
 public class ServiceQueryEvent 
     extends AServiceRequest
 {    
-    String user;
     long friendly;
     String epname;
 
-	public ServiceQueryEvent(String user, long friendly, String epname)
+	public ServiceQueryEvent(String user, long friendly, String epname, byte[] auth_block)
     {
-        super(EventType.SERVICE_QUERY);
-        this.user = user;
+        super(EventType.SERVICE_QUERY, user, auth_block);
         this.friendly = friendly;
         this.epname = epname;
 	}
@@ -41,9 +39,4 @@ public class ServiceQueryEvent 
 	public String getEndpoint() {
 		return epname;
 	}
-
-	public String getUser()
-    {
-        return user;
-    }
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceQueryReplyEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceQueryReplyEvent.java?rev=1455662&r1=1455661&r2=1455662&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceQueryReplyEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceQueryReplyEvent.java Tue Mar 12 18:23:00 2013
@@ -19,6 +19,7 @@
 package org.apache.uima.ducc.transport.event;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.uima.ducc.transport.event.sm.IServiceDescription;
 
@@ -29,10 +30,10 @@ public class ServiceQueryReplyEvent 
 {
     // same as a ServiceReply Event plus it has a collection of info about services.
 
-    ArrayList<IServiceDescription> services = new ArrayList<IServiceDescription>();
+    List<IServiceDescription> services = new ArrayList<IServiceDescription>();
     public ServiceQueryReplyEvent()
     {
-        super(ServiceCode.OK, "Query Reply", "No Endpoint", null);
+        super(true, "Query Reply", "No Endpoint", null);
     }
 
     public void addService(IServiceDescription s)
@@ -40,7 +41,7 @@ public class ServiceQueryReplyEvent 
         this.services.add(s);
     }
 
-    public ArrayList<IServiceDescription> getServices()
+    public List<IServiceDescription> getServices()
     {
         return services;
     }
@@ -49,7 +50,7 @@ public class ServiceQueryReplyEvent 
     {
         StringBuilder sb = new StringBuilder();
         if ( services.size() == 0 ) {
-            if ( this.getReturnCode() == ServiceCode.NOTOK ) {
+            if ( this.getReturnCode() == false ) {
                 return super.getMessage();
             } else {
                 return "No Services";

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=1455662&r1=1455661&r2=1455662&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 Tue Mar 12 18:23:00 2013
@@ -19,6 +19,7 @@
 package org.apache.uima.ducc.transport.event;
 
 import org.apache.uima.ducc.common.utils.DuccProperties;
+import org.apache.uima.ducc.transport.event.sm.IService.Trinary;
 
 @SuppressWarnings("serial")
 public class ServiceRegisterEvent 
@@ -28,13 +29,11 @@ public class ServiceRegisterEvent 
     private int ninstances;
     private Trinary autostart;
     private String endpoint;
-    private String user;
     private DuccProperties descriptor;
 
-	public ServiceRegisterEvent(String user, int ninstances, Trinary autostart, String endpoint, DuccProperties descriptor)
+	public ServiceRegisterEvent(String user, int ninstances, Trinary autostart, String endpoint, DuccProperties descriptor, byte[] auth_block)
     {
-		super(EventType.SERVICE_REGISTER);
-        this.user = user;
+		super(EventType.SERVICE_REGISTER, user, auth_block);
         this.ninstances = ninstances;
         this.autostart = autostart;
         this.endpoint = endpoint;
@@ -54,11 +53,6 @@ public class ServiceRegisterEvent 
 	}
 
 
-	public String getUser() {
-		return user;
-	}
-
-
 	public DuccProperties getDescriptor() {
 		return descriptor;
 	}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceReplyEvent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceReplyEvent.java?rev=1455662&r1=1455661&r2=1455662&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceReplyEvent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/ServiceReplyEvent.java Tue Mar 12 18:23:00 2013
@@ -18,21 +18,24 @@
 */
 package org.apache.uima.ducc.transport.event;
 
+import java.util.List;
+
 import org.apache.uima.ducc.common.utils.id.DuccId;
-import org.apache.uima.ducc.transport.event.sm.IService;
+import org.apache.uima.ducc.transport.event.sm.IServiceDescription;
+import org.apache.uima.ducc.transport.event.sm.IServiceReply;
 
 
 @SuppressWarnings("serial")
 public class ServiceReplyEvent 
     extends AbstractDuccEvent
-    implements IService
+    implements IServiceReply
 {
-    private ServiceCode return_code;
+    private boolean return_code;
     private String message = "N/A";
     private String endpoint;
     private DuccId id;
     
-	public ServiceReplyEvent(ServiceCode rc, String message, String endpoint, DuccId id)
+	public ServiceReplyEvent(boolean rc, String message, String endpoint, DuccId id)
     {
 		super(EventType.SERVICE_REPLY);
         this.return_code = rc;
@@ -41,11 +44,11 @@ public class ServiceReplyEvent 
         this.id = id;
 	}
 
-	public ServiceCode getReturnCode() {
+	public boolean getReturnCode() {
 		return return_code;
 	}
 
-	public void setReturnCode(ServiceCode return_code) {
+	public void setReturnCode(boolean return_code) {
 		this.return_code = return_code;
 	}
 
@@ -65,17 +68,27 @@ public class ServiceReplyEvent 
 		this.endpoint = endpoint;
 	}
 
-	public DuccId getId() {
+	public DuccId getDuccId() {
 		return id;
 	}
 
+	public long getId() 
+    {
+		return (id == null ) ? -1 : id.getFriendly();
+	}
+
 	public void setId(DuccId id) {
 		this.id = id;
 	}
 
+    public List<IServiceDescription> getServiceDescriptions()
+    {
+        return null;
+    }
+
 	@Override
 	public String toString() {
-		return "ServiceReplyEvent [return_code=" + return_code + ", message="
+		return "ServiceReplyEvent [return_code=" + (return_code ? "OK" : "NOTOK") + ", message="
 				+ message + ", endpoint=" + endpoint + ", id=" + id + "]";
 	}
 	

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=1455662&r1=1455661&r2=1455662&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 Tue Mar 12 18:23:00 2013
@@ -26,12 +26,10 @@ public class ServiceStartEvent 
     private String epname;
     private int instances;
     private boolean update;
-    private String user;
 
-	public ServiceStartEvent(String user, int friendly, String epname)
+	public ServiceStartEvent(String user, int friendly, String epname, byte[] auth_block)
     {
-		super(EventType.SERVICE_START);
-        this.user = user;
+		super(EventType.SERVICE_START, user, auth_block);
         this.friendly = friendly;
         this.epname = epname;
         this.instances = -1;         // default, don't change number of instances
@@ -65,10 +63,6 @@ public class ServiceStartEvent 
         this.update = update;
     }
 
-	public String getUser() {
-		return user;
-	}
-
 	public String toString() {
 		return "ServiceStartEvent [friendly=" + friendly + ", user=" + user + ", instances=" + instances  + ", update=" + update
 				+ "]";

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=1455662&r1=1455661&r2=1455662&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 Tue Mar 12 18:23:00 2013
@@ -18,25 +18,21 @@
 */
 package org.apache.uima.ducc.transport.event;
 
-import org.apache.uima.ducc.transport.event.sm.IService;
 
 @SuppressWarnings("serial")
 public class ServiceStopEvent 
     extends AServiceRequest
-    implements IService
 {
     private long friendly;
     private String epname;
-    private String user;
     private int instances;
     private boolean update;
 
-	public ServiceStopEvent(String user, long friendly, String epname)
+	public ServiceStopEvent(String user, long friendly, String epname, byte[] auth_block)
     {
-		super(EventType.SERVICE_STOP);
+		super(EventType.SERVICE_STOP, user, auth_block);
         this.friendly = friendly;
         this.epname = epname;
-        this.user = user;
         this.instances = -1;
 	}
 
@@ -49,10 +45,6 @@ public class ServiceStopEvent 
         return epname;
     }
 
-	public String getUser() {
-		return user;
-	}
-
     public int getInstances() {
         return instances;
     }

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=1455662&r1=1455661&r2=1455662&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 Tue Mar 12 18:23:00 2013
@@ -18,27 +18,23 @@
 */
 package org.apache.uima.ducc.transport.event;
 
-import org.apache.uima.ducc.transport.event.sm.IService;
-
 @SuppressWarnings("serial")
 public class ServiceUnregisterEvent 
     extends AServiceRequest
-    implements IService
 {
 
     private long friendly;
     private String epname;
-    private String user;
 
-	public ServiceUnregisterEvent(String user, long friendly, String epname)
+	public ServiceUnregisterEvent(String user, long friendly, String epname, byte[] auth_block)
     {
-		super(EventType.SERVICE_UNREGISTER);
+		super(EventType.SERVICE_UNREGISTER, user, auth_block);
         this.friendly = friendly;
         this.epname = epname;
-        this.user = user;
 	}
 
-	public long getFriendly() {
+	public long getFriendly() 
+    {
 		return friendly;
 	}
 
@@ -47,10 +43,6 @@ public class ServiceUnregisterEvent 
         return epname;
     }
 
-	public String getUser() {
-		return user;
-	}
-
 	@Override
 	public String toString() {
 		return "ServiceUnregisterEvent [friendly=" + friendly + ", user="

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IService.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IService.java?rev=1455662&r1=1455661&r2=1455662&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IService.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IService.java Tue Mar 12 18:23:00 2013
@@ -29,11 +29,6 @@ public interface IService
     extends Serializable
 {
     static final String NULL = "<none>";     
-    public static enum ServiceCode 
-    {
-        OK,                   // API: The requested action succeeded
-        NOTOK                 // API: the Requested action did not succeed.
-    };
 
     //
     // For boolean options, we want a trinary: true, false, unset
@@ -53,79 +48,79 @@ public interface IService
         	}
     };
 
-    public enum ServiceVerb
-    {
-        //
-        // I want to expose these things to the API with the ugly upper-case notation but don't
-        // want that ugliness in the variables, so we have encode and decode routines to do the
-        // correct translation.
-        //
-        Register    { 
-            public String decode()      { return "register"; } 
-            public String description() { return "Register a service."; } 
-            public String argname()     { return "service-DD-specification."; } 
-        },
-        Unregister  { 
-            public String decode()      { return "unregister" ; } 
-            public String description() { return "Unregister a service." ; } 
-            public String argname()     { return "service-id-or-endpoint" ; } 
-        },
-        Start       { 
-            public String decode()      { return "start"; } 
-            public String description() { return "Start a registered service." ; } 
-            public String argname()     { return "service-id-or-endpoint" ; } 
-            },
-        Stop        { 
-            public String decode()      { return "stop"; } 
-            public String description() { return "Stop a registered service." ; } 
-            public String argname()     { return "service-id-or-endpoint [--instances number-to-stop]" ; } 
-        },
-        Modify      { 
-            public String decode()      { return "modify"; } 
-            public String description() { return "Modify meta properties for a registered service." ; } 
-            public String argname()     { return "modify-parameters" ; } 
-        },
-        Query       { 
-            public String decode()      { return "query"; } 
-            public String description() { return "Query registered services." ; } 
-            public String argname()     { return "none" ; } 
-        },
-        Help        { 
-            public String decode()      { return "help"; } 
-            public String description() { return "This help message." ; } 
-            public String argname()     { return "none" ; } 
-        },
-        Debug       { 
-            public String decode()      { return "debug"; } 
-            public String description() { return "Debug cli" ; } 
-            public String argname()     { return "none" ; } 
-        },
-        Unknown     { 
-            public String decode()      { return "unknown"; } 
-            public String description() { return "unknown" ; } 
-            public String argname()     { return "unknown" ; } 
-        },
-        ;
-
-        public abstract String decode();
-        public abstract String description();
-        public abstract String argname();
+//     public enum ServiceVerb
+//     {
+//         //
+//         // I want to expose these things to the API with the ugly upper-case notation but don't
+//         // want that ugliness in the variables, so we have encode and decode routines to do the
+//         // correct translation.
+//         //
+//         Register    { 
+//             public String decode()      { return "register"; } 
+//             public String description() { return "Register a service."; } 
+//             public String argname()     { return "service-DD-specification."; } 
+//         },
+//         Unregister  { 
+//             public String decode()      { return "unregister" ; } 
+//             public String description() { return "Unregister a service." ; } 
+//             public String argname()     { return "service-id-or-endpoint" ; } 
+//         },
+//         Start       { 
+//             public String decode()      { return "start"; } 
+//             public String description() { return "Start a registered service." ; } 
+//             public String argname()     { return "service-id-or-endpoint" ; } 
+//             },
+//         Stop        { 
+//             public String decode()      { return "stop"; } 
+//             public String description() { return "Stop a registered service." ; } 
+//             public String argname()     { return "service-id-or-endpoint [--instances number-to-stop]" ; } 
+//         },
+//         Modify      { 
+//             public String decode()      { return "modify"; } 
+//             public String description() { return "Modify meta properties for a registered service." ; } 
+//             public String argname()     { return "modify-parameters" ; } 
+//         },
+//         Query       { 
+//             public String decode()      { return "query"; } 
+//             public String description() { return "Query registered services." ; } 
+//             public String argname()     { return "none" ; } 
+//         },
+//         Help        { 
+//             public String decode()      { return "help"; } 
+//             public String description() { return "This help message." ; } 
+//             public String argname()     { return "none" ; } 
+//         },
+//         Debug       { 
+//             public String decode()      { return "debug"; } 
+//             public String description() { return "Debug cli" ; } 
+//             public String argname()     { return "none" ; } 
+//         },
+//         Unknown     { 
+//             public String decode()      { return "unknown"; } 
+//             public String description() { return "unknown" ; } 
+//             public String argname()     { return "unknown" ; } 
+//         },
+//         ;
+
+//         public abstract String decode();
+//         public abstract String description();
+//         public abstract String argname();
         
-        public static ServiceVerb encode(String value)
-        {
-            if ( value.equals("register") )   return Register;
-            if ( value.equals("unregister") ) return Unregister;
-            if ( value.equals("start") )      return Start;
-            if ( value.equals("stop") )       return Stop;
-            if ( value.equals("modify") )     return Modify;
-            if ( value.equals("query") )      return Query;
-            if ( value.equals("help") )       return Help;
-            if ( value.equals("debug") )      return Debug;
+//         public static ServiceVerb encode(String value)
+//         {
+//             if ( value.equals("register") )   return Register;
+//             if ( value.equals("unregister") ) return Unregister;
+//             if ( value.equals("start") )      return Start;
+//             if ( value.equals("stop") )       return Stop;
+//             if ( value.equals("modify") )     return Modify;
+//             if ( value.equals("query") )      return Query;
+//             if ( value.equals("help") )       return Help;
+//             if ( value.equals("debug") )      return Debug;
 
-            return Unknown;
-        }
+//             return Unknown;
+//         }
 
-    };
+//     };
 
     public enum ServiceType
     {

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IServiceDescription.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IServiceDescription.java?rev=1455662&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IServiceDescription.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IServiceDescription.java Tue Mar 12 18:23:00 2013
@@ -0,0 +1,85 @@
+/*
+ * 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.transport.event.sm;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+import org.apache.uima.ducc.common.ServiceStatistics;
+import org.apache.uima.ducc.common.utils.id.DuccId;
+import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
+
+public interface IServiceDescription
+    extends IService
+{
+
+	public DuccId getId();
+	public void setId(DuccId id);
+
+	public ArrayList<DuccId> getImplementors();
+	public void setImplementors(ArrayList<DuccId> implementors);
+
+	public ArrayList<DuccId> getReferences();
+	public void setReferences(ArrayList<DuccId> references);
+
+	public ServiceType getType();
+	public void setType(ServiceType type);
+
+	public ServiceClass getSubclass();
+	public void setSubclass(ServiceClass subclass);
+
+	public String getEndpoint();
+	public void setEndpoint(String endpoint);
+
+	public String getBroker();
+	public void setBroker(String broker);
+
+	public ServiceState getServiceState();
+	public void setServiceState(ServiceState serviceState);
+
+	public JobState getJobState();
+	public void setJobState(JobState jobState);
+
+	public boolean isActive();
+	public void setActive(boolean active);
+
+	public void setDeregistered(boolean d);	
+    public void setQueueStatistics(ServiceStatistics qstats);    
+
+    public ServiceStatistics getQueueStatistics();
+    public void setAutostart(boolean autostart);
+
+	public boolean isStopped();
+	public void setStopped(boolean stopped);
+
+	public ServiceStatistics getQstats();
+	public void setQstats(ServiceStatistics qstats);
+
+	public boolean isDeregistered();
+
+	public void setInstances(int instances);
+    public int getInstances();
+
+    public void setLinger(long linger);    
+    public long getLinger();    
+
+    public void addDependency(String endpoint, String msg);
+    public Map<String, String> getDependencies();
+
+}

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IServiceReply.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IServiceReply.java?rev=1455662&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IServiceReply.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/IServiceReply.java Tue Mar 12 18:23:00 2013
@@ -0,0 +1,31 @@
+/*
+ * 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.transport.event.sm;
+
+import java.util.List;
+
+public interface IServiceReply
+{
+    public boolean getReturnCode();
+    public String getMessage();
+    public String getEndpoint();
+    public long getId();
+
+    public List<IServiceDescription> getServiceDescriptions();
+}

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/ServiceDescription.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/ServiceDescription.java?rev=1455662&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/ServiceDescription.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/sm/ServiceDescription.java Tue Mar 12 18:23:00 2013
@@ -0,0 +1,333 @@
+/*
+ * 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.transport.event.sm;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.uima.ducc.common.ServiceStatistics;
+import org.apache.uima.ducc.common.utils.id.DuccId;
+import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
+
+
+
+public class ServiceDescription
+    implements IServiceDescription
+{
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	// For submitted and registered services
+    private ArrayList<DuccId> implementors;
+
+    // key is job/service id, value is same.  it's a map for fast existence check
+    private ArrayList<DuccId> references;
+
+    // UIMA-AS or CUSTOM
+    private ServiceType type;
+
+    // Implicit, Submitted, Registered
+    private ServiceClass subclass;
+
+    // for uima-as
+    private String endpoint;
+    private String broker;
+
+    // The state we give OR - indicates availability of the service
+    private ServiceState serviceState = ServiceState.Undefined;     
+    
+    // The state of the service as a DUCC job
+    private JobState     jobState;
+
+	// ping thread alive
+    private boolean active;
+
+    // current autorstart state
+    private boolean autostart = true;
+
+    // manual stop?
+    private boolean stopped = false;
+
+    // for submitted service, the registered service id
+    private DuccId id;
+    private boolean deregistered;         // still known but trying to shutdown
+
+    // number of registered instances
+    private int instances;                
+
+    private long linger;
+    private Map<String, String> dependencies;
+
+    private ServiceStatistics qstats;
+
+	public DuccId getId() {
+		return id;
+	}
+
+	public void setId(DuccId id) {
+		this.id = id;
+	}
+
+	public ArrayList<DuccId> getImplementors() {
+		return implementors;
+	}
+
+	public void setImplementors(ArrayList<DuccId> implementors) {
+		this.implementors = implementors;
+	}
+
+	public ArrayList<DuccId> getReferences() {
+		return references;
+	}
+
+	public void setReferences(ArrayList<DuccId> references) {
+		this.references = references;
+	}
+
+	public ServiceType getType() {
+		return type;
+	}
+
+	public void setType(ServiceType type) {
+		this.type = type;
+	}
+
+	public ServiceClass getSubclass() {
+		return subclass;
+	}
+
+	public void setSubclass(ServiceClass subclass) {
+		this.subclass = subclass;
+	}
+
+	public String getEndpoint() {
+		return endpoint;
+	}
+
+	public void setEndpoint(String endpoint) {
+		this.endpoint = endpoint;
+	}
+
+	public String getBroker() {
+		return broker;
+	}
+
+	public void setBroker(String broker) {
+		this.broker = broker;
+	}
+
+	public ServiceState getServiceState() {
+		return serviceState;
+	}
+
+	public void setServiceState(ServiceState serviceState) {
+		this.serviceState = serviceState;
+	}
+
+	public JobState getJobState() {
+		return jobState;
+	}
+
+	public void setJobState(JobState jobState) {
+		this.jobState = jobState;
+	}
+
+	public boolean isActive() {
+		return active;
+	}
+
+	public void setActive(boolean active) {
+		this.active = active;
+	}
+
+	public void setDeregistered(boolean d)
+	{
+		this.deregistered = d;
+	}
+	
+    public void setQueueStatistics(ServiceStatistics qstats)
+    {
+        this.qstats = qstats;
+    }
+
+    public ServiceStatistics getQueueStatistics()
+    {
+        return qstats;
+    }
+
+    
+    public boolean isAutostart() {
+		return autostart;
+	}
+
+	public void setAutostart(boolean autostart) {
+		this.autostart = autostart;
+	}
+
+	public boolean isStopped() {
+		return stopped;
+	}
+
+	public void setStopped(boolean stopped) {
+		this.stopped = stopped;
+	}
+
+	public ServiceStatistics getQstats() {
+		return qstats;
+	}
+
+	public void setQstats(ServiceStatistics qstats) {
+		this.qstats = qstats;
+	}
+
+	public boolean isDeregistered() {
+		return deregistered;
+	}
+
+	public void setInstances(int instances)
+    {
+        this.instances = instances;
+    }
+
+    public int getInstances()
+    {
+        return instances;
+    }
+
+    public void setLinger(long linger)
+    {
+    	this.linger = linger;
+    }
+    
+    public long getLinger()
+    {
+    	return this.linger;
+    }
+    
+    public void addDependency(String endpoint, String msg)
+    {
+        if ( this.dependencies == null ) {
+            this.dependencies = new HashMap<String, String>();
+        }
+        this.dependencies.put(endpoint, msg);
+    }
+
+    public Map<String, String> getDependencies()
+    {
+    		return this.dependencies;
+    }
+    
+    public String toString()
+    {
+        StringBuffer sb = new StringBuffer();
+        sb.append("Service: ");
+        sb.append(type.decode());
+        sb.append(":");
+        sb.append(endpoint);
+
+        if ( type == ServiceType.UimaAs ) {
+            sb.append(":");
+            sb.append(broker);
+        }
+        sb.append("\n");
+
+        sb.append("   Service Class   : ");
+        sb.append(subclass.decode());
+        switch ( subclass ) {
+            case Registered:
+                sb.append(" as ID ");
+                sb.append(id);
+                sb.append(" instances[");
+                sb.append(Integer.toString(instances));
+                sb.append("] linger[");
+                sb.append(Long.toString(linger));
+                sb.append("]");
+                break;
+            case Submitted:
+            case Implicit:
+            default:
+        }
+        sb.append("\n");
+
+        sb.append("   Implementors    : ");
+        if ( implementors.size() > 0 ) {
+            for (DuccId id : implementors) {
+                sb.append(id);
+                sb.append(" ");
+            }
+        } else {
+            sb.append("(N/A)");
+        }
+        sb.append("\n");
+
+        sb.append("   References      : ");
+        if ( references.size() > 0 ) {
+            for ( DuccId id : references ) {
+                sb.append(id);
+                sb.append(" ");
+            }
+        } else {
+            sb.append("None");
+        }
+        sb.append("\n");
+
+        sb.append("   Dependencies    : ");
+        if ( dependencies == null ) {
+            sb.append("none\n");
+        } else {
+            sb.append("\n");
+            for ( String s : dependencies.keySet() ) {
+                sb.append("      ");
+                sb.append(s);
+                sb.append(": ");
+                sb.append(dependencies.get(s));
+                sb.append("\n");
+            }
+        }
+
+        sb.append("   Service State   : ");
+        sb.append(serviceState);
+        sb.append("\n");
+
+        sb.append("   Ping Active     : ");
+        sb.append(active);
+        sb.append("\n");
+
+        sb.append("   Autostart       : ");
+        sb.append(autostart);
+        sb.append("\n");
+        
+        sb.append("   Manual Stop     : ");
+        sb.append(stopped);
+        sb.append("\n");
+
+        sb.append("   Service Statistics: ");
+        if ( qstats == null ) {
+            sb.append("None\n");
+        } else {
+            sb.append("\n       ");            
+            sb.append(qstats.toString());
+        }
+        return sb.toString();
+    }
+
+}