You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by de...@apache.org on 2013/01/28 21:17:39 UTC

svn commit: r1439607 - in /uima/sandbox/uima-ducc/trunk: uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/ uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/ uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/even...

Author: degenaro
Date: Mon Jan 28 20:17:38 2013
New Revision: 1439607

URL: http://svn.apache.org/viewvc?rev=1439607&view=rev
Log:
UIMA-2606 CLI, Orchestrator and Transport updates for improved cancel-by-administrator functionality

Modified:
    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/DuccReservationCancel.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/DuccUiConstants.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/cli/SpecificationProperties.java

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=1439607&r1=1439606&r2=1439607&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 Mon Jan 28 20:17:38 2013
@@ -60,6 +60,9 @@ public class DuccJobCancel extends DuccU
 				.withDescription(DuccUiConstants.desc_help).hasArg(false)
 				.withLongOpt(DuccUiConstants.name_help).create());
 		options.addOption(OptionBuilder
+				.withDescription(DuccUiConstants.desc_role_administrator).hasArg(false)
+				.withLongOpt(DuccUiConstants.name_role_administrator).create());
+		options.addOption(OptionBuilder
 				.withArgName(DuccUiConstants.parm_job_id)
 				.withDescription(makeDesc(DuccUiConstants.desc_job_id,DuccUiConstants.exmp_job_id)).hasArg()
 				.withLongOpt(DuccUiConstants.name_job_id).create());
@@ -140,6 +143,9 @@ public class DuccJobCancel extends DuccU
 				Option option = optionList[i];
 				String name = option.getLongOpt();
 				String value = option.getValue();
+				if(value == null) {
+					value = "";
+				}
 				jobRequestProperties.setProperty(name, value);
 			}
 		}

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=1439607&r1=1439606&r2=1439607&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 Mon Jan 28 20:17:38 2013
@@ -60,6 +60,9 @@ public class DuccReservationCancel exten
 				.withDescription(DuccUiConstants.desc_help).hasArg(false)
 				.withLongOpt(DuccUiConstants.name_help).create());
 		options.addOption(OptionBuilder
+				.withDescription(DuccUiConstants.desc_role_administrator).hasArg(false)
+				.withLongOpt(DuccUiConstants.name_role_administrator).create());
+		options.addOption(OptionBuilder
 				.withArgName(DuccUiConstants.parm_reservation_id)
 				.withDescription(makeDesc(DuccUiConstants.desc_reservation_id,DuccUiConstants.exmp_reservation_id)).hasArg()
 				.withLongOpt(DuccUiConstants.name_reservation_id).create());
@@ -138,6 +141,9 @@ public class DuccReservationCancel exten
 				String value = option.getValue();
 				name = trimmer(name);
 				value = trimmer(value);
+				if(value == null) {
+					value = "";
+				}
 				reservationRequestProperties.setProperty(name, value);
 			}
 		}

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=1439607&r1=1439606&r2=1439607&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 Mon Jan 28 20:17:38 2013
@@ -60,6 +60,9 @@ public class DuccServiceCancel extends D
 				.withDescription(DuccUiConstants.desc_help).hasArg(false)
 				.withLongOpt(DuccUiConstants.name_help).create());
 		options.addOption(OptionBuilder
+				.withDescription(DuccUiConstants.desc_role_administrator).hasArg(false)
+				.withLongOpt(DuccUiConstants.name_role_administrator).create());
+		options.addOption(OptionBuilder
 				.withArgName(DuccUiConstants.parm_service_id)
 				.withDescription(makeDesc(DuccUiConstants.desc_service_id,DuccUiConstants.exmp_service_id)).hasArg()
 				.withLongOpt(DuccUiConstants.name_service_id).create());
@@ -136,6 +139,9 @@ public class DuccServiceCancel extends D
 				Option option = optionList[i];
 				String name = option.getLongOpt();
 				String value = option.getValue();
+				if(value == null) {
+					value = "";
+				}
 				serviceRequestProperties.setProperty(name, value);
 			}
 		}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java?rev=1439607&r1=1439606&r2=1439607&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-cli/src/main/java/org/apache/uima/ducc/cli/DuccUiConstants.java Mon Jan 28 20:17:38 2013
@@ -24,6 +24,7 @@ import org.apache.uima.ducc.transport.ev
 import org.apache.uima.ducc.transport.event.cli.JobSpecificationProperties;
 import org.apache.uima.ducc.transport.event.cli.ReservationSpecificationProperties;
 import org.apache.uima.ducc.transport.event.cli.ServiceRequestProperties;
+import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;
 
 
 public class DuccUiConstants {
@@ -44,6 +45,12 @@ public class DuccUiConstants {
 	public static final String exmp_help = "";
 	public static final String dval_help = null;
 
+	public static final String name_role_administrator = SpecificationProperties.key_role_administrator;
+	public static final String desc_role_administrator = "If CLI invoker is listed in resources/ducc.administrators then allow cancellation on behalf of any user";
+	public static final String labl_role_administrator = "Administrator";
+	public static final String exmp_role_administrator = "";
+	public static final String dval_role_administrator = null;
+	
 	//public static final String abrv_timestamp = "t";
 	public static final String name_timestamp = "timestamp";
 	public static final String desc_timestamp = "Timestamp messages.";

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java?rev=1439607&r1=1439606&r2=1439607&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-orchestrator/src/main/java/org/apache/uima/ducc/orchestrator/OrchestratorComponent.java Mon Jan 28 20:17:38 2013
@@ -44,6 +44,7 @@ import org.apache.uima.ducc.common.utils
 import org.apache.uima.ducc.common.utils.TimeStamp;
 import org.apache.uima.ducc.common.utils.id.DuccId;
 import org.apache.uima.ducc.orchestrator.OrchestratorConstants.StartType;
+import org.apache.uima.ducc.orchestrator.authentication.DuccWebAdministrators;
 import org.apache.uima.ducc.orchestrator.maintenance.MaintenanceThread;
 import org.apache.uima.ducc.orchestrator.maintenance.NodeAccounting;
 import org.apache.uima.ducc.transport.event.CancelJobDuccEvent;
@@ -60,7 +61,6 @@ import org.apache.uima.ducc.transport.ev
 import org.apache.uima.ducc.transport.event.SubmitServiceDuccEvent;
 import org.apache.uima.ducc.transport.event.cli.JobReplyProperties;
 import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
-import org.apache.uima.ducc.transport.event.cli.JobSpecificationProperties;
 import org.apache.uima.ducc.transport.event.cli.ReservationReplyProperties;
 import org.apache.uima.ducc.transport.event.cli.ReservationRequestProperties;
 import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;
@@ -527,6 +527,48 @@ implements Orchestrator {
 		}
 		return retVal;
 	}
+	private String getRole(Properties properties) {
+		String methodName = "isAuthorized";
+		String role = SpecificationProperties.key_role_user;
+		try {
+			if(properties.containsKey(SpecificationProperties.key_role_administrator)) {
+				role = SpecificationProperties.key_role_administrator;
+			}
+		}
+		catch(Exception e) {
+			logger.error(methodName, null, e);
+		}
+		return role;
+	}
+	private boolean isAuthorized(DuccId duccId, String reqUser, String tgtUser, String role) {
+		String methodName = "isAuthorized";
+		boolean retVal = false;
+		try {
+			if(reqUser.equals(tgtUser)) {
+				logger.info(methodName, duccId, reqUser+" is "+tgtUser);
+				retVal = true;
+			}
+			else {
+				if(role.equals(SpecificationProperties.key_role_administrator)) {
+					DuccWebAdministrators dwa = DuccWebAdministrators.getInstance();
+					if(dwa.isAdministrator(reqUser)) {
+						logger.info(methodName, duccId, reqUser+" is "+SpecificationProperties.key_role_administrator);
+						retVal = true;
+					}
+					else {
+						logger.info(methodName, duccId, reqUser+" is not "+SpecificationProperties.key_role_administrator);
+					}
+				}
+				else {
+					logger.info(methodName, duccId, "role"+" is not "+SpecificationProperties.key_role_administrator);
+				}
+			}
+		}
+		catch(Exception e) {
+			logger.error(methodName, duccId, e);
+		}
+		return retVal;
+	}
 	/**
 	 * Handle Job Submit
 	 */
@@ -591,108 +633,132 @@ implements Orchestrator {
 	@Override
 	public void stopJob(CancelJobDuccEvent duccEvent) {
 		String methodName = "stopJob";
-		logger.trace(methodName, null, messages.fetch("enter"));
+		DuccId dwid = null;
+		logger.trace(methodName, dwid, messages.fetch("enter"));
 		Properties properties = duccEvent.getProperties();
 		if(isSignatureInvalid(properties)) {
 			String error_message = messages.fetch(" type=authentication error, text=signature not valid.");
-			logger.error(methodName, null, error_message);
+			logger.error(methodName, dwid, error_message);
 			submitError(properties, error_message);
 		}
 		else if(Validate.request(duccEvent)) {
-			// update state
 			String jobId = properties.getProperty(JobRequestProperties.key_id);
 			long t0 = System.currentTimeMillis();
 			DuccWorkJob duccWorkJob = (DuccWorkJob) workMap.findDuccWork(DuccType.Job,jobId);
 			long t1 = System.currentTimeMillis();
 			long elapsed = t1 - t0;
 			if(elapsed > Constants.SYNC_LIMIT) {
-				logger.debug(methodName, null, "elapsed msecs: "+elapsed);
+				logger.debug(methodName, dwid, "elapsed msecs: "+elapsed);
 			}
 			if(duccWorkJob != null) {
-				String userid = properties.getProperty(JobSpecificationProperties.key_user);
-				IRationale rationale = new Rationale("job canceled by userid "+userid);
-				stateManager.jobTerminate(duccWorkJob, JobCompletionType.CanceledByUser, rationale, ProcessDeallocationType.JobCanceled);
-				OrchestratorCheckpoint.getInstance().saveState();
-				// prepare for reply to canceler
-				properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_canceled);
-				duccEvent.setProperties(properties);
-				logger.info(methodName, duccWorkJob.getDuccId(), messages.fetchLabel("job state")+duccWorkJob.getJobState());
+				dwid = duccWorkJob.getDuccId();
+				String reqUser = properties.getProperty(JobRequestProperties.key_user).trim();
+				String reqRole = getRole(properties);
+				String tgtUser = duccWorkJob.getStandardInfo().getUser().trim();
+				if(isAuthorized(dwid, reqUser, tgtUser, reqRole)) {
+					logger.debug(methodName, dwid, "reqUser:"+reqUser+" "+"reqRole:"+reqRole+" "+"tgtUser:"+tgtUser);
+					IRationale rationale = new Rationale("job canceled by userid "+reqUser);
+					stateManager.jobTerminate(duccWorkJob, JobCompletionType.CanceledByUser, rationale, ProcessDeallocationType.JobCanceled);
+					OrchestratorCheckpoint.getInstance().saveState();
+					// prepare for reply to canceler
+					properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_canceled);
+					duccEvent.setProperties(properties);
+					logger.info(methodName, dwid, messages.fetchLabel("job state")+duccWorkJob.getJobState());
+				}
+				else {
+					// prepare not authorized reply 
+					properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_user_not_authorized);
+					duccEvent.setProperties(properties);
+					logger.info(methodName, dwid, jobId+" : "+messages.fetch(JobReplyProperties.msg_user_not_authorized));
+				}
 			}
 			else {
 				// prepare undefined reply 
 				properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_job_not_found);
 				duccEvent.setProperties(properties);
-				logger.info(methodName, null, jobId+" : "+messages.fetch(JobReplyProperties.msg_job_not_found));
+				logger.info(methodName, dwid, jobId+" : "+messages.fetch(JobReplyProperties.msg_job_not_found));
 			}
 		}
 		else {
-			logger.info(methodName, null, messages.fetch("TODO")+" prepare error reply");
+			logger.info(methodName, dwid, messages.fetch("TODO")+" prepare error reply");
 			//TODO
 		}
-		logger.trace(methodName, null, messages.fetch("exit"));
+		logger.trace(methodName, dwid, messages.fetch("exit"));
 		return;
 	}
 	
 	@Override
 	public void stopJobProcess(CancelJobDuccEvent duccEvent) {
 		String methodName = "stopJobProcess";
-		logger.trace(methodName, null, messages.fetch("enter"));
+		DuccId dwid = null;
+		logger.trace(methodName, dwid, messages.fetch("enter"));
 		Properties properties = duccEvent.getProperties();
 		if(isSignatureInvalid(properties)) {
 			String error_message = messages.fetch(" type=authentication error, text=signature not valid.");
-			logger.error(methodName, null, error_message);
+			logger.error(methodName, dwid, error_message);
 			submitError(properties, error_message);
 		}
 		else if(Validate.request(duccEvent)) {
-			DuccId djid = null;
 			String dpid = null;
 			String jobId = properties.getProperty(JobRequestProperties.key_id);
 			DuccWorkJob duccWorkJob = (DuccWorkJob) workMap.findDuccWork(DuccType.Job,jobId);
 			if(duccWorkJob != null) {
-				djid = duccWorkJob.getDuccId();
-				dpid = properties.getProperty(JobReplyProperties.key_dpid);
-				IDuccProcess idp = duccWorkJob.getProcess(dpid);
-				if(idp != null) {
-					switch(idp.getProcessState()) {
-					case Starting:
-					case Initializing:
-					case Running:
-						idp.setResourceState(ResourceState.Deallocated);
-						idp.setProcessState(ProcessState.Abandoned);
-						idp.setProcessDeallocationType(ProcessDeallocationType.Canceled);
-						idp.setReasonForStoppingProcess(ReasonForStoppingProcess.UserInitiated.toString());
-						// prepare process not active 
-						properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_process_canceled);
-						duccEvent.setProperties(properties);
-						logger.info(methodName, djid, dpid, messages.fetch(JobReplyProperties.msg_process_canceled));
-						break;
-					default:
-						// prepare process not active 
-						properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_process_not_active);
+				dwid = duccWorkJob.getDuccId();
+				String reqUser = properties.getProperty(JobRequestProperties.key_user).trim();
+				String reqRole = getRole(properties);
+				String tgtUser = duccWorkJob.getStandardInfo().getUser().trim();
+				if(isAuthorized(dwid, reqUser, tgtUser, reqRole)) {
+					logger.debug(methodName, dwid, "reqUser:"+reqUser+" "+"reqRole:"+reqRole+" "+"tgtUser:"+tgtUser);
+					dpid = properties.getProperty(JobReplyProperties.key_dpid);
+					IDuccProcess idp = duccWorkJob.getProcess(dpid);
+					if(idp != null) {
+						switch(idp.getProcessState()) {
+						case Starting:
+						case Initializing:
+						case Running:
+							idp.setResourceState(ResourceState.Deallocated);
+							idp.setProcessState(ProcessState.Abandoned);
+							idp.setProcessDeallocationType(ProcessDeallocationType.Canceled);
+							idp.setReasonForStoppingProcess(ReasonForStoppingProcess.UserInitiated.toString());
+							// prepare process not active 
+							properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_process_canceled);
+							duccEvent.setProperties(properties);
+							logger.info(methodName, dwid, dpid, messages.fetch(JobReplyProperties.msg_process_canceled));
+							break;
+						default:
+							// prepare process not active 
+							properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_process_not_active);
+							duccEvent.setProperties(properties);
+							logger.info(methodName, dwid, dpid, messages.fetch(JobReplyProperties.msg_process_not_active));
+							break;
+						}
+					}
+					else {
+						// prepare process not found reply 
+						properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_process_not_found);
 						duccEvent.setProperties(properties);
-						logger.info(methodName, djid, dpid, messages.fetch(JobReplyProperties.msg_process_not_active));
-						break;
+						logger.info(methodName, dwid, dpid, messages.fetch(JobReplyProperties.msg_process_not_found));
 					}
 				}
 				else {
-					// prepare process not found reply 
-					properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_process_not_found);
+					// prepare not authorized reply 
+					properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_user_not_authorized);
 					duccEvent.setProperties(properties);
-					logger.info(methodName, djid, dpid, messages.fetch(JobReplyProperties.msg_process_not_found));
+					logger.info(methodName, dwid, jobId+" : "+messages.fetch(JobReplyProperties.msg_user_not_authorized));
 				}
 			}
 			else {
 				// prepare job not found 
 				properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_job_not_found);
 				duccEvent.setProperties(properties);
-				logger.info(methodName, djid, dpid, messages.fetch(JobReplyProperties.msg_job_not_found));
+				logger.info(methodName, dwid, dpid, messages.fetch(JobReplyProperties.msg_job_not_found));
 			}
 		}
 		else {
-			logger.info(methodName, null, messages.fetch("TODO")+" prepare error reply");
+			logger.info(methodName, dwid, messages.fetch("TODO")+" prepare error reply");
 			//TODO
 		}
-		logger.trace(methodName, null, messages.fetch("exit"));
+		logger.trace(methodName, dwid, messages.fetch("exit"));
 		return;
 	}
 	
@@ -766,59 +832,71 @@ implements Orchestrator {
 	@Override
 	public void stopReservation(CancelReservationDuccEvent duccEvent) {
 		String methodName = "stopReservation";
-		logger.trace(methodName, null, messages.fetch("enter"));
+		DuccId dwid = null;
+		logger.trace(methodName, dwid, messages.fetch("enter"));
 		Properties properties = duccEvent.getProperties();
 		if(isSignatureInvalid(properties)) {
 			String error_message = messages.fetch(" type=authentication error, text=signature not valid.");
-			logger.error(methodName, null, error_message);
+			logger.error(methodName, dwid, error_message);
 			submitError(properties, error_message);
 		}
 		else {
-			// update state
 			String id = properties.getProperty(ReservationRequestProperties.key_id);
 			long t0 = System.currentTimeMillis();
 			DuccWorkReservation duccWorkReservation = (DuccWorkReservation) workMap.findDuccWork(DuccType.Reservation,id);
 			long t1 = System.currentTimeMillis();
 			long elapsed = t1 - t0;
 			if(elapsed > Constants.SYNC_LIMIT) {
-				logger.debug(methodName, null, "elapsed msecs: "+elapsed);
+				logger.debug(methodName, dwid, "elapsed msecs: "+elapsed);
 			}
 			if(Validate.request(duccEvent,duccWorkReservation)) {
 				if(duccWorkReservation != null) {
-					String cancelUser = properties.getProperty(SpecificationProperties.key_user);
-					duccWorkReservation.getStandardInfo().setCancelUser(cancelUser);
-					duccWorkReservation.getStandardInfo().setDateOfCompletion(TimeStamp.getCurrentMillis());
-					duccWorkReservation.stateChange(ReservationState.Completed);
-					duccWorkReservation.complete(ReservationCompletionType.CanceledByUser);
-					String u1 = duccWorkReservation.getStandardInfo().getUser();
-					String u2 = duccWorkReservation.getStandardInfo().getCancelUser();
-					if(u1 != null) {
-						if(u2 != null) {
-							if(!u1.equals(u2)) {
-								duccWorkReservation.complete(ReservationCompletionType.CanceledByAdmin);
+					dwid = duccWorkReservation.getDuccId();
+					String reqUser = properties.getProperty(JobRequestProperties.key_user).trim();
+					String reqRole = getRole(properties);
+					String tgtUser = duccWorkReservation.getStandardInfo().getUser().trim();
+					if(isAuthorized(dwid, reqUser, tgtUser, reqRole)) {
+						logger.debug(methodName, dwid, "reqUser:"+reqUser+" "+"reqRole:"+reqRole+" "+"tgtUser:"+tgtUser);
+						duccWorkReservation.getStandardInfo().setCancelUser(reqUser);
+						duccWorkReservation.getStandardInfo().setDateOfCompletion(TimeStamp.getCurrentMillis());
+						duccWorkReservation.stateChange(ReservationState.Completed);
+						duccWorkReservation.complete(ReservationCompletionType.CanceledByUser);
+						String u1 = duccWorkReservation.getStandardInfo().getUser();
+						String u2 = duccWorkReservation.getStandardInfo().getCancelUser();
+						if(u1 != null) {
+							if(u2 != null) {
+								if(!u1.equals(u2)) {
+									duccWorkReservation.complete(ReservationCompletionType.CanceledByAdmin);
+								}
 							}
 						}
+						OrchestratorCheckpoint.getInstance().saveState();
+						// prepare for reply to canceler
+						properties.put(ReservationReplyProperties.key_message, ReservationReplyProperties.msg_canceled);
+						duccEvent.setProperties(properties);
+						logger.info(methodName, dwid, messages.fetchLabel("reservation state")+duccWorkReservation.getReservationState());
+					}
+					else {
+						// prepare not authorized reply 
+						properties.put(ReservationReplyProperties.key_message, ReservationReplyProperties.msg_user_not_authorized);
+						duccEvent.setProperties(properties);
+						logger.info(methodName, dwid, dwid+" : "+messages.fetch(ReservationReplyProperties.msg_user_not_authorized));
 					}
-					OrchestratorCheckpoint.getInstance().saveState();
-					// prepare for reply to canceler
-					properties.put(ReservationReplyProperties.key_message, ReservationReplyProperties.msg_canceled);
-					duccEvent.setProperties(properties);
-					logger.info(methodName, duccWorkReservation.getDuccId(), messages.fetchLabel("reservation state")+duccWorkReservation.getReservationState());
 				}
 				else {
 					// prepare undefined reply 
 					properties.put(ReservationReplyProperties.key_message, ReservationReplyProperties.msg_not_found);
 					duccEvent.setProperties(properties);
-					logger.info(methodName, null, id+" : "+messages.fetch("reservation not found"));
+					logger.info(methodName, dwid, id+" : "+messages.fetch("reservation not found"));
 				}
 			}
 			else {
 				properties.put(ReservationReplyProperties.key_message, ReservationReplyProperties.msg_user_not_authorized);
 				duccEvent.setProperties(properties);
-				logger.info(methodName, null, id+" : "+messages.fetch("not authorized"));
+				logger.info(methodName, dwid, id+" : "+messages.fetch("not authorized"));
 			}
 		}
-		logger.trace(methodName, null, messages.fetch("exit"));
+		logger.trace(methodName, dwid, messages.fetch("exit"));
 		return;
 	}
 	
@@ -888,11 +966,12 @@ implements Orchestrator {
 	@Override
 	public void stopService(CancelServiceDuccEvent duccEvent) {
 		String methodName = "stopService";
-		logger.trace(methodName, null, messages.fetch("enter"));
+		DuccId dwid = null;
+		logger.trace(methodName, dwid, messages.fetch("enter"));
 		Properties properties = duccEvent.getProperties();
 		if(isSignatureInvalid(properties)) {
 			String error_message = messages.fetch(" type=authentication error, text=signature not valid.");
-			logger.error(methodName, null, error_message);
+			logger.error(methodName, dwid, error_message);
 			submitError(properties, error_message);
 		}
 		else if(Validate.request(duccEvent)) {
@@ -903,31 +982,42 @@ implements Orchestrator {
 			long t1 = System.currentTimeMillis();
 			long elapsed = t1 - t0;
 			if(elapsed > Constants.SYNC_LIMIT) {
-				logger.debug(methodName, null, "elapsed msecs: "+elapsed);
+				logger.debug(methodName, dwid, "elapsed msecs: "+elapsed);
 			}
 			if(duccWorkJob != null) {
-				String userid = properties.getProperty(JobSpecificationProperties.key_user);
-				IRationale rationale = new Rationale("service canceled by "+userid);
-				stateManager.jobTerminate(duccWorkJob, JobCompletionType.CanceledByUser, rationale, ProcessDeallocationType.JobCanceled);
-				OrchestratorCheckpoint.getInstance().saveState();
-				// prepare for reply to canceler
-				properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_canceled);
-				duccEvent.setProperties(properties);
-				logger.info(methodName, duccWorkJob.getDuccId(), messages.fetchLabel("service state")+duccWorkJob.getJobState());
+				dwid = duccWorkJob.getDuccId();
+				String reqUser = properties.getProperty(JobRequestProperties.key_user).trim();
+				String reqRole = getRole(properties);
+				String tgtUser = duccWorkJob.getStandardInfo().getUser().trim();
+				if(isAuthorized(dwid, reqUser, tgtUser, reqRole)) {
+					logger.debug(methodName, dwid, "reqUser:"+reqUser+" "+"reqRole:"+reqRole+" "+"tgtUser:"+tgtUser);
+					IRationale rationale = new Rationale("service canceled by "+reqUser);
+					stateManager.jobTerminate(duccWorkJob, JobCompletionType.CanceledByUser, rationale, ProcessDeallocationType.JobCanceled);
+					OrchestratorCheckpoint.getInstance().saveState();
+					// prepare for reply to canceler
+					properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_canceled);
+					duccEvent.setProperties(properties);
+					logger.info(methodName, dwid, messages.fetchLabel("service state")+duccWorkJob.getJobState());
+				}
+				else {
+					// prepare not authorized reply 
+					properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_user_not_authorized);
+					duccEvent.setProperties(properties);
+					logger.info(methodName, dwid, jobId+" : "+messages.fetch(JobReplyProperties.msg_user_not_authorized));
+				}
 			}
-			
 			else {
 				// prepare undefined reply 
 				properties.put(JobReplyProperties.key_message, JobReplyProperties.msg_service_not_found);
 				duccEvent.setProperties(properties);
-				logger.info(methodName, null, jobId+" : "+messages.fetch(JobReplyProperties.msg_service_not_found));
+				logger.info(methodName, dwid, jobId+" : "+messages.fetch(JobReplyProperties.msg_service_not_found));
 			}
 		}
 		else {
-			logger.info(methodName, null, messages.fetch("TODO")+" prepare error reply");
+			logger.info(methodName, dwid, messages.fetch("TODO")+" prepare error reply");
 			//TODO
 		}
-		logger.trace(methodName, null, messages.fetch("exit"));
+		logger.trace(methodName, dwid, messages.fetch("exit"));
 		return;
 	}
 }

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/cli/SpecificationProperties.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/cli/SpecificationProperties.java?rev=1439607&r1=1439606&r2=1439607&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/cli/SpecificationProperties.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-transport/src/main/java/org/apache/uima/ducc/transport/event/cli/SpecificationProperties.java Mon Jan 28 20:17:38 2013
@@ -33,6 +33,9 @@ public class SpecificationProperties ext
 	public static String key_user = "user";
 	public static String key_date = "date";
 	
+	public static String key_role_administrator = "role_administrator";
+	public static String key_role_user = "role_user";
+	
 	public static String key_description = "description";
 	
 	public static String key_scheduling_class = "scheduling_class";