package org.openmrs.module.reporting.web.reports; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.openmrs.api.context.Context; import org.openmrs.module.reporting.report.ReportRequest; import org.openmrs.module.reporting.report.ReportRequest.Status; import org.openmrs.module.reporting.report.service.ReportService; import org.openmrs.module.reporting.web.controller.portlet.ReportingPortletController; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * Controller for the manage report queue page */ @Controller @Order(50) public class ManageReportQueuePortletController extends ReportingPortletController { @RequestMapping(value = "/module/reporting/portlets/manageReportQueue") public void showReportRequests() { //this method is just to get the controller registered for the portlet's url. //The model data is added from populateModel() method below } /** * @see org.openmrs.web.controller.PortletController#populateModel(javax.servlet.http.HttpServletRequest, * java.util.Map) */ @Override protected void populateModel(HttpServletRequest request, Map<String, Object> model) { super.populateModel(request, model); ReportService rs = Context.getService(ReportService.class); List<ReportRequest> reportRequets = Context.getService(ReportService.class).getReportRequests(null, null, null, Status.REQUESTED, Status.PROCESSING); //loop over all the queued reports and get their positions in the queue HashMap<Integer, Integer> reportPositionMap = new HashMap<Integer, Integer>(reportRequets.size()); for (ReportRequest reportRequest : reportRequets) { if (reportRequest.getStatus() == Status.REQUESTED) reportPositionMap.put(reportRequest.getId(), getQueuePosition(reportRequest, rs)); } model.put("reportRequests", reportRequets); model.put("reportPositionMap", reportPositionMap); } /** * Utility method that extracts the position of a queued report request from its log file * contents * * @param reportRequest the {@link ReportRequest} object * @param rs {@link ReportService} object * @return the position of the report in the queue */ private Integer getQueuePosition(ReportRequest reportRequest, ReportService rs) { List<String> logs = rs.loadReportLog(reportRequest); Integer position = null; if (logs != null) { for (String log : logs) { log = log.trim(); if (log.indexOf("position") > -1) { String[] tokens = log.split(" "); try { position = Integer.valueOf(tokens[tokens.length - 1]); } catch (NumberFormatException e) { //ignore } } } } return position; } }