package net.sourceforge.solexatools.webapp.controller; import com.google.gson.Gson; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import net.sourceforge.seqware.common.business.WorkflowRunService; import net.sourceforge.seqware.common.business.WorkflowService; import net.sourceforge.seqware.common.model.IUS; import net.sourceforge.seqware.common.model.Lane; import net.sourceforge.seqware.common.model.Registration; import net.sourceforge.seqware.common.model.Sample; import net.sourceforge.seqware.common.model.WorkflowRun; import io.seqware.common.model.WorkflowRunStatus; import net.sourceforge.solexatools.Security; import net.sourceforge.solexatools.util.PaginationUtil; import net.sourceforge.solexatools.webapp.metamodel.Flexigrid; import net.sourceforge.solexatools.webapp.metamodel.Flexigrid.Cells; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.BaseCommandController; /** * RegistrationSetupController * * @author boconnor * @version $Id: $Id */ public class AnalisysTableControllerDetails extends BaseCommandController { private WorkflowService workflowService; private WorkflowRunService workflowRunService; private Flexigrid flexigrid; /** * <p> * Constructor for AnalisysListController. * </p> */ public AnalisysTableControllerDetails() { super(); setSupportedMethods(new String[] { METHOD_GET, METHOD_POST }); } /** * {@inheritDoc} * * @return * @throws java.lang.Exception */ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { // Registration registration = Security.requireRegistration(request, response); Registration registration = Security.getRegistration(request); if (registration == null) { return null; } String tableSel = request.getParameter("tablesel"); String tableModel = request.getParameter("tablemodel"); String sortName = request.getParameter("sortname"); String sortOrder = request.getParameter("sortorder"); String pageStr = request.getParameter("page"); String rowsPagesStr = request.getParameter("rp"); String filter = request.getParameter("filter"); String qtype = request.getParameter("qtype"); String query = request.getParameter("query"); int page = 1; int rowsPages = 15; try { page = Integer.parseInt(pageStr); rowsPages = Integer.parseInt(rowsPagesStr); } catch (NumberFormatException e) { e.printStackTrace(); } if (workflowRunService != null) { // This workflows. Statuses are generated for them. // We sort them to have the same model as we have // while generating table model response.setContentType("application/json"); List<WorkflowRun> workflowRuns = null; String searchQuery = ""; if (qtype != null && !"".equals(qtype) && query != null && !"".equals(query)) { searchQuery = " and cast(wr." + qtype + " as string) like '%" + query + "%'"; } if (null != filter) switch (filter) { case "canceled": workflowRuns = workflowRunService.findByCriteria("wr.owner.registrationId = " + registration.getRegistrationId() + " and ( wr.status = 'canceled' or wr.status = 'cancelled')" + searchQuery); break; case "failed": workflowRuns = workflowRunService.findByCriteria("wr.owner.registrationId = " + registration.getRegistrationId() + " and (wr.status = 'failed' or wr.status = 'failed-testing')" + searchQuery); break; case "running": workflowRuns = workflowRunService.findByCriteria("wr.owner.registrationId = " + registration.getRegistrationId() + " and ( wr.status = 'running' or wr.status = 'pending')" + searchQuery); break; default: workflowRuns = workflowRunService.findByCriteria("wr.owner.registrationId = " + registration.getRegistrationId() + searchQuery); break; } String json = createSampleTableJson(workflowRuns, page, rowsPages, sortName, sortOrder); response.getWriter().write(json); response.flushBuffer(); } return null; } private String createSampleTableJson(List<WorkflowRun> workflowRuns, int page, int rp, String sortName, String sortOrder) { // FIXME: flexigrid = createSampleFlexigrid(workflowRuns, page); if (flexigrid == null) { // flexigrid = createSampleFlexigrid(workflowRuns, page); } flexigrid.setPage(page); List<Cells> rowsAll = flexigrid.getRows(); if (!"undefined".equals(sortOrder)) { // long start = System.nanoTime(); sortRows(rowsAll, sortOrder, sortName); // long end = System.nanoTime() - start; // Log.info("Sorting SampleTable Time: " + end / 1e6); } @SuppressWarnings("unchecked") List<Cells> pagedCells = PaginationUtil.subList(page - 1, rp, rowsAll); flexigrid.setRows(pagedCells); // Convert to Flexigrid JSON Gson gson = new Gson(); String json = gson.toJson(flexigrid); flexigrid.setRows(rowsAll); return json; } private Flexigrid createSampleFlexigrid(List<WorkflowRun> workflowRuns, int page) { Flexigrid flexigrid = new Flexigrid(workflowRuns.size(), page); for (WorkflowRun workflowRun : workflowRuns) { List<String> cellsModel = new LinkedList<>(); cellsModel.add(workflowRun.getCreateTimestamp().toString()); cellsModel.add(workflowRun.getWorkflow().getName()); cellsModel.add(workflowRun.getWorkflow().getVersion()); cellsModel.add(workflowRun.getStatus().toString()); cellsModel.add(workflowRun.getSwAccession().toString()); // cellsModel.add(sampleToHtml(workflowRun.getSamples())); // cellsModel.add(iUSToHtml(workflowRun.getIus())); // cellsModel.add(laneToHtml(workflowRun.getLanes())); cellsModel.add(workflowRun.getHost()); if (WorkflowRunStatus.failed == workflowRun.getStatus()) { cellsModel.add("<a href='#' popup-stdout='true' tt='wfr' stdout='" + workflowRun.getStdOut() + "'>output</a> / <a href='#' popup-stderr='true' tt='wfr' stderr='" + workflowRun.getStdErr() + "' >errors</a>"); } else { cellsModel.add(""); } cellsModel.add("<a href='#' popup-stdout='true' tt='wfr' stdout='" + workflowRun.getIniFile() + "'>parameters</a>"); if (WorkflowRunStatus.running == workflowRun.getStatus()) { cellsModel.add("<a href='#' popup-workflow-cancel='true' tt='wfrr' object-id='" + workflowRun.getWorkflowRunId() + "'>cancel</a>"); } else if (WorkflowRunStatus.cancelled == workflowRun.getStatus()) { cellsModel.add("<a href='#' popup-workflow-retry='true' tt='wfrr' object-id='" + workflowRun.getWorkflowRunId() + "'>retry</a>"); } else if (WorkflowRunStatus.failed == workflowRun.getStatus()) { cellsModel.add("<a href='#' popup-workflow-retry='true' tt='wfrr' object-id='" + workflowRun.getWorkflowRunId() + "'>retry</a>"); } else { cellsModel.add(""); } Flexigrid.Cells cells = flexigrid.new Cells(cellsModel); flexigrid.addRow(cells); } return flexigrid; } private String sampleToHtml(Set<Sample> samples) { StringBuilder sb = new StringBuilder(); boolean first = true; if (samples != null) { for (Sample s : samples) { if (!first) { sb.append(", "); } sb.append(s.getTitle()).append(" (SWID:").append(s.getSwAccession()).append(")"); first = false; } } return (sb.toString()); } private String iUSToHtml(Set<IUS> ius) { StringBuilder sb = new StringBuilder(); boolean first = true; if (ius != null) { for (IUS s : ius) { if (!first) { sb.append(", "); } sb.append(s.getName()).append(" (SWID:").append(s.getSwAccession()).append(")"); first = false; } } return (sb.toString()); } private String laneToHtml(Set<Lane> lanes) { StringBuilder sb = new StringBuilder(); boolean first = true; if (lanes != null) { for (Lane s : lanes) { if (!first) { sb.append(", "); } sb.append(s.getName()).append(" (SWID:").append(s.getSwAccession()).append(")"); first = false; } } return (sb.toString()); } private void sortRows(List<Cells> rowsAll, String sortOrder, String sortName) { int columnPos = 0; if (null != sortName) switch (sortName) { case "date": columnPos = 0; break; case "status": columnPos = 1; break; case "swid": columnPos = 2; break; } @SuppressWarnings("rawtypes") Comparator comparator = null; if (null != sortOrder) switch (sortOrder) { case "asc": comparator = new AnalisysTableControllerDetails.CellsComparator(columnPos); break; case "desc": comparator = Collections.reverseOrder(new AnalisysTableControllerDetails.CellsComparator(columnPos)); break; } Collections.sort(rowsAll, comparator); } private void initSortingTreeAttr(HttpServletRequest request) { HttpSession session = request.getSession(false); if (session.getAttribute("ascMyListAnalysis") == null) { session.setAttribute("ascMyListAnalysis", true); session.setAttribute("ascMySharedAnalysises", true); session.setAttribute("ascAnalysisesSharedWithMe", true); session.setAttribute("ascMyRunningListAnalysis", true); } } /** * <p> * Getter for the field <code>workflowService</code>. * </p> * * @return a {@link net.sourceforge.seqware.common.business.WorkflowService} object. */ public WorkflowService getWorkflowService() { return workflowService; } /** * <p> * Setter for the field <code>workflowService</code>. * </p> * * @param workflowService * a {@link net.sourceforge.seqware.common.business.WorkflowService} object. */ public void setWorkflowService(WorkflowService workflowService) { this.workflowService = workflowService; } /** * <p> * Getter for the field <code>workflowRunService</code>. * </p> * * @return a {@link net.sourceforge.seqware.common.business.WorkflowRunService} object. */ public WorkflowRunService getWorkflowRunService() { return workflowRunService; } /** * <p> * Setter for the field <code>workflowRunService</code>. * </p> * * @param workflowRunService * a {@link net.sourceforge.seqware.common.business.WorkflowRunService} object. */ public void setWorkflowRunService(WorkflowRunService workflowRunService) { this.workflowRunService = workflowRunService; } @SuppressWarnings({ "rawtypes" }) private class CellsComparator implements Comparator { private int pos; public CellsComparator(int pos) { this.pos = pos; } @Override public int compare(Object o1, Object o2) { return (((Cells) o1).getCell().get(pos)).compareToIgnoreCase(((Cells) o2).getCell().get(pos)); } }; }