private void handleDuccServletJobWorkitemsData()

in uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java [1342:1526]


	private void handleDuccServletJobWorkitemsData(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response)
	throws IOException, ServletException
	{
		String methodName = "handleDuccServletJobWorkitemsData";
		duccLogger.trace(methodName, null, messages.fetch("enter"));
		StringBuffer sb = new StringBuffer();
		String jobNo = request.getParameter("id");
		DuccWorkJob job = getJob(jobNo);
		if(job != null) {
			try {
				String directory = job.getLogDirectory()+jobNo;
				EffectiveUser eu = EffectiveUser.create(request);
				long wiVersion = job.getWiVersion();
				AlienWorkItemStateReader workItemStateReader = new AlienWorkItemStateReader(eu, component, directory, wiVersion);
				ConcurrentSkipListMap<Long,IWorkItemState> map = workItemStateReader.getMap();
			    if (map == null) {
			    	sb.append(eu.isLoggedin() ? "(data missing or unreadable)" : "(not visible - try logging in)");
			    } else if (map.size() == 0) {
			    	sb.append("(no work-items processed)");
			    }
			    else {
			    	ConcurrentSkipListMap<IWorkItemState,IWorkItemState> sortedMap = new ConcurrentSkipListMap<IWorkItemState,IWorkItemState>();
					for (Entry<Long, IWorkItemState> entry : map.entrySet()) {
						sortedMap.put(entry.getValue(), entry.getValue());
					}
					DuccMachinesData machinesData = DuccMachinesData.getInstance();
			    	DecimalFormat formatter = new DecimalFormat("##0.00");
					double time;
					String ptime;
					String itime;
					int counter = 0;
			    	for (Entry<IWorkItemState, IWorkItemState> entry : sortedMap.entrySet()) {
			    		StringBuffer row = new StringBuffer();
			    		IWorkItemState wis = entry.getValue();
					    row.append(trGet(counter++));
			    		if(counter > DuccConstants.workItemsDisplayMax) {
			    			// SeqNo
							row.append("<td align=\"right\">");
							row.append("*****");
							// Id
							row.append("<td align=\"right\">");
							row.append("*****");
							// Status
							row.append("<td align=\"right\">");
							row.append("display");
							// Start Time 
							row.append("<td align=\"right\">");
							row.append("limit");
							// Queuing Time (sec)
							row.append("<td align=\"right\">");
							row.append("reached");
							// Processing Time (sec)
							row.append("<td align=\"right\">");
							row.append("*****");
							// Investment Time (sec)
							row.append("<td align=\"right\">");
							row.append("*****");
							// Node (IP)
							row.append("<td align=\"right\">");
							row.append("*****");
							// Node (Name)
							row.append("<td align=\"right\">");
							row.append("*****");
							// PID
							row.append("<td align=\"right\">");
							row.append("*****");
							sb.append(row);
			    			duccLogger.warn(methodName, job.getDuccId(), "work items display max:"+DuccConstants.workItemsDisplayMax);
			    			break;
			    		}
			    		long refTime = DuccHandlerUtils.getReferenceTime(job,wis.getNode(),wis.getPid());
			    		// SeqNo
						row.append("<td align=\"right\">");
						row.append(wis.getSeqNo());
						// Id
						row.append("<td align=\"right\">");
						row.append(wis.getWiId());
						// Status
						row.append("<td align=\"right\">");

						State state = wis.getState();
						StringBuffer status = new StringBuffer();
						switch(state) {
						case lost:
							//status = row.append("<span title=\"Work Item was queued but never dequeued. (This is most likely a DUCC framework issue.)\" >");
							status.append("<span title=\"Work Item was queued but never dequeued.\" >");
							status.append(state);
							status.append("</span>");
							break;
						default:
							status.append(state);
							break;
						}
						row.append(status);
						// Start Time 
						String fmt_startTime = "";
						IDuccProcess jd = job.getDriverProcess();
						if(jd != null) {
							long jdStartTime = Helper.getTimeStart(jd);
							if(jdStartTime >= 0) {
								long wiStartTime = wis.getMillisAtStart();
								if(wiStartTime > jdStartTime) {
									double elapsedTime = wiStartTime - jdStartTime;
									elapsedTime = elapsedTime/1000;
									fmt_startTime = formatter.format(elapsedTime);
								}
							}
						}
						row.append("<td align=\"right\">");
						row.append(fmt_startTime);
						// Queuing Time (sec)
						time = getAdjustedTime(wis.getMillisOverhead(refTime), job);
						time = time/1000;
						row.append("<td align=\"right\">");
						row.append(formatter.format(time));
						// Processing Time (sec)
						time = getAdjustedTime(wis.getMillisProcessing(refTime), job);
						time = time/1000;
						ptime = formatter.format(time);
						row.append("<td align=\"right\">");
						switch(state) {
						case start:
						case queued:
						case operating:
							row.append("<span class=\"health_green\">");
							break;
						default:
							row.append("<span class=\"health_black\">");
							break;
						}
						row.append(ptime);
						row.append("</span>");
						// Investment Time (sec)
						time = getAdjustedTime(wis.getMillisInvestment(refTime), job);
						time = time/1000;
						itime = formatter.format(time);
						row.append("<td align=\"right\">");
						String ispan = "<span class=\"health_black\">";
						if(time > 0) {
							if(!itime.equals(ptime)) {
								ispan = "<span title=\"investment reset\" class=\"health_red\">";
							}
						}
						row.append(ispan);
						row.append(itime);
						row.append("</span>");
						// Node (IP)
						row.append("<td>");
						String node = wis.getNode();
						if(node != null) {
							row.append(node);
						}
						// Node (Name)
						row.append("<td>");
						if(node != null) {
							String hostName = machinesData.getNameForIp(node);
							if(hostName != null) {
								row.append(hostName);
							}
						}
						// PID
						row.append("<td>");
						String pid = wis.getPid();
						if(pid != null) {
							row.append(pid);
						}
						sb.append(row);
						duccLogger.trace(methodName, null, "**"+counter+"**"+" "+row);
			    	}
			    }
			}
			catch(Exception e) {
				duccLogger.warn(methodName, null, e.getMessage());
				duccLogger.debug(methodName, null, e);
				//sb = new StringBuffer();
				sb.append("no accessible data ("+e+")");
			}
		}
		else {
			sb.append("no accessible data (no job?)");
		}

		response.getWriter().println(sb);
		duccLogger.trace(methodName, null, messages.fetch("exit"));
	}