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/03/19 17:00:01 UTC

svn commit: r1458366 - in /uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main: java/org/apache/uima/ducc/ws/server/ webapp/root/

Author: degenaro
Date: Tue Mar 19 16:00:00 2013
New Revision: 1458366

URL: http://svn.apache.org/r1458366
Log:
UIMA-2732 DUCC support for monitoring of Managed Reservations, WS enhancements

Added:
    uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java
Modified:
    uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java
    uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccAbstractHandler.java Tue Mar 19 16:00:00 2013
@@ -896,10 +896,10 @@ public abstract class DuccAbstractHandle
 		return retVal;
 	}
 	
-	protected String getMonitor(DuccId duccId, boolean multi) {
+	protected String getMonitor(DuccId duccId, DuccType type, boolean multi) {
 		StringBuffer sb = new StringBuffer();
 		DuccWebMonitor duccWebMonitor = DuccWebMonitor.getInstance();
-		Long expiry = duccWebMonitor.getExpiry(DuccType.Job, duccId);
+		Long expiry = duccWebMonitor.getExpiry(type, duccId);
 		if(!duccWebMonitor.isAutoCancelEnabled()) {
 			if(expiry != null) {
 				String text = "webserver not primary";

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java Tue Mar 19 16:00:00 2013
@@ -58,7 +58,9 @@ import org.apache.uima.ducc.transport.ev
 import org.apache.uima.ducc.transport.event.common.IDuccReservation;
 import org.apache.uima.ducc.transport.event.common.IDuccReservationMap;
 import org.apache.uima.ducc.transport.event.common.IDuccState.ReservationState;
+import org.apache.uima.ducc.transport.event.common.IDuccTypes.DuccType;
 import org.apache.uima.ducc.transport.event.common.IDuccUnits.MemoryUnits;
+import org.apache.uima.ducc.transport.event.common.IDuccProcess;
 import org.apache.uima.ducc.transport.event.common.IDuccWork;
 import org.apache.uima.ducc.transport.event.common.IDuccWorkJob;
 import org.apache.uima.ducc.transport.event.common.IRationale;
@@ -110,6 +112,74 @@ public class DuccHandlerJsonFormat exten
 		return dir_home+File.separator+dir_resources+File.separator+getDuccWebServer().getClassDefinitionFile();
 	}
 	
+	private StringBuffer getReason(IDuccWorkJob job, DuccType type) {
+		StringBuffer sb = new StringBuffer();
+		if(job != null) {
+			DuccId duccId = job.getDuccId();
+			sb = new StringBuffer();
+			if(job.isOperational()) {
+				boolean multi = false;
+				sb.append("<span>");
+				ArrayList<String> swappingMachines = getSwappingMachines(job);
+				if(!swappingMachines.isEmpty()) {
+					StringBuffer mb = new StringBuffer();
+					for(String machine : swappingMachines) {
+						mb.append(machine);
+						mb.append(" ");
+					}
+					String ml = mb.toString().trim();
+					if(multi) {
+						sb.append(" ");
+					}
+					multi = true;
+					sb.append("<span class=\"health_red\" title=\""+ml+"\">");
+					sb.append("Swapping");
+					sb.append("</span>");
+				}
+				sb.append("</span>");
+				//
+				String monitor = getMonitor(duccId, type, multi);
+				if(monitor.length() > 0) {
+					multi = true;
+					sb.append(monitor);
+				}
+			}
+			else if(job.isCompleted()) {
+				JobCompletionType jobCompletionType = job.getCompletionType();
+				switch(jobCompletionType) {
+				case EndOfJob:
+					try {
+						int total = job.getSchedulingInfo().getIntWorkItemsTotal();
+						int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
+						int error = job.getSchedulingInfo().getIntWorkItemsError();
+						if(total != (done+error)) {
+							jobCompletionType = JobCompletionType.Premature;
+						}
+					}
+					catch(Exception e) {
+					}
+					sb.append("<span>");
+					break;
+				case Undefined:
+					sb.append("<span>");
+					break;
+				default:
+					IRationale rationale = job.getCompletionRationale();
+					if(rationale != null) {
+						sb.append("<span title=\""+rationale+"\">");
+					}
+					else {
+						sb.append("<span>");
+					}
+					break;
+				}
+				sb.append(jobCompletionType);
+				sb.append("</span>");
+			}
+		}
+		return sb;
+	}
+	
 	private JsonArray buildJobRow(HttpServletRequest request, IDuccWorkJob job, DuccData duccData, ServicesRegistry servicesRegistry) {
 		String type="Job";
 		JsonArray row = new JsonArray();
@@ -179,66 +249,7 @@ public class DuccHandlerJsonFormat exten
 		sb.append("</span>");
 		row.add(new JsonPrimitive(sb.toString()));
 		// Reason
-		sb = new StringBuffer();
-		if(job.isOperational()) {
-			boolean multi = false;
-			sb.append("<span>");
-			ArrayList<String> swappingMachines = getSwappingMachines(job);
-			if(!swappingMachines.isEmpty()) {
-				StringBuffer mb = new StringBuffer();
-				for(String machine : swappingMachines) {
-					mb.append(machine);
-					mb.append(" ");
-				}
-				String ml = mb.toString().trim();
-				if(multi) {
-					sb.append(" ");
-				}
-				multi = true;
-				sb.append("<span class=\"health_red\" title=\""+ml+"\">");
-				sb.append("Swapping");
-				sb.append("</span>");
-			}
-			sb.append("</span>");
-			//
-			String monitor = getMonitor(duccId, multi);
-			if(monitor.length() > 0) {
-				multi = true;
-				sb.append(monitor);
-			}
-		}
-		else if(job.isCompleted()) {
-			JobCompletionType jobCompletionType = job.getCompletionType();
-			switch(jobCompletionType) {
-			case EndOfJob:
-				try {
-					int total = job.getSchedulingInfo().getIntWorkItemsTotal();
-					int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
-					int error = job.getSchedulingInfo().getIntWorkItemsError();
-					if(total != (done+error)) {
-						jobCompletionType = JobCompletionType.Premature;
-					}
-				}
-				catch(Exception e) {
-				}
-				sb.append("<span>");
-				break;
-			case Undefined:
-				sb.append("<span>");
-				break;
-			default:
-				IRationale rationale = job.getCompletionRationale();
-				if(rationale != null) {
-					sb.append("<span title=\""+rationale+"\">");
-				}
-				else {
-					sb.append("<span>");
-				}
-				break;
-			}
-			sb.append(jobCompletionType);
-			sb.append("</span>");
-		}
+		sb = getReason(job,DuccType.Job);
 		row.add(new JsonPrimitive(sb.toString()));
 		// Services
 		sb = new StringBuffer();
@@ -667,56 +678,9 @@ public class DuccHandlerJsonFormat exten
 			}
 		}
 		else if(duccwork instanceof DuccWorkJob) {
+			// Reason
 			DuccWorkJob job = (DuccWorkJob) duccwork;
-			switch(job.getCompletionType()) {
-			case Undefined:
-				break;
-			case CanceledByUser:
-			case CanceledByAdministrator:
-				try {
-					String cancelUser = duccwork.getStandardInfo().getCancelUser();
-					if(cancelUser != null) {
-						sb.append("<span title=\"canceled by "+cancelUser+"\">");
-						sb.append(duccwork.getCompletionTypeObject().toString());
-						sb.append("</span>");
-					}
-					else {							
-						IRationale rationale = job.getCompletionRationale();
-						if(rationale != null) {
-							sb.append("<span title=\""+rationale+"\">");
-							sb.append(duccwork.getCompletionTypeObject().toString());
-							sb.append("</span>");
-						}
-						else {
-							sb.append(duccwork.getCompletionTypeObject().toString());
-						}
-						
-					}
-				} 
-				catch(Exception e) {
-					IRationale rationale = job.getCompletionRationale();
-					if(rationale != null) {
-						sb.append("<span title=\""+rationale+"\">");
-						sb.append(duccwork.getCompletionTypeObject().toString());
-						sb.append("</span>");
-					}
-					else {
-						sb.append(duccwork.getCompletionTypeObject().toString());
-					}
-				}
-				break;
-			default:
-				IRationale rationale = job.getCompletionRationale();
-				if(rationale != null) {
-					sb.append("<span title=\""+rationale+"\">");
-					sb.append(duccwork.getCompletionTypeObject().toString());
-					sb.append("</span>");
-				}
-				else {
-					sb.append(duccwork.getCompletionTypeObject().toString());
-				}
-				break;
-			}
+			sb = getReason(job,DuccType.Reservation);
 		}
 		row.add(new JsonPrimitive(sb.toString()));
 		// Allocation
@@ -787,6 +751,13 @@ public class DuccHandlerJsonFormat exten
 			else {
 				sb.append("0");
 			}
+			Iterator<DuccId> iterator = job.getProcessMap().keySet().iterator();
+			while(iterator.hasNext()) {
+				DuccId processId = iterator.next();
+				IDuccProcess process = job.getProcessMap().get(processId);
+				String node = process.getNodeIdentity().getName();
+				nodeMap.put(node, 1);
+			}
 		}
 		row.add(new JsonPrimitive(sb.toString()));
 		// Size
@@ -801,13 +772,30 @@ public class DuccHandlerJsonFormat exten
 		sb = new StringBuffer();
 		sb.append("<span>");
 		if(!nodeMap.isEmpty()) {
-			sb.append("<select>");
+			boolean useList = false;
+			if(nodeMap.size() > 1) {
+				useList = true;
+			}
+			if(useList) {
+				sb.append("<select>");
+			}
 			for (String node: nodeMap.keySet()) {
+				String option = node;
 				Integer count = nodeMap.get(node);
-				String option = node+" "+"["+count+"]";
-				sb.append("<option>"+option+"</option>");
+				if(count > 1) {
+					option += " "+"["+count+"]";
+				}
+				if(useList) {
+					sb.append("<option>");
+				}
+				sb.append(option);
+				if(useList) {
+					sb.append("</option>");
+				}
+			}
+			if(useList) {
+				sb.append("</select>");
 			}
-			sb.append("</select>");
 		}
 		sb.append("</span>");
 		row.add(new JsonPrimitive(sb.toString()));

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerLegacy.java Tue Mar 19 16:00:00 2013
@@ -49,7 +49,9 @@ import org.apache.uima.ducc.transport.ev
 import org.apache.uima.ducc.transport.event.common.IDuccCompletionType.JobCompletionType;
 import org.apache.uima.ducc.transport.event.common.IDuccReservation;
 import org.apache.uima.ducc.transport.event.common.IDuccReservationMap;
+import org.apache.uima.ducc.transport.event.common.IDuccTypes.DuccType;
 import org.apache.uima.ducc.transport.event.common.IDuccUnits.MemoryUnits;
+import org.apache.uima.ducc.transport.event.common.IDuccProcess;
 import org.apache.uima.ducc.transport.event.common.IDuccWork;
 import org.apache.uima.ducc.transport.event.common.IDuccWorkJob;
 import org.apache.uima.ducc.transport.event.common.IRationale;
@@ -95,6 +97,73 @@ public class DuccHandlerLegacy extends D
 		return dir_home+File.separator+dir_resources+File.separator+getDuccWebServer().getClassDefinitionFile();
 	}
 	
+	private String getReason(IDuccWorkJob job, DuccType type) {
+		StringBuffer sb = new StringBuffer();
+		if(job != null) {
+			DuccId duccId = job.getDuccId();
+			if(job.isOperational()) {
+				boolean multi = false;
+				sb.append("<td valign=\"bottom\">");
+				ArrayList<String> swappingMachines = getSwappingMachines(job);
+				if(!swappingMachines.isEmpty()) {
+					StringBuffer mb = new StringBuffer();
+					for(String machine : swappingMachines) {
+						mb.append(machine);
+						mb.append(" ");
+					}
+					String ml = mb.toString().trim();
+					if(multi) {
+						sb.append(" ");
+					}
+					multi = true;
+					sb.append("<span class=\"health_red\" title=\""+ml+"\">");
+					sb.append("Swapping");
+					sb.append("</span>");
+				}
+				//
+				String monitor = getMonitor(duccId, type, multi);
+				if(monitor.length() > 0) {
+					multi = true;
+					sb.append(monitor);
+				}
+				sb.append("</td>");
+			}
+			else if(job.isCompleted()) {
+				JobCompletionType jobCompletionType = job.getCompletionType();
+				switch(jobCompletionType) {
+				case EndOfJob:
+					try {
+						int total = job.getSchedulingInfo().getIntWorkItemsTotal();
+						int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
+						int error = job.getSchedulingInfo().getIntWorkItemsError();
+						if(total != (done+error)) {
+							jobCompletionType = JobCompletionType.Premature;
+						}
+					}
+					catch(Exception e) {
+					}
+					sb.append("<td valign=\"bottom\">");
+					break;
+				case Undefined:
+					sb.append("<td valign=\"bottom\">");
+					break;
+				default:
+					IRationale rationale = job.getCompletionRationale();
+					if(rationale != null) {
+						sb.append("<td valign=\"bottom\" title=\""+rationale+"\">");
+					}
+					else {
+						sb.append("<td valign=\"bottom\">");
+					}
+					break;
+				}
+				sb.append(jobCompletionType);
+				sb.append("</td>");
+			}
+		}
+		return sb.toString();
+	}
+	
 	private void buildJobsListEntry(HttpServletRequest request, StringBuffer sb, DuccId duccId, IDuccWorkJob job, DuccData duccData, ServicesRegistry servicesRegistry) {
 		String type="Job";
 		String id = normalize(duccId);
@@ -159,65 +228,8 @@ public class DuccHandlerLegacy extends D
 		}
 		sb.append("</td>");
 		// Reason
-		if(job.isOperational()) {
-			boolean multi = false;
-			sb.append("<td valign=\"bottom\">");
-			ArrayList<String> swappingMachines = getSwappingMachines(job);
-			if(!swappingMachines.isEmpty()) {
-				StringBuffer mb = new StringBuffer();
-				for(String machine : swappingMachines) {
-					mb.append(machine);
-					mb.append(" ");
-				}
-				String ml = mb.toString().trim();
-				if(multi) {
-					sb.append(" ");
-				}
-				multi = true;
-				sb.append("<span class=\"health_red\" title=\""+ml+"\">");
-				sb.append("Swapping");
-				sb.append("</span>");
-			}
-			//
-			String monitor = getMonitor(duccId, multi);
-			if(monitor.length() > 0) {
-				multi = true;
-				sb.append(monitor);
-			}
-			sb.append("</td>");
-		}
-		else if(job.isCompleted()) {
-			JobCompletionType jobCompletionType = job.getCompletionType();
-			switch(jobCompletionType) {
-			case EndOfJob:
-				try {
-					int total = job.getSchedulingInfo().getIntWorkItemsTotal();
-					int done = job.getSchedulingInfo().getIntWorkItemsCompleted();
-					int error = job.getSchedulingInfo().getIntWorkItemsError();
-					if(total != (done+error)) {
-						jobCompletionType = JobCompletionType.Premature;
-					}
-				}
-				catch(Exception e) {
-				}
-				sb.append("<td valign=\"bottom\">");
-				break;
-			case Undefined:
-				sb.append("<td valign=\"bottom\">");
-				break;
-			default:
-				IRationale rationale = job.getCompletionRationale();
-				if(rationale != null) {
-					sb.append("<td valign=\"bottom\" title=\""+rationale+"\">");
-				}
-				else {
-					sb.append("<td valign=\"bottom\">");
-				}
-				break;
-			}
-			sb.append(jobCompletionType);
-			sb.append("</td>");
-		}
+		String reason = getReason(job, DuccType.Job);
+		sb.append(reason);
 		// Services
 		sb.append("<td valign=\"bottom\" align=\"right\">");
 		sb.append(evaluateServices(job,servicesRegistry));
@@ -521,8 +533,8 @@ public class DuccHandlerLegacy extends D
 		}
 		sb.append("</td>");
 		// Reason
-		sb.append("<td>");
 		if(duccwork instanceof DuccWorkReservation) {
+			sb.append("<td>");
 			DuccWorkReservation reservation = (DuccWorkReservation) duccwork;
 			switch(reservation.getCompletionType()) {
 			case Undefined:
@@ -573,60 +585,13 @@ public class DuccHandlerLegacy extends D
 				}
 				break;
 			}
+			sb.append("</td>");
 		}
 		else if(duccwork instanceof DuccWorkJob) {
 			DuccWorkJob job = (DuccWorkJob) duccwork;
-			switch(job.getCompletionType()) {
-			case Undefined:
-				break;
-			case CanceledByUser:
-			case CanceledByAdministrator:
-				try {
-					String cancelUser = duccwork.getStandardInfo().getCancelUser();
-					if(cancelUser != null) {
-						sb.append("<span title=\"canceled by "+cancelUser+"\">");
-						sb.append(duccwork.getCompletionTypeObject().toString());
-						sb.append("</span>");
-					}
-					else {							
-						IRationale rationale = job.getCompletionRationale();
-						if(rationale != null) {
-							sb.append("<span title=\""+rationale+"\">");
-							sb.append(duccwork.getCompletionTypeObject().toString());
-							sb.append("</span>");
-						}
-						else {
-							sb.append(duccwork.getCompletionTypeObject().toString());
-						}
-						
-					}
-				} 
-				catch(Exception e) {
-					IRationale rationale = job.getCompletionRationale();
-					if(rationale != null) {
-						sb.append("<span title=\""+rationale+"\">");
-						sb.append(duccwork.getCompletionTypeObject().toString());
-						sb.append("</span>");
-					}
-					else {
-						sb.append(duccwork.getCompletionTypeObject().toString());
-					}
-				}
-				break;
-			default:
-				IRationale rationale = job.getCompletionRationale();
-				if(rationale != null) {
-					sb.append("<span title=\""+rationale+"\">");
-					sb.append(duccwork.getCompletionTypeObject().toString());
-					sb.append("</span>");
-				}
-				else {
-					sb.append(duccwork.getCompletionTypeObject().toString());
-				}
-				break;
-			}
+			String reason = getReason(job, DuccType.Reservation);
+			sb.append(reason);
 		}
-		sb.append("</td>");
 		// Allocation
 		sb.append("<td align=\"right\">");
 		sb.append(duccwork.getSchedulingInfo().getInstancesCount());
@@ -693,6 +658,13 @@ public class DuccHandlerLegacy extends D
 			else {
 				sb.append("0");
 			}
+			Iterator<DuccId> iterator = job.getProcessMap().keySet().iterator();
+			while(iterator.hasNext()) {
+				DuccId processId = iterator.next();
+				IDuccProcess process = job.getProcessMap().get(processId);
+				String node = process.getNodeIdentity().getName();
+				nodeMap.put(node, 1);
+			}
 		}
 		sb.append("</td>");
 		// Size
@@ -701,22 +673,34 @@ public class DuccHandlerLegacy extends D
 		MemoryUnits units = duccwork.getSchedulingInfo().getShareMemoryUnits();
 		sb.append(getProcessMemorySize(duccId,type,size,units));
 		sb.append("</td>");
-		// List
+		// Host Names
 		sb.append("<td>");
-		if(duccwork instanceof DuccWorkReservation) {
-			if(!nodeMap.isEmpty()) {
+		if(!nodeMap.isEmpty()) {
+			boolean useList = false;
+			if(nodeMap.size() > 1) {
+				useList = true;
+			}
+			if(useList) {
 				sb.append("<select>");
-				for (String node: nodeMap.keySet()) {
-					Integer count = nodeMap.get(node);
-					String option = node+" "+"["+count+"]";
-					sb.append("<option>"+option+"</option>");
+			}
+			for (String node: nodeMap.keySet()) {
+				String option = node;
+				Integer count = nodeMap.get(node);
+				if(count > 1) {
+					option += " "+"["+count+"]";
+				}
+				if(useList) {
+					sb.append("<option>");
+				}
+				sb.append(option);
+				if(useList) {
+					sb.append("</option>");
 				}
+			}
+			if(useList) {
 				sb.append("</select>");
 			}
 		}
-		else {
-			//TODO
-		}
 		sb.append("</td>");
 		// Description
 		sb.append("<td>");

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerProxy.java Tue Mar 19 16:00:00 2013
@@ -42,21 +42,24 @@ public class DuccHandlerProxy extends Du
 	public final String proxyJobStatus			= duccContextProxy+"-job-status";
 	public final String proxyJobMonitorReport	= duccContextProxy+"-job-monitor-report";
 	
+	public final String proxyManagedReservationStatus			= duccContextProxy+"-managed-reservation-status";
+	public final String proxyManagedReservationMonitorReport	= duccContextProxy+"-managed-reservation-monitor-report";
+	
 	DuccWebMonitor duccWebMonitor = DuccWebMonitor.getInstance();
 
-	private boolean isJobIdMissing(String jobId) {
+	private boolean isIdMissing(String id) {
 		boolean retVal = false;
-		if(jobId.length() == 0) {
+		if(id.length() == 0) {
 			retVal = true;
 		}
 		return retVal;
 	}
 	
-	private boolean isJobIdInvalid(String jobId) {
+	private boolean isIdInvalid(String id) {
 		boolean retVal = false;
 		try {
-			int id = Integer.parseInt(jobId);
-			if(id < 0) {
+			int value = Integer.parseInt(id);
+			if(value < 0) {
 				retVal = true;
 			}
 		}
@@ -82,13 +85,13 @@ public class DuccHandlerProxy extends Du
 			jobId = "";
 		}
 		
-		if(isJobIdMissing(jobId)) {
-			String message = "Job id missing";
+		if(isIdMissing(jobId)) {
+			String message = "id missing";
 			duccLogger.info(location, jobid, message);
 			response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
 		}
-		else if(isJobIdInvalid(jobId)) {
-			String message = "Job id invalid";
+		else if(isIdInvalid(jobId)) {
+			String message = "id invalid";
 			duccLogger.info(location, jobid, message);
 			response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
 		}
@@ -121,6 +124,61 @@ public class DuccHandlerProxy extends Du
 		duccLogger.trace(location, jobid, "exit");
 	}
 	
+	private void handleServletManagedReservationStatus(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) 
+	throws IOException, ServletException
+	{
+		String location = "handleServletManagedReservationStatus";
+		duccLogger.trace(location, jobid, "enter");
+		duccLogger.info(location, jobid, request.toString());
+
+		String id = request.getParameter("id");
+		
+		if(id != null) {
+			id = id.trim();
+		}
+		else {
+			id = "";
+		}
+		
+		if(isIdMissing(id)) {
+			String message = "id missing";
+			duccLogger.info(location, jobid, message);
+			response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+		}
+		else if(isIdInvalid(id)) {
+			String message = "id invalid";
+			duccLogger.info(location, jobid, message);
+			response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+		}
+		else {
+			MonitorInfo monitorInfo  = duccWebMonitor.renew(DuccType.Reservation, id);
+			Gson gson = new Gson();
+			String jSon = gson.toJson(monitorInfo);
+			duccLogger.debug(location, jobid, jSon);
+			response.getWriter().println(jSon);
+			response.setContentType("application/json");
+		}
+		
+		duccLogger.trace(location, jobid, "exit");
+	}
+	
+	private void handleServletManagedReservationMonitorReport(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) 
+	throws IOException, ServletException
+	{
+		String location = "handleServletManagedReservationMonitorReport";
+		duccLogger.trace(location, jobid, "enter");
+		duccLogger.info(location, jobid, request.toString());
+
+		ConcurrentHashMap<DuccId,Long> eMap = duccWebMonitor.getExpiryMap(DuccType.Reservation);
+		
+		Gson gson = new Gson();
+		String jSon = gson.toJson(eMap);
+		duccLogger.debug(location, jobid, jSon);
+		response.getWriter().println(jSon);
+		response.setContentType("application/json");
+		duccLogger.trace(location, jobid, "exit");
+	}
+	
 	private void handleServletUnknown(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) 
 	throws IOException, ServletException
 	{
@@ -144,6 +202,12 @@ public class DuccHandlerProxy extends Du
 		else if(reqURI.startsWith(proxyJobMonitorReport)) {
 			handleServletJobMonitorReport(target, baseRequest, request, response);
 		}
+		else if(reqURI.startsWith(proxyManagedReservationStatus)) {
+			handleServletManagedReservationStatus(target, baseRequest, request, response);
+		}
+		else if(reqURI.startsWith(proxyManagedReservationMonitorReport)) {
+			handleServletManagedReservationMonitorReport(target, baseRequest, request, response);
+		}
 		else {
 			handleServletUnknown(target, baseRequest, request, response);
 		}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitor.java Tue Mar 19 16:00:00 2013
@@ -18,28 +18,18 @@
 */
 package org.apache.uima.ducc.ws.server;
 
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.uima.ducc.cli.DuccUiConstants;
 import org.apache.uima.ducc.common.json.MonitorInfo;
 import org.apache.uima.ducc.common.utils.DuccLogger;
 import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
 import org.apache.uima.ducc.common.utils.id.DuccId;
 import org.apache.uima.ducc.orchestrator.authentication.DuccWebAdministrators;
 import org.apache.uima.ducc.transport.event.OrchestratorStateDuccEvent;
-import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
-import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;
-import org.apache.uima.ducc.transport.event.common.DuccWorkMap;
-import org.apache.uima.ducc.transport.event.common.IDuccSchedulingInfo;
-import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
 import org.apache.uima.ducc.transport.event.common.IDuccTypes.DuccType;
-import org.apache.uima.ducc.transport.event.common.IDuccWorkJob;
 import org.apache.uima.ducc.ws.IListenerOrchestrator;
 
 public class DuccWebMonitor implements IListenerOrchestrator, IWebMonitor {
@@ -56,12 +46,8 @@ public class DuccWebMonitor implements I
 	
 	private Properties properties = new Properties();
 	
-	private long millisPerMinute = 60*1000;
-	private long timeoutMinutes = 10;
-	private long timeoutMillis = timeoutMinutes*millisPerMinute;
-	
-	private AtomicBoolean operational = new AtomicBoolean(true);
 	private AtomicInteger updateCounter = new AtomicInteger(0);
+	private AtomicBoolean operational = new AtomicBoolean(true);
 	private AtomicBoolean statusMessageIssued = new AtomicBoolean(false);
 	
 	private String monitor_host = null;
@@ -70,10 +56,13 @@ public class DuccWebMonitor implements I
 	private String actual_host = null;
 	private String actual_port = null;
 	
-	private ConcurrentHashMap<DuccId,MonitorInfo> jmMap = new ConcurrentHashMap<DuccId,MonitorInfo>();
-	private ConcurrentHashMap<DuccId,TrackingInfo> jtMap = new ConcurrentHashMap<DuccId,TrackingInfo>();
-	private ConcurrentHashMap<DuccId,Long> jcMap = new ConcurrentHashMap<DuccId,Long>();
+	private long millisPerMinute = 60*1000;
+	private long timeoutMinutes = 10;
+	private long timeoutMillis = timeoutMinutes*millisPerMinute;
 	
+	private DuccWebMonitorJob duccWebMonitorJob = null;
+	private DuccWebMonitorManagedReservation duccWebMonitorManagedReservation = null;
+
 	public static DuccWebMonitor getInstance() {
 		return instance;
 	}
@@ -113,6 +102,9 @@ public class DuccWebMonitor implements I
 			monitor_host = properties.getProperty(key_head);
 		}
 		monitor_port = properties.getProperty(key_port);
+		//
+		duccWebMonitorJob = new DuccWebMonitorJob(timeoutMillis);
+		duccWebMonitorManagedReservation = new DuccWebMonitorManagedReservation(timeoutMillis);
 	}
 	
 	@Override
@@ -133,196 +125,15 @@ public class DuccWebMonitor implements I
 		duccLogger.trace(location, jobid, "exit");
 	}
 	
-	private void monitorJobs(OrchestratorStateDuccEvent duccEvent) {
-		String location = "monitorJobs";
-		duccLogger.trace(location, jobid, "enter");
-		
-		DuccWorkMap dwm = duccEvent.getWorkMap();
-		int size = dwm.getJobKeySet().size();
-		duccLogger.debug(location, jobid, "jobs: "+size);
-		
-		Iterator<DuccId> iterator;
-		ArrayList<DuccId> gone = new ArrayList<DuccId>();
-		
-		iterator = jmMap.keySet().iterator();
-		while( iterator.hasNext() ) {
-			DuccId duccId = iterator.next();
-			gone.add(duccId);
-		}
-		
-		long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
-		
-		iterator = dwm.getJobKeySet().iterator();
-		while( iterator.hasNext() ) {
-			DuccId duccId = iterator.next();
-			IDuccWorkJob dwj = (IDuccWorkJob)dwm.findDuccWork(duccId);
-			gone.remove(duccId);
-			if(!jmMap.containsKey(duccId)) {
-				MonitorInfo monitorInfo = new MonitorInfo();
-				jmMap.put(duccId, monitorInfo);
-				duccLogger.info(location, duccId, "Job monitor start");
-				if(!jtMap.containsKey(duccId)) {
-					try {
-						Properties properties = DuccFile.getJobProperties(dwj);
-						if(properties.containsKey(DuccUiConstants.name_monitor_cancel_job_on_interrupt)) {
-							TrackingInfo ti = new TrackingInfo();
-							ti.time = expiryMillis;
-							ti.user = dwj.getStandardInfo().getUser();
-							jtMap.put(duccId,ti);
-							duccLogger.info(location, duccId, "Job auto-cancel on");
-						}
-						else {
-							duccLogger.info(location, duccId, "Job auto-cancel off");
-						}
-					}
-					catch(Exception e) {
-						duccLogger.info(location, duccId, e);
-					}
-				}
-			}
-			MonitorInfo monitorInfo = jmMap.get(duccId);
-			IDuccSchedulingInfo si = dwj.getSchedulingInfo();
-			monitorInfo.total = si.getWorkItemsTotal();
-			monitorInfo.done  = si.getWorkItemsCompleted();
-			monitorInfo.error = si.getWorkItemsError();
-			monitorInfo.retry = si.getWorkItemsRetry();
-			monitorInfo.procs = ""+dwj.getProcessMap().getAliveProcessCount();
-			
-			ArrayList<String> stateSequence = monitorInfo.stateSequence;
-			String state = dwj.getJobState().toString();
-			if(!stateSequence.contains(state)) {
-				duccLogger.info(location, duccId, "state: "+state);
-				stateSequence.add(state);
-			}
-		}
-		
-		iterator = gone.iterator();
-		while( iterator.hasNext() ) {
-			DuccId duccId = iterator.next();
-			jmMap.remove(duccId);
-			jtMap.remove(duccId);
-			duccLogger.info(location, duccId, "Job monitor stop");
-		}
-		
-		duccLogger.trace(location, jobid, "exit");
-	}
-	
-	private void monitorManagedReservations(OrchestratorStateDuccEvent duccEvent) {
-		String location = "monitorManagedReservations";
-		duccLogger.trace(location, jobid, "enter");
-		
-		// TODO
-		
-		duccLogger.trace(location, jobid, "exit");
-	}
-	
-	private void cancelJobs(long nowMillis) {
-		String location = "cancelJobs";
-		duccLogger.trace(location, jobid, "enter");
-
-		Enumeration<DuccId> keys = jtMap.keys();
-		while(keys.hasMoreElements()) {
-			DuccId duccId = keys.nextElement();
-			TrackingInfo ti = jtMap.get(duccId);
-			long expiryMillis = ti.time;
-			if(nowMillis > expiryMillis) {
-				if(isCancelableJob(duccId)) {
-					cancelJob(duccId);
-				}
-				else {
-					duccLogger.debug(location, duccId, "not cancelable");
-				}
-			}
-		}
-		
-		duccLogger.trace(location, jobid, "exit");
-	}
-
-	private boolean isCanceledJob(DuccId duccId) {
-		return jcMap.containsKey(duccId);
-	}
-	
-	private boolean isCancelableJob(DuccId duccId) {
-		String location = "isCancelableJob";
-		duccLogger.trace(location, duccId, "enter");
-		boolean retVal = false;
-		if(!jcMap.containsKey(duccId)) {
-			MonitorInfo monitorInfo = jmMap.get(duccId);
-			if(monitorInfo != null) {
-				ArrayList<String> stateSequence = monitorInfo.stateSequence;
-				if(stateSequence != null) {
-					if(stateSequence.contains(JobState.Completing.toString())) {
-						duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
-					}
-					else if(stateSequence.contains(JobState.Completed.toString())) {
-						duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
-					}
-					else {
-						duccLogger.debug(location, duccId, "state: <cancelable> "+stateSequence);
-						retVal = true;
-					}
-				}
-				else {
-					duccLogger.warn(location, duccId, "stateSequence: <null>");
-				}
-			}
-			else {
-				duccLogger.warn(location, duccId, "monitorInfo: <null>");
-			}
-		}
-		else {
-			duccLogger.debug(location, duccId, "already canceled");
-		}
-		duccLogger.trace(location, duccId, "exit");
-		return retVal;
-	}
-
-	private void cancelJob(DuccId duccId) {
-		String location = "cancelJob";
-		duccLogger.trace(location, jobid, "enter");
-		
-		String userId = System.getProperty("user.name");
-		
-		duccLogger.info(location, duccId, userId);
-		
-		String java = "/bin/java";
-		String jhome = System.getProperty("java.home");
-		String cp = System.getProperty("java.class.path");
-		String jclass = "org.apache.uima.ducc.cli.DuccJobCancel";
-		String arg1 = "--"+JobRequestProperties.key_id;
-		String arg2 = ""+duccId;
-		String arg3 = "--"+SpecificationProperties.key_reason;
-		String arg4 = "\"submitter terminated, therefore job canceled automatically\"";
-		String arg5 = "--"+SpecificationProperties.key_role_administrator;
-		
-		String[] arglistUser = { "-u", userId, "--", jhome+java, "-cp", cp, jclass, arg1, arg2, arg3, arg4, arg5 };
-		String result = DuccAsUser.duckling(userId, arglistUser);
-		duccLogger.warn(location, duccId, result);
-		
-		jcMap.put(duccId, new Long(System.currentTimeMillis()));
-		jtMap.remove(duccId);
-
-		duccLogger.trace(location, jobid, "exit");
-	}
-	
-	private void cancelManagedReservations(long nowMillis) {
-		String location = "cancelManagedReservations";
-		duccLogger.trace(location, jobid, "enter");
-		
-		// TODO
-		
-		duccLogger.trace(location, jobid, "exit");
-	}
-	
 	private void monitor(OrchestratorStateDuccEvent duccEvent) {
 		String location = "monitor";
 		duccLogger.trace(location, jobid, "enter");
-		monitorJobs(duccEvent);
-		monitorManagedReservations(duccEvent);
+		duccWebMonitorJob.monitor(duccEvent);
+		duccWebMonitorManagedReservation.monitor(duccEvent);
 		if(isAutoCancelEnabled()) {
 			long nowMillis = System.currentTimeMillis();
-			cancelJobs(nowMillis);
-			cancelManagedReservations(nowMillis);
+			duccWebMonitorJob.canceler(nowMillis);
+			duccWebMonitorManagedReservation.canceler(nowMillis);
 		}
 		else {
 			duccLogger.debug(location, jobid, "auto-cancel monitor disabled");
@@ -370,81 +181,6 @@ public class DuccWebMonitor implements I
 		return true;
 	}
 
-	private DuccId getKey(String jobId) {
-		DuccId retVal = null;
-		Enumeration<DuccId> keys = jmMap.keys();
-		while(keys.hasMoreElements()) {
-			DuccId duccId = keys.nextElement();
-			String mapId = ""+duccId.getFriendly();
-			if(mapId.equals(jobId)) {
-				retVal = duccId;
-				break;
-			}
-		}
-		return retVal;
-	}
-	
-	public MonitorInfo renewJob(String jobId) {
-		String location = "renewJob";
-		duccLogger.trace(location, jobid, "enter");
-		
-		MonitorInfo monitorInfo = new MonitorInfo();
-		
-		int countAtArrival = updateCounter.get();
-		int countAtPresent = countAtArrival;
-		int sleepSecondsMax = 3*60;
-		
-		DuccId duccId = getKey(jobId);
-		
-		if(duccId == null) {
-			int sleepSeconds = 0;
-			duccLogger.info(location, duccId, "Waiting for update...");
-			while(duccId == null) {
-				try {
-					duccLogger.debug(location, duccId, "Waiting continues...");
-					Thread.sleep(1000);
-					sleepSeconds += 1;
-					if(sleepSeconds > sleepSecondsMax) {
-						break;
-					}
-					countAtPresent = updateCounter.get();
-					if((countAtPresent-countAtArrival) > 2) {
-						break;
-					}
-					duccId = getKey(jobId);
-				}
-				catch(Exception e) {
-				}
-			}
-			duccLogger.info(location, duccId, "Waiting complete.");
-			duccId = getKey(jobId);
-		}
-		
-		if(duccId != null) {
-			monitorInfo = jmMap.get(duccId);
-			if(jtMap.containsKey(duccId)) {
-				long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
-				TrackingInfo ti = jtMap.get(duccId);
-				ti.time = expiryMillis;
-				duccLogger.info(location, duccId, "Job auto-cancel expiry extended");
-			}
-		}
-		else {
-			try {
-				int iJobId = Integer.parseInt(jobId);
-				duccId = new DuccId(iJobId);
-				duccLogger.info(location, duccId, "Job not found");
-			}
-			catch(Exception e) {
-				duccLogger.error(location, jobid, e);
-			}
-		}
-		
-		duccLogger.trace(location, jobid, "exit");
-		
-		return monitorInfo;
-	}
-	
 	@Override
 	public MonitorInfo renew(DuccType duccType, String id) {
 		MonitorInfo monitorInfo = new MonitorInfo();
@@ -452,9 +188,10 @@ public class DuccWebMonitor implements I
 			if(id != null) {
 				switch(duccType) {
 				case Job:
-					monitorInfo = renewJob(id);
+					monitorInfo = duccWebMonitorJob.renew(id, updateCounter);
 					break;
 				case Reservation:
+					monitorInfo = duccWebMonitorManagedReservation.renew(id, updateCounter);
 					break;
 				case Service:
 					break;
@@ -465,23 +202,7 @@ public class DuccWebMonitor implements I
 		}
 		return monitorInfo;
 	}
-	
-	private Long getExpiryJob(DuccId duccId) {
-		String location = "getExpiryJob";
-		duccLogger.trace(location, duccId, "enter");
-		Long retVal = null;
-		if(!isCanceledJob(duccId)) {
-			if(isCancelableJob(duccId)) {
-				ConcurrentHashMap<DuccId,Long> eMap = getExpiryMapJobs();
-				if(eMap.containsKey(duccId)) {
-					retVal = eMap.get(duccId);
-				}
-			}
-		}
-		duccLogger.trace(location, duccId, "exit");
-		return retVal;
-	}
-	
+
 	@Override
 	public Long getExpiry(DuccType duccType, DuccId duccId) {
 		Long expiry = null;
@@ -489,9 +210,10 @@ public class DuccWebMonitor implements I
 			if(duccId != null) {
 				switch(duccType) {
 				case Job:
-					expiry = getExpiryJob(duccId);
+					expiry = duccWebMonitorJob.getExpiry(duccId);
 					break;
 				case Reservation:
+					expiry = duccWebMonitorManagedReservation.getExpiry(duccId);
 					break;
 				case Service:
 					break;
@@ -510,9 +232,10 @@ public class DuccWebMonitor implements I
 			if(duccId != null) {
 				switch(duccType) {
 				case Job:
-					flag = isCanceledJob(duccId);
+					flag = duccWebMonitorJob.isCanceled(duccId);
 					break;
 				case Reservation:
+					flag = duccWebMonitorManagedReservation.isCanceled(duccId);
 					break;
 				case Service:
 					break;
@@ -524,40 +247,16 @@ public class DuccWebMonitor implements I
 		return flag;
 	}
 	
-	public ConcurrentHashMap<DuccId,Long> getExpiryMapJobs() {
-		String location = "getExpiryMapJobs";
-		duccLogger.trace(location, jobid, "enter");
-		
-		ConcurrentHashMap<DuccId,Long> eMap = new ConcurrentHashMap<DuccId,Long>();
-		
-		long nowMillis = System.currentTimeMillis();
-		
-		Enumeration<DuccId> keys = jtMap.keys();
-		while(keys.hasMoreElements()) {
-			long minutesLeft = 0;
-			DuccId duccId = keys.nextElement();
-			TrackingInfo ti = jtMap.get(duccId);
-			long expiryMillis = ti.time;
-			if(nowMillis < expiryMillis) {
-				minutesLeft = (expiryMillis - nowMillis) / millisPerMinute;
-			}
-			eMap.put(duccId, minutesLeft);
-		}
-		
-		duccLogger.trace(location, jobid, "exit");
-		
-		return eMap;
-	}
-	
 	@Override
 	public ConcurrentHashMap<DuccId,Long> getExpiryMap(DuccType duccType) {
 		ConcurrentHashMap<DuccId,Long> eMap = new ConcurrentHashMap<DuccId,Long>();
 		if(duccType != null) {
 			switch(duccType) {
 			case Job:
-				eMap = getExpiryMapJobs();
+				eMap = duccWebMonitorJob.getExpiryMap();
 				break;
 			case Reservation:
+				eMap = duccWebMonitorManagedReservation.getExpiryMap();
 				break;
 			case Service:
 				break;

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java?rev=1458366&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorJob.java Tue Mar 19 16:00:00 2013
@@ -0,0 +1,330 @@
+/*
+ * 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.ws.server;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.uima.ducc.common.json.MonitorInfo;
+import org.apache.uima.ducc.common.utils.DuccLogger;
+import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
+import org.apache.uima.ducc.common.utils.id.DuccId;
+import org.apache.uima.ducc.transport.event.OrchestratorStateDuccEvent;
+import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
+import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;
+import org.apache.uima.ducc.transport.event.common.DuccWorkJob;
+import org.apache.uima.ducc.transport.event.common.DuccWorkMap;
+import org.apache.uima.ducc.transport.event.common.IDuccSchedulingInfo;
+import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
+import org.apache.uima.ducc.transport.event.common.IDuccWork;
+
+public class DuccWebMonitorJob {
+	
+	private static DuccLogger duccLogger = DuccLoggerComponents.getWsLogger(DuccWebMonitorJob.class.getName());
+	private static DuccId jobid = null;
+	
+	private ConcurrentHashMap<DuccId,MonitorInfo> mMap = new ConcurrentHashMap<DuccId,MonitorInfo>();
+	private ConcurrentHashMap<DuccId,TrackingInfo> tMap = new ConcurrentHashMap<DuccId,TrackingInfo>();
+	private ConcurrentHashMap<DuccId,Long> cMap = new ConcurrentHashMap<DuccId,Long>();
+	
+	private long millisPerMinute = 60*1000;
+	private long timeoutMillis;
+	
+	protected DuccWebMonitorJob(long timeoutMillis) {
+		this.timeoutMillis = timeoutMillis;
+	}
+	
+	protected void monitor(OrchestratorStateDuccEvent duccEvent) {
+		String location = "monitor";
+		duccLogger.trace(location, jobid, "enter");
+		
+		DuccWorkMap dwm = duccEvent.getWorkMap();
+		int size = dwm.getJobKeySet().size();
+		duccLogger.debug(location, jobid, "jobs: "+size);
+		
+		Iterator<DuccId> iterator;
+		ArrayList<DuccId> gone = new ArrayList<DuccId>();
+		
+		iterator = mMap.keySet().iterator();
+		while( iterator.hasNext() ) {
+			DuccId duccId = iterator.next();
+			gone.add(duccId);
+		}
+		
+		long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
+		
+		iterator = dwm.getJobKeySet().iterator();
+		while( iterator.hasNext() ) {
+			DuccId duccId = iterator.next();
+			IDuccWork dw = (IDuccWork)dwm.findDuccWork(duccId);
+			gone.remove(duccId);
+			if(!mMap.containsKey(duccId)) {
+				MonitorInfo monitorInfo = new MonitorInfo();
+				mMap.put(duccId, monitorInfo);
+				duccLogger.info(location, duccId, "monitor start");
+				if(!tMap.containsKey(duccId)) {
+					if(dw.isCancelOnInterrupt()) {
+						TrackingInfo ti = new TrackingInfo();
+						ti.time = expiryMillis;
+						ti.user = dw.getStandardInfo().getUser();
+						tMap.put(duccId,ti);
+						duccLogger.info(location, duccId, "auto-cancel on");
+					}
+					else {
+						duccLogger.info(location, duccId, "auto-cancel off");
+					}
+				}
+			}
+			DuccWorkJob dwj = (DuccWorkJob) dw;
+			MonitorInfo monitorInfo = mMap.get(duccId);
+			IDuccSchedulingInfo si = dw.getSchedulingInfo();
+			monitorInfo.total = si.getWorkItemsTotal();
+			monitorInfo.done  = si.getWorkItemsCompleted();
+			monitorInfo.error = si.getWorkItemsError();
+			monitorInfo.retry = si.getWorkItemsRetry();
+			monitorInfo.procs = ""+dwj.getProcessMap().getAliveProcessCount();
+			
+			ArrayList<String> stateSequence = monitorInfo.stateSequence;
+			String state = dwj.getJobState().toString();
+			if(!stateSequence.contains(state)) {
+				duccLogger.info(location, duccId, "state: "+state);
+				stateSequence.add(state);
+			}
+		}
+		
+		iterator = gone.iterator();
+		while( iterator.hasNext() ) {
+			DuccId duccId = iterator.next();
+			mMap.remove(duccId);
+			tMap.remove(duccId);
+			duccLogger.info(location, duccId, "monitor stop");
+		}
+		
+		duccLogger.trace(location, jobid, "exit");
+	}
+	
+	protected DuccId getKey(String jobId) {
+		DuccId retVal = null;
+		Enumeration<DuccId> keys = mMap.keys();
+		while(keys.hasMoreElements()) {
+			DuccId duccId = keys.nextElement();
+			String mapId = ""+duccId.getFriendly();
+			if(mapId.equals(jobId)) {
+				retVal = duccId;
+				break;
+			}
+		}
+		return retVal;
+	}
+	
+	public MonitorInfo renew(String jobId, AtomicInteger updateCounter) {
+		String location = "renew";
+		duccLogger.trace(location, jobid, "enter");
+		
+		MonitorInfo monitorInfo = new MonitorInfo();
+		
+		int countAtArrival = updateCounter.get();
+		int countAtPresent = countAtArrival;
+		int sleepSecondsMax = 3*60;
+		
+		DuccId duccId = getKey(jobId);
+		
+		if(duccId == null) {
+			int sleepSeconds = 0;
+			duccLogger.info(location, duccId, "Waiting for update...");
+			while(duccId == null) {
+				try {
+					duccLogger.debug(location, duccId, "Waiting continues...");
+					Thread.sleep(1000);
+					sleepSeconds += 1;
+					if(sleepSeconds > sleepSecondsMax) {
+						break;
+					}
+					countAtPresent = updateCounter.get();
+					if((countAtPresent-countAtArrival) > 2) {
+						break;
+					}
+					duccId = getKey(jobId);
+				}
+				catch(Exception e) {
+				}
+			}
+			duccLogger.info(location, duccId, "Waiting complete.");
+			duccId = getKey(jobId);
+		}
+		
+		if(duccId != null) {
+			monitorInfo = mMap.get(duccId);
+			if(tMap.containsKey(duccId)) {
+				long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
+				TrackingInfo ti = tMap.get(duccId);
+				ti.time = expiryMillis;
+				duccLogger.info(location, duccId, "auto-cancel expiry extended");
+			}
+		}
+		else {
+			try {
+				int iJobId = Integer.parseInt(jobId);
+				duccId = new DuccId(iJobId);
+				duccLogger.info(location, duccId, "not found");
+			}
+			catch(Exception e) {
+				duccLogger.error(location, jobid, e);
+			}
+		}
+		
+		duccLogger.trace(location, jobid, "exit");
+		
+		return monitorInfo;
+	}
+	
+	protected Long getExpiry(DuccId duccId) {
+		String location = "getExpiry";
+		duccLogger.trace(location, duccId, "enter");
+		Long retVal = null;
+		if(!isCanceled(duccId)) {
+			if(isCancelable(duccId)) {
+				ConcurrentHashMap<DuccId,Long> eMap = getExpiryMap();
+				if(eMap.containsKey(duccId)) {
+					retVal = eMap.get(duccId);
+				}
+			}
+		}
+		duccLogger.trace(location, duccId, "exit");
+		return retVal;
+	}
+	
+	public ConcurrentHashMap<DuccId,Long> getExpiryMap() {
+		String location = "getExpiryMap";
+		duccLogger.trace(location, jobid, "enter");
+		
+		ConcurrentHashMap<DuccId,Long> eMap = new ConcurrentHashMap<DuccId,Long>();
+		
+		long nowMillis = System.currentTimeMillis();
+		
+		Enumeration<DuccId> keys = tMap.keys();
+		while(keys.hasMoreElements()) {
+			long minutesLeft = 0;
+			DuccId duccId = keys.nextElement();
+			TrackingInfo ti = tMap.get(duccId);
+			long expiryMillis = ti.time;
+			if(nowMillis < expiryMillis) {
+				minutesLeft = (expiryMillis - nowMillis) / millisPerMinute;
+			}
+			eMap.put(duccId, minutesLeft);
+		}
+		
+		duccLogger.trace(location, jobid, "exit");
+		
+		return eMap;
+	}
+
+	protected boolean isCanceled(DuccId duccId) {
+		return cMap.containsKey(duccId);
+	}
+	
+	private boolean isCancelable(DuccId duccId) {
+		String location = "isCancelable";
+		duccLogger.trace(location, duccId, "enter");
+		boolean retVal = false;
+		if(!cMap.containsKey(duccId)) {
+			MonitorInfo monitorInfo = mMap.get(duccId);
+			if(monitorInfo != null) {
+				ArrayList<String> stateSequence = monitorInfo.stateSequence;
+				if(stateSequence != null) {
+					if(stateSequence.contains(JobState.Completing.toString())) {
+						duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
+					}
+					else if(stateSequence.contains(JobState.Completed.toString())) {
+						duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
+					}
+					else {
+						duccLogger.debug(location, duccId, "state: <cancelable> "+stateSequence);
+						retVal = true;
+					}
+				}
+				else {
+					duccLogger.warn(location, duccId, "stateSequence: <null>");
+				}
+			}
+			else {
+				duccLogger.warn(location, duccId, "monitorInfo: <null>");
+			}
+		}
+		else {
+			duccLogger.debug(location, duccId, "already canceled");
+		}
+		duccLogger.trace(location, duccId, "exit");
+		return retVal;
+	}
+
+	protected void cancel(DuccId duccId) {
+		String location = "cancel";
+		duccLogger.trace(location, jobid, "enter");
+		
+		String userId = System.getProperty("user.name");
+		
+		duccLogger.info(location, duccId, userId);
+		
+		String java = "/bin/java";
+		String jhome = System.getProperty("java.home");
+		String cp = System.getProperty("java.class.path");
+		String jclass = "org.apache.uima.ducc.cli.DuccJobCancel";
+		String arg1 = "--"+JobRequestProperties.key_id;
+		String arg2 = ""+duccId;
+		String arg3 = "--"+SpecificationProperties.key_reason;
+		String arg4 = "\"submitter terminated, therefore canceled automatically\"";
+		String arg5 = "--"+SpecificationProperties.key_role_administrator;
+		
+		String[] arglistUser = { "-u", userId, "--", jhome+java, "-cp", cp, jclass, arg1, arg2, arg3, arg4, arg5 };
+		String result = DuccAsUser.duckling(userId, arglistUser);
+		duccLogger.warn(location, duccId, result);
+		
+		cMap.put(duccId, new Long(System.currentTimeMillis()));
+		tMap.remove(duccId);
+
+		duccLogger.trace(location, jobid, "exit");
+	}
+	
+	protected void canceler(long nowMillis) {
+		String location = "canceler";
+		duccLogger.trace(location, jobid, "enter");
+
+		Enumeration<DuccId> keys = tMap.keys();
+		while(keys.hasMoreElements()) {
+			DuccId duccId = keys.nextElement();
+			TrackingInfo ti = tMap.get(duccId);
+			long expiryMillis = ti.time;
+			if(nowMillis > expiryMillis) {
+				if(isCancelable(duccId)) {
+					cancel(duccId);
+				}
+				else {
+					duccLogger.debug(location, duccId, "not cancelable");
+				}
+			}
+		}
+		
+		duccLogger.trace(location, jobid, "exit");
+	}
+	
+}

Added: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java?rev=1458366&view=auto
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java (added)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebMonitorManagedReservation.java Tue Mar 19 16:00:00 2013
@@ -0,0 +1,330 @@
+/*
+ * 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.ws.server;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.uima.ducc.common.json.MonitorInfo;
+import org.apache.uima.ducc.common.utils.DuccLogger;
+import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
+import org.apache.uima.ducc.common.utils.id.DuccId;
+import org.apache.uima.ducc.transport.event.OrchestratorStateDuccEvent;
+import org.apache.uima.ducc.transport.event.cli.JobRequestProperties;
+import org.apache.uima.ducc.transport.event.cli.SpecificationProperties;
+import org.apache.uima.ducc.transport.event.common.DuccWorkJob;
+import org.apache.uima.ducc.transport.event.common.DuccWorkMap;
+import org.apache.uima.ducc.transport.event.common.IDuccSchedulingInfo;
+import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
+import org.apache.uima.ducc.transport.event.common.IDuccWork;
+
+public class DuccWebMonitorManagedReservation {
+	
+	private static DuccLogger duccLogger = DuccLoggerComponents.getWsLogger(DuccWebMonitorManagedReservation.class.getName());
+	private static DuccId jobid = null;
+	
+	private ConcurrentHashMap<DuccId,MonitorInfo> mMap = new ConcurrentHashMap<DuccId,MonitorInfo>();
+	private ConcurrentHashMap<DuccId,TrackingInfo> tMap = new ConcurrentHashMap<DuccId,TrackingInfo>();
+	private ConcurrentHashMap<DuccId,Long> cMap = new ConcurrentHashMap<DuccId,Long>();
+	
+	private long millisPerMinute = 60*1000;
+	private long timeoutMillis;
+	
+	protected DuccWebMonitorManagedReservation(long timeoutMillis) {
+		this.timeoutMillis = timeoutMillis;
+	}
+	
+	protected void monitor(OrchestratorStateDuccEvent duccEvent) {
+		String location = "monitor";
+		duccLogger.trace(location, jobid, "enter");
+		
+		DuccWorkMap dwm = duccEvent.getWorkMap();
+		int size = dwm.getManagedReservationKeySet().size();
+		duccLogger.debug(location, jobid, "managed reservations: "+size);
+		
+		Iterator<DuccId> iterator;
+		ArrayList<DuccId> gone = new ArrayList<DuccId>();
+		
+		iterator = mMap.keySet().iterator();
+		while( iterator.hasNext() ) {
+			DuccId duccId = iterator.next();
+			gone.add(duccId);
+		}
+		
+		long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
+		
+		iterator = dwm.getManagedReservationKeySet().iterator();
+		while( iterator.hasNext() ) {
+			DuccId duccId = iterator.next();
+			IDuccWork dw = (IDuccWork)dwm.findDuccWork(duccId);
+			gone.remove(duccId);
+			if(!mMap.containsKey(duccId)) {
+				MonitorInfo monitorInfo = new MonitorInfo();
+				mMap.put(duccId, monitorInfo);
+				duccLogger.info(location, duccId, "monitor start");
+				if(!tMap.containsKey(duccId)) {
+					if(dw.isCancelOnInterrupt()) {
+						TrackingInfo ti = new TrackingInfo();
+						ti.time = expiryMillis;
+						ti.user = dw.getStandardInfo().getUser();
+						tMap.put(duccId,ti);
+						duccLogger.info(location, duccId, "auto-cancel on");
+					}
+					else {
+						duccLogger.info(location, duccId, "auto-cancel off");
+					}
+				}
+			}
+			DuccWorkJob dwr = (DuccWorkJob) dw;
+			MonitorInfo monitorInfo = mMap.get(duccId);
+			IDuccSchedulingInfo si = dwr.getSchedulingInfo();
+			monitorInfo.total = si.getWorkItemsTotal();
+			monitorInfo.done  = si.getWorkItemsCompleted();
+			monitorInfo.error = si.getWorkItemsError();
+			monitorInfo.retry = si.getWorkItemsRetry();
+			monitorInfo.procs = ""+dwr.getProcessMap().getAliveProcessCount();
+			
+			ArrayList<String> stateSequence = monitorInfo.stateSequence;
+			String state = dwr.getJobState().toString();
+			if(!stateSequence.contains(state)) {
+				duccLogger.info(location, duccId, "state: "+state);
+				stateSequence.add(state);
+			}
+		}
+		
+		iterator = gone.iterator();
+		while( iterator.hasNext() ) {
+			DuccId duccId = iterator.next();
+			mMap.remove(duccId);
+			tMap.remove(duccId);
+			duccLogger.info(location, duccId, "monitor stop");
+		}
+		
+		duccLogger.trace(location, jobid, "exit");
+	}
+	
+	protected DuccId getKey(String jobId) {
+		DuccId retVal = null;
+		Enumeration<DuccId> keys = mMap.keys();
+		while(keys.hasMoreElements()) {
+			DuccId duccId = keys.nextElement();
+			String mapId = ""+duccId.getFriendly();
+			if(mapId.equals(jobId)) {
+				retVal = duccId;
+				break;
+			}
+		}
+		return retVal;
+	}
+	
+	public MonitorInfo renew(String jobId, AtomicInteger updateCounter) {
+		String location = "renew";
+		duccLogger.trace(location, jobid, "enter");
+		
+		MonitorInfo monitorInfo = new MonitorInfo();
+		
+		int countAtArrival = updateCounter.get();
+		int countAtPresent = countAtArrival;
+		int sleepSecondsMax = 3*60;
+		
+		DuccId duccId = getKey(jobId);
+		
+		if(duccId == null) {
+			int sleepSeconds = 0;
+			duccLogger.info(location, duccId, "Waiting for update...");
+			while(duccId == null) {
+				try {
+					duccLogger.debug(location, duccId, "Waiting continues...");
+					Thread.sleep(1000);
+					sleepSeconds += 1;
+					if(sleepSeconds > sleepSecondsMax) {
+						break;
+					}
+					countAtPresent = updateCounter.get();
+					if((countAtPresent-countAtArrival) > 2) {
+						break;
+					}
+					duccId = getKey(jobId);
+				}
+				catch(Exception e) {
+				}
+			}
+			duccLogger.info(location, duccId, "Waiting complete.");
+			duccId = getKey(jobId);
+		}
+		
+		if(duccId != null) {
+			monitorInfo = mMap.get(duccId);
+			if(tMap.containsKey(duccId)) {
+				long expiryMillis = System.currentTimeMillis()+timeoutMillis+1;
+				TrackingInfo ti = tMap.get(duccId);
+				ti.time = expiryMillis;
+				duccLogger.info(location, duccId, "auto-cancel expiry extended");
+			}
+		}
+		else {
+			try {
+				int iJobId = Integer.parseInt(jobId);
+				duccId = new DuccId(iJobId);
+				duccLogger.info(location, duccId, "not found");
+			}
+			catch(Exception e) {
+				duccLogger.error(location, jobid, e);
+			}
+		}
+		
+		duccLogger.trace(location, jobid, "exit");
+		
+		return monitorInfo;
+	}
+	
+	protected Long getExpiry(DuccId duccId) {
+		String location = "getExpiry";
+		duccLogger.trace(location, duccId, "enter");
+		Long retVal = null;
+		if(!isCanceled(duccId)) {
+			if(isCancelable(duccId)) {
+				ConcurrentHashMap<DuccId,Long> eMap = getExpiryMap();
+				if(eMap.containsKey(duccId)) {
+					retVal = eMap.get(duccId);
+				}
+			}
+		}
+		duccLogger.trace(location, duccId, "exit");
+		return retVal;
+	}
+	
+	public ConcurrentHashMap<DuccId,Long> getExpiryMap() {
+		String location = "getExpiryMap";
+		duccLogger.trace(location, jobid, "enter");
+		
+		ConcurrentHashMap<DuccId,Long> eMap = new ConcurrentHashMap<DuccId,Long>();
+		
+		long nowMillis = System.currentTimeMillis();
+		
+		Enumeration<DuccId> keys = tMap.keys();
+		while(keys.hasMoreElements()) {
+			long minutesLeft = 0;
+			DuccId duccId = keys.nextElement();
+			TrackingInfo ti = tMap.get(duccId);
+			long expiryMillis = ti.time;
+			if(nowMillis < expiryMillis) {
+				minutesLeft = (expiryMillis - nowMillis) / millisPerMinute;
+			}
+			eMap.put(duccId, minutesLeft);
+		}
+		
+		duccLogger.trace(location, jobid, "exit");
+		
+		return eMap;
+	}
+
+	protected boolean isCanceled(DuccId duccId) {
+		return cMap.containsKey(duccId);
+	}
+	
+	private boolean isCancelable(DuccId duccId) {
+		String location = "isCancelable";
+		duccLogger.trace(location, duccId, "enter");
+		boolean retVal = false;
+		if(!cMap.containsKey(duccId)) {
+			MonitorInfo monitorInfo = mMap.get(duccId);
+			if(monitorInfo != null) {
+				ArrayList<String> stateSequence = monitorInfo.stateSequence;
+				if(stateSequence != null) {
+					if(stateSequence.contains(JobState.Completing.toString())) {
+						duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
+					}
+					else if(stateSequence.contains(JobState.Completed.toString())) {
+						duccLogger.debug(location, duccId, "state: <uncancelable> "+stateSequence);
+					}
+					else {
+						duccLogger.debug(location, duccId, "state: <cancelable> "+stateSequence);
+						retVal = true;
+					}
+				}
+				else {
+					duccLogger.warn(location, duccId, "stateSequence: <null>");
+				}
+			}
+			else {
+				duccLogger.warn(location, duccId, "monitorInfo: <null>");
+			}
+		}
+		else {
+			duccLogger.debug(location, duccId, "already canceled");
+		}
+		duccLogger.trace(location, duccId, "exit");
+		return retVal;
+	}
+
+	protected void cancel(DuccId duccId) {
+		String location = "cancel";
+		duccLogger.trace(location, jobid, "enter");
+		
+		String userId = System.getProperty("user.name");
+		
+		duccLogger.info(location, duccId, userId);
+		
+		String java = "/bin/java";
+		String jhome = System.getProperty("java.home");
+		String cp = System.getProperty("java.class.path");
+		String jclass = "org.apache.uima.ducc.cli.DuccManagedReservationCancel";
+		String arg1 = "--"+JobRequestProperties.key_id;
+		String arg2 = ""+duccId;
+		String arg3 = "--"+SpecificationProperties.key_reason;
+		String arg4 = "\"submitter terminated, therefore canceled automatically\"";
+		String arg5 = "--"+SpecificationProperties.key_role_administrator;
+		
+		String[] arglistUser = { "-u", userId, "--", jhome+java, "-cp", cp, jclass, arg1, arg2, arg3, arg4, arg5 };
+		String result = DuccAsUser.duckling(userId, arglistUser);
+		duccLogger.warn(location, duccId, result);
+		
+		cMap.put(duccId, new Long(System.currentTimeMillis()));
+		tMap.remove(duccId);
+
+		duccLogger.trace(location, jobid, "exit");
+	}
+	
+	protected void canceler(long nowMillis) {
+		String location = "canceler";
+		duccLogger.trace(location, jobid, "enter");
+
+		Enumeration<DuccId> keys = tMap.keys();
+		while(keys.hasMoreElements()) {
+			DuccId duccId = keys.nextElement();
+			TrackingInfo ti = tMap.get(duccId);
+			long expiryMillis = ti.time;
+			if(nowMillis > expiryMillis) {
+				if(isCancelable(duccId)) {
+					cancel(duccId);
+				}
+				else {
+					duccLogger.debug(location, duccId, "not cancelable");
+				}
+			}
+		}
+		
+		duccLogger.trace(location, jobid, "exit");
+	}
+	
+}

Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp?rev=1458366&r1=1458365&r2=1458366&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp Tue Mar 19 16:00:00 2013
@@ -113,7 +113,7 @@ if (table_style.equals("scroll")) {
 			<th title="The number of resources (machines or shares, depending on class) assigned to this reservation">Allocation</th>
 			<th title="The combined number of PIDs on the assigned resource(s) for user">User<br>Processes</th>
 			<th title="The memory allocation per resource for this reservation, in GB">Size</th>
-			<th title="The list of of machines assigned to this reservation">List</th>
+			<th title="The machine(s) assigned to this reservation">Host<br>Names</th>
 			<th title="The user specified description of this reservation">Description</th>
 	</tr>
 	</thead>
@@ -145,7 +145,7 @@ if (table_style.equals("classic")) {
 			<th title="The number of resources (machines or shares, depending on class) assigned to this reservation">Allocation</th>
 			<th title="The combined number of PIDs on the assigned resource(s) for user">User<br>Processes</th>
 			<th title="The memory allocation per resource for this reservation, in GB">Size</th>
-			<th title="The list of of machines assigned to this reservation">List</th>
+			<th title="The machine(s) assigned to this reservation">Host<br>Names</th>
 			<th title="The user specified description of this reservation">Description</th>
 		</tr>
 		</thead>