package net.sourceforge.solexatools.webapp.controller;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sourceforge.seqware.common.business.FileReportService;
import net.sourceforge.seqware.common.business.SampleReportService;
import net.sourceforge.seqware.common.business.SampleReportService.Status;
import net.sourceforge.seqware.common.business.SequencerRunService;
import net.sourceforge.seqware.common.model.FileReportRow;
import net.sourceforge.seqware.common.model.Processing;
import net.sourceforge.seqware.common.model.Registration;
import net.sourceforge.seqware.common.model.SequencerRun;
import net.sourceforge.seqware.common.model.SequencerRunReportId;
import net.sourceforge.seqware.common.model.Workflow;
import net.sourceforge.seqware.common.model.WorkflowRun;
import net.sourceforge.solexatools.Security;
import net.sourceforge.solexatools.webapp.metamodel.Flexigrid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.google.gson.Gson;
import net.sourceforge.seqware.common.util.Log;
@Controller
/**
* <p>SequencerRunReportTableController class.</p>
*
* @author boconnor
* @version $Id: $Id
*/
public class SequencerRunReportTableController implements Serializable {
private static final long serialVersionUID = 1L;
/** Constant <code>SEQ_RUN_ID="seq_run_id"</code> */
public static final String SEQ_RUN_ID = "seq_run_id";
/** Constant <code>SORT_NAME="sortname"</code> */
public static final String SORT_NAME = "sortname";
/** Constant <code>SORT_ORDER="sortorder"</code> */
public static final String SORT_ORDER = "sortorder";
/** Constant <code>SORT_ORDER_ASC="asc"</code> */
public static final String SORT_ORDER_ASC = "asc";
/** Constant <code>SORT_ORDER_DESC="desc"</code> */
public static final String SORT_ORDER_DESC = "desc";
/** Constant <code>PAGE_NUM="page"</code> */
public static final String PAGE_NUM = "page";
/** Constant <code>ROWS_PER_PAGE="rp"</code> */
public static final String ROWS_PER_PAGE = "rp";
/** Constant <code>TABLE_SEL="tablesel"</code> */
public static final String TABLE_SEL = "tablesel";
/** Constant <code>TABLE_MODEL="tablemodel"</code> */
public static final String TABLE_MODEL = "tablemodel";
/** Constant <code>CSV_TYPE="csvtype"</code> */
public static final String CSV_TYPE = "csvtype";
/** Constant <code>CHECK="check"</code> */
public static final String CHECK = "check";
// Sortfields
/** Constant <code>FILE_SAMPLE="f_sample"</code> */
public static final String FILE_SAMPLE = "f_sample";
/** Constant <code>FILE_TISSUE="f_tissue"</code> */
public static final String FILE_TISSUE = "f_tissue";
/** Constant <code>FILE_LIBRARY="f_library"</code> */
public static final String FILE_LIBRARY = "f_library";
/** Constant <code>FILE_TEMPLATE="f_template"</code> */
public static final String FILE_TEMPLATE = "f_template";
/** Constant <code>FILE_IUS="f_ius"</code> */
public static final String FILE_IUS = "f_ius";
/** Constant <code>FILE_LANE="f_lane"</code> */
public static final String FILE_LANE = "f_lane";
/** Constant <code>FILE_FILE="f_file"</code> */
public static final String FILE_FILE = "f_file";
// New sort fields
/** Constant <code>FILE_STUDY_TITLE="f_study_title"</code> */
public static final String FILE_STUDY_TITLE = "f_study_title";
/** Constant <code>FILE_STUDY_SWID="f_study_swid"</code> */
public static final String FILE_STUDY_SWID = "f_study_swid";
/** Constant <code>FILE_EXPERIMENT_NAME="f_exp_name"</code> */
public static final String FILE_EXPERIMENT_NAME = "f_exp_name";
/** Constant <code>FILE_EXPERIMENT_SWID="f_exp_swid"</code> */
public static final String FILE_EXPERIMENT_SWID = "f_exp_swid";
/** Constant <code>FILE_PARENT_SAMPLE_NAME="f_sample_name"</code> */
public static final String FILE_PARENT_SAMPLE_NAME = "f_sample_name";
/** Constant <code>FILE_PARENT_SAMPLE_SWID="f_sample_swid"</code> */
public static final String FILE_PARENT_SAMPLE_SWID = "f_sample_swid";
/** Constant <code>FILE_SAMPLE_NAME="f_child_sample_name"</code> */
public static final String FILE_SAMPLE_NAME = "f_child_sample_name";
/** Constant <code>FILE_SAMPLE_SWID="f_child_sample_swid"</code> */
public static final String FILE_SAMPLE_SWID = "f_child_sample_swid";
/** Constant <code>FILE_SEQUENCER_NAME="f_seqrun_name"</code> */
public static final String FILE_SEQUENCER_NAME = "f_seqrun_name";
/** Constant <code>FILE_SEQUENCER_SWID="f_seqrun_swid"</code> */
public static final String FILE_SEQUENCER_SWID = "f_seqrun_swid";
/** Constant <code>FILE_LANE_NAME="f_lane_name"</code> */
public static final String FILE_LANE_NAME = "f_lane_name";
/** Constant <code>FILE_LANE_NUMBER="f_lane_num"</code> */
public static final String FILE_LANE_NUMBER = "f_lane_num";
/** Constant <code>FILE_LANE_SWID="f_lane_swid"</code> */
public static final String FILE_LANE_SWID = "f_lane_swid";
/** Constant <code>FILE_IUS_NAME="f_ius_name"</code> */
public static final String FILE_IUS_NAME = "f_ius_name";
/** Constant <code>FILE_IUS_TAG="f_ius_tag"</code> */
public static final String FILE_IUS_TAG = "f_ius_tag";
/** Constant <code>FILE_IUS_SWID="f_ius_swid"</code> */
public static final String FILE_IUS_SWID = "f_ius_swid";
/** Constant <code>FILE_WF_NAME="f_wf_name"</code> */
public static final String FILE_WF_NAME = "f_wf_name";
/** Constant <code>FILE_WF_VERSION="f_wf_version"</code> */
public static final String FILE_WF_VERSION = "f_wf_version";
/** Constant <code>FILE_WF_SWID="f_wf_swid"</code> */
public static final String FILE_WF_SWID = "f_wf_swid";
/** Constant <code>FILE_RUN_NAME="f_run_name"</code> */
public static final String FILE_RUN_NAME = "f_run_name";
/** Constant <code>FILE_RUN_SWID="f_run_swid"</code> */
public static final String FILE_RUN_SWID = "f_run_swid";
/** Constant <code>FILE_PROCESSING_ALG="f_processing_alg"</code> */
public static final String FILE_PROCESSING_ALG = "f_processing_alg";
/** Constant <code>FILE_PROCESSING_SWID="f_processing_swid"</code> */
public static final String FILE_PROCESSING_SWID = "f_processing_swid";
/** Constant <code>FILE_META_TYPE="f_file_meta"</code> */
public static final String FILE_META_TYPE = "f_file_meta";
/** Constant <code>FILE_SWID="f_file_swid"</code> */
public static final String FILE_SWID = "f_file_swid";
/** Constant <code>FILE_PATH="f_file_path"</code> */
public static final String FILE_PATH = "f_file_path";
private static final String SAMPLE_SEQUENCER_NAME = "s_seqrun_name";
// Table model data
private static final int WIDTH = 100;
private static final String INIT = "init";
private String orderFieldSeqRun;
private String orderTypeSeqRun;
private String orderFieldFile;
private String orderTypeFile;
private boolean isProgressDownloaded;
private boolean isFileDownloaded;
@Autowired
private SequencerRunService sequencerRunService;
@Autowired
private SampleReportService sampleReportService;
@Autowired
private FileReportService fileReportService;
private List<Workflow> workflows;
/**
* <p>
* Setter for the field <code>sequencerRunService</code>.
* </p>
*
* @param service
* a {@link net.sourceforge.seqware.common.business.SequencerRunService} object.
*/
public void setSequencerRunService(SequencerRunService service) {
this.sequencerRunService = service;
}
/**
* <p>
* Setter for the field <code>sampleReportService</code>.
* </p>
*
* @param service
* a {@link net.sourceforge.seqware.common.business.SampleReportService} object.
*/
public void setSampleReportService(SampleReportService service) {
this.sampleReportService = service;
}
/**
* <p>
* Setter for the field <code>fileReportService</code>.
* </p>
*
* @param service
* a {@link net.sourceforge.seqware.common.business.FileReportService} object.
*/
public void setFileReportService(FileReportService service) {
this.fileReportService = service;
}
/**
* <p>
* doCreateTableJson.
* </p>
*
* @param request
* a {@link javax.servlet.http.HttpServletRequest} object.
* @param response
* a {@link javax.servlet.http.HttpServletResponse} object.
* @return a {@link org.springframework.web.servlet.ModelAndView} object.
* @throws java.io.IOException
* if any.
*/
@RequestMapping("/reportSeqRunTable.htm")
public ModelAndView doCreateTableJson(HttpServletRequest request, HttpServletResponse response) throws IOException {
Registration registration = Security.getRegistration(request);
if (registration == null) return null;
// Read all the possible parameters
String seqRunID = request.getParameter(SEQ_RUN_ID);
String tableSel = request.getParameter(TABLE_SEL);
String tableModel = request.getParameter(TABLE_MODEL);
String sortName = request.getParameter(SORT_NAME);
String sortOrder = request.getParameter(SORT_ORDER);
String pageStr = request.getParameter(PAGE_NUM);
String rowsPagesStr = request.getParameter(ROWS_PER_PAGE);
String init = request.getParameter(INIT);
String csvtype = request.getParameter(CSV_TYPE);
String check = request.getParameter(CHECK);
Integer seqRunId = null;
int page = 1;
int rowsPages = 15;
try {
page = Integer.parseInt(pageStr);
} catch (NumberFormatException e) {
// this is ok. Default value is used.
}
try {
seqRunId = Integer.parseInt(seqRunID);
} catch (NumberFormatException e) {
// this is ok. Default value is used.
}
try {
rowsPages = Integer.parseInt(rowsPagesStr);
} catch (NumberFormatException e) {
// this is ok. Default value is used.
}
response.setContentType("application/json");
SequencerRun seqRun = null;
if (seqRunId != null) {
seqRun = sequencerRunService.findByID(seqRunId);
}
if (csvtype != null) {
if ("progress".equals(csvtype)) {
if (check != null) {
response.getWriter().write(Boolean.toString(isProgressDownloaded));
// reset
if (isProgressDownloaded) {
isProgressDownloaded = false;
}
response.flushBuffer();
return null;
}
isProgressDownloaded = false;
sendCsvProgressReport(response, seqRun);
isProgressDownloaded = true;
return null;
}
if ("file".equals(csvtype)) {
if (check != null) {
response.getWriter().write(Boolean.toString(isFileDownloaded));
// reset
if (isFileDownloaded) {
isFileDownloaded = false;
}
response.flushBuffer();
return null;
}
isFileDownloaded = false;
sendCsvFileReport(response, seqRun);
isFileDownloaded = true;
return null;
}
}
if (init != null) {
// Clear all the data
workflows = getSequencersWorkflows(seqRun, registration);
Collections.sort(workflows);
ModelAndView modelAndView = new ModelAndView("ReportSequencerRun");
createChartModel(seqRun, modelAndView);
modelAndView.addObject("seq_run_id", seqRunID);
return modelAndView;
}
if (tableModel != null) {
// Get Model for sample
String json = createSampleTableModelJson(workflows);
response.getWriter().write(json);
response.flushBuffer();
return null;
}
if ("seqrun".equals(tableSel)) {
orderFieldSeqRun = sortName;
orderTypeSeqRun = sortOrder;
String json = createSeqRunsTableContentJson(seqRun, page, rowsPages, sortName, sortOrder);
response.getWriter().write(json);
response.flushBuffer();
return null;
}
if ("file".equals(tableSel)) {
orderFieldFile = sortName;
orderTypeFile = sortOrder;
String json = createFileTableJson(seqRun, page, rowsPages, sortName, sortOrder);
response.getWriter().write(json);
response.flushBuffer();
return null;
}
return null;
}
private void sendCsvProgressReport(HttpServletResponse response, SequencerRun seqRun) throws IOException {
String sortField = getHibernateSortField(orderFieldSeqRun, orderTypeSeqRun);
if (!orderTypeSeqRun.equals("asc") && !orderTypeSeqRun.equals("desc")) {
orderTypeSeqRun = "asc";
}
StringBuilder sb = new StringBuilder();
sb.append("Sequencer_Run\tLane\tIUS\tSample\t");
for (Workflow workflow : workflows) {
sb.append(workflow.getName()).append(" ").append(workflow.getVersion()).append("\t");
}
sb.append("\n");
List<SequencerRunReportId> rows = sampleReportService.getSequencerRunReportIds(seqRun, sortField, orderTypeSeqRun);
for (SequencerRunReportId row : rows) {
sb.append(removeNulls(row.getSequencerRun().getName())).append("\t");
sb.append(removeNulls(row.getLane().getName())).append("\t");
sb.append(removeNulls(row.getIus().getSwAccession().toString())).append("\t");
sb.append(removeNulls(row.getChildSample().getTitle())).append("\t");
for (Workflow workflow : workflows) {
Status status = sampleReportService.getStatus(row.getStudy(), row.getChildSample(), row.getIus(), row.getLane(),
row.getSequencerRun(), workflow);
if (status == null) {
sb.append(Status.notstarted.name()).append("\t");
} else {
sb.append(status).append("\t");
}
}
sb.append("\n");
}
response.setContentType("text/csv");
response.addHeader("Content-Disposition", "attachment;filename=progressReport.csv");
response.addHeader("Content-Type", "application/force-download");
response.getWriter().write(sb.toString());
response.flushBuffer();
}
private void sendCsvFileReport(HttpServletResponse response, SequencerRun seqRun) throws IOException {
String sortField = getHibernateSortField(orderFieldFile, orderTypeFile);
if (!orderTypeFile.equals("asc") && !orderTypeFile.equals("desc")) {
orderTypeFile = "asc";
}
StringBuilder sb = new StringBuilder();
sb.append("Sequencer_Run\tLane\tIUS\tSample\tExperiment\tStudy\tWorkflow\tWorkflow_Run\tProcessing\tFile\n");
List<FileReportRow> rows = fileReportService.getReportForSequencerRun(seqRun, sortField, orderTypeFile);
for (FileReportRow row : rows) {
sb.append(removeNulls(row.getLane().getSequencerRun().getName())).append("\t");
sb.append(removeNulls(row.getLane().getName())).append("\t");
sb.append(removeNulls(row.getIus().getSwAccession().toString())).append("\t");
sb.append(removeNulls(row.getChildSample().getTitle())).append("\t");
sb.append(removeNulls(row.getExperiment().getTitle())).append("\t");
sb.append(removeNulls(row.getStudy().getTitle())).append("\t");
Processing processing = row.getProcessing();
Workflow workflow = null;
WorkflowRun run = null;
if (processing != null) {
// try to get processing related workflow run
run = processing.getWorkflowRun();
if (run == null) {
// if no workflow run found, let's try to get workflow run by ancestor
// run id
run = processing.getWorkflowRunByAncestorWorkflowRunId();
}
if (run != null) {
// if run is found, get workflow
workflow = run.getWorkflow();
}
}
if (workflow != null) {
sb.append(workflow.getName()).append("\t");
} else {
sb.append("\t");
}
if (run != null) {
sb.append(run.getName()).append("\t");
} else {
sb.append("\t");
}
if (processing != null) {
sb.append(processing.getAlgorithm()).append("\t");
} else {
sb.append("\t");
}
sb.append(row.getFile().getFilePath()).append("\t");
sb.append("\n");
}
response.setContentType("text/csv");
response.addHeader("Content-Type", "application/force-download");
response.addHeader("Content-Disposition", "attachment;filename=fileReport.csv");
response.getWriter().write(sb.toString());
response.flushBuffer();
}
private void createChartModel(SequencerRun seqRun, ModelAndView modelAndView) {
createOverallChart(modelAndView, seqRun);
createWorkflowCharts(modelAndView, seqRun);
}
private void createWorkflowCharts(ModelAndView modelAndView, SequencerRun seqRun) {
Map<Workflow, String> workflowCharts = new HashMap<>();
for (Workflow workflow : workflows) {
List<Status> statuses = sampleReportService.getStatusesForWorkflow(seqRun, workflow);
Map<Status, Integer> statusCount = new LinkedHashMap<>();
statusCount.put(Status.failed, 0);
statusCount.put(Status.pending, 0);
statusCount.put(Status.running, 0);
statusCount.put(Status.notstarted, 0);
statusCount.put(Status.completed, 0);
for (Status status : statuses) {
int count = sampleReportService.countOfStatus(seqRun, workflow, status);
statusCount.put(status, count);
}
int current = 0;
StringBuilder out = new StringBuilder();
for (Status status : statusCount.keySet()) {
current++;
int count = statusCount.get(status);
String sStatus = status.toString();
if (Status.notstarted == status) {
sStatus = "not started";
}
out.append("['").append(sStatus).append("',").append(count).append("]");
if (current != statusCount.keySet().size()) {
out.append(",");
}
}
workflowCharts.put(workflow, out.toString());
}
modelAndView.addObject("names", workflows);
modelAndView.addObject("chartData", workflowCharts);
}
private void createOverallChart(ModelAndView modelAndView, SequencerRun seqRun) {
List<Status> statuses = sampleReportService.getStatusesForSequencerRun(seqRun);
Map<Status, Integer> statusCount = new LinkedHashMap<>();
statusCount.put(Status.failed, 0);
statusCount.put(Status.pending, 0);
statusCount.put(Status.running, 0);
statusCount.put(Status.notstarted, 0);
statusCount.put(Status.completed, 0);
for (Status status : statuses) {
int count = sampleReportService.countOfStatus(seqRun, status);
statusCount.put(status, count);
}
int current = 0;
StringBuilder out = new StringBuilder();
for (Status status : statusCount.keySet()) {
current++;
int count = statusCount.get(status);
String sStatus = status.toString();
if (Status.notstarted == status) {
sStatus = "not started";
}
out.append("['").append(sStatus).append("',").append(count).append("]");
if (current != statusCount.keySet().size()) {
out.append(",");
}
}
modelAndView.addObject("overallChartData", out.toString());
}
private String createFileTableJson(SequencerRun seqRun, int page, int rowsPages, String sortName, String sortOrder) {
Flexigrid fileFlexigrid = createFileFlexigrid(seqRun, page, rowsPages, sortName, sortOrder);
// Convert to Flexigrid JSON
Gson gson = new Gson();
String json = gson.toJson(fileFlexigrid);
return json;
}
private Flexigrid createFileFlexigrid(SequencerRun seqRun, int page, int rowsPages, String sortName, String sortOrder) {
String sortField = getHibernateSortField(sortName, sortOrder);
if (!sortOrder.equals("asc") && !sortOrder.equals("desc")) {
sortOrder = "asc";
}
List<FileReportRow> rows = fileReportService.getReportForSequencerRun(seqRun, sortField, sortOrder, (page - 1) * rowsPages,
rowsPages);
Flexigrid flexigrid = new Flexigrid();
for (FileReportRow row : rows) {
List<String> cellsModel = new ArrayList<>();
cellsModel.add(wrapSwAccession(row.getLane().getSequencerRun().getSwAccession(), removeNulls(row.getLane().getSequencerRun()
.getName())));
cellsModel.add(wrapSwAccession(row.getLane().getSwAccession(), removeNulls(row.getLane().getName())));
cellsModel.add(wrapSwAccession(row.getIus().getSwAccession(), removeNulls(row.getIus().getSwAccession().toString())));
cellsModel.add(wrapSwAccession(row.getChildSample().getSwAccession(), removeNulls(row.getChildSample().getTitle())));
cellsModel.add(wrapSwAccession(row.getExperiment().getSwAccession(), removeNulls(row.getExperiment().getTitle())));
cellsModel.add(wrapSwAccession(row.getStudy().getSwAccession(), removeNulls(row.getStudy().getTitle())));
Processing processing = row.getProcessing();
Workflow workflow = null;
WorkflowRun run = null;
if (processing != null) {
// try to get processing related workflow run
run = processing.getWorkflowRun();
if (run == null) {
// if no workflow run found, let's try to get workflow run by ancestor
// run id
run = processing.getWorkflowRunByAncestorWorkflowRunId();
}
if (run != null) {
// if run is found, get workflow
workflow = run.getWorkflow();
}
}
if (workflow != null) {
cellsModel.add(workflow.getName());
} else {
cellsModel.add("");
}
if (run != null) {
cellsModel.add(run.getName());
} else {
cellsModel.add("");
}
if (processing != null) {
cellsModel.add(processing.getAlgorithm());
} else {
cellsModel.add("");
}
cellsModel.add(wrapSwAccession(row.getFile().getSwAccession(), row.getFile().getFilePath()));
Flexigrid.Cells cells = flexigrid.new Cells(cellsModel);
flexigrid.addRow(cells);
}
int total = fileReportService.countOfRows(seqRun);
flexigrid.setTotal(total);
flexigrid.setPage(page);
// long end = System.nanoTime() - start;
// Log.info("Flexigrid FileTable created. Time: " + end / 1e6);
return flexigrid;
}
private String getHibernateSortField(String sortName, String sortOrder) {
String sortField = "study.studyId";
if (!"undefined".equals(sortOrder)) {
if (FILE_STUDY_TITLE.equals(sortName)) {
sortField = "study.title";
}
if (FILE_STUDY_SWID.equals(sortName)) {
sortField = "study.swAccession";
}
if (FILE_EXPERIMENT_NAME.equals(sortName)) {
sortField = "experiment.name";
}
if (FILE_EXPERIMENT_SWID.equals(sortName)) {
sortField = "experiment.swAccession";
}
if (FILE_PARENT_SAMPLE_NAME.equals(sortName)) {
sortField = "sample.name";
}
if (FILE_PARENT_SAMPLE_SWID.equals(sortName)) {
sortField = "sample.swAccession";
}
if (FILE_SAMPLE_NAME.equals(sortName)) {
sortField = "childSample.name";
}
if (FILE_SAMPLE_SWID.equals(sortName)) {
sortField = "childSample.swAccession";
}
if (FILE_SEQUENCER_NAME.equals(sortName)) {
sortField = "lane.sequencerRun.name";
}
if (SAMPLE_SEQUENCER_NAME.equals(sortName)) {
sortField = "sequencerRun.name";
}
if (FILE_SEQUENCER_SWID.equals(sortName)) {
sortField = "lane.sequencerRun.swid";
}
if (FILE_LANE_NAME.equals(sortName)) {
sortField = "lane.name";
}
if (FILE_LANE_NUMBER.equals(sortName)) {
sortField = "lane.laneIndex";
}
if (FILE_LANE_SWID.equals(sortName)) {
sortField = "lane.swAccession";
}
if (FILE_IUS_TAG.equals(sortName)) {
sortField = "ius.tag";
}
if (FILE_IUS_SWID.equals(sortName)) {
sortField = "ius.swAccession";
}
if (FILE_WF_NAME.equals(sortName)) {
sortField = "processing.workflowRun.workflow.name";
}
if (FILE_WF_SWID.equals(sortName)) {
sortField = "processing.workflowRun.workflow.swAccession";
}
if (FILE_WF_VERSION.equals(sortName)) {
sortField = "processing.workflowRun.workflow.version";
}
if (FILE_RUN_NAME.equals(sortName)) {
sortField = "processing.workflowRun.name";
}
if (FILE_RUN_SWID.equals(sortName)) {
sortField = "processing.workflowRun.swAccession";
}
if (FILE_PROCESSING_ALG.equals(sortName)) {
sortField = "processing.algorithm";
}
if (FILE_PROCESSING_SWID.equals(sortName)) {
sortField = "processing.swAccession";
}
if (FILE_META_TYPE.equals(sortName)) {
sortField = "file.metaType";
}
if (FILE_SWID.equals(sortName)) {
sortField = "file.swAccession";
}
if (FILE_PATH.equals(sortName)) {
sortField = "file.filePath";
}
}
return sortField;
}
private String createSeqRunsTableContentJson(SequencerRun seqRuns, int page, int rp, String sortName, String sortOrder) {
Flexigrid seqFlexigrid = createSeqFlexigrid(seqRuns, page, rp, sortName, sortOrder);
// Convert to Flexigrid JSON
Gson gson = new Gson();
String json = gson.toJson(seqFlexigrid);
return json;
}
private Flexigrid createSeqFlexigrid(SequencerRun seqRun, int page, int rp, String sortName, String sortOrder) {
long start = System.nanoTime();
Flexigrid flexigrid = new Flexigrid();
String sortField = getHibernateSortField(sortName, sortOrder);
if (!sortOrder.equals("asc") && !sortOrder.equals("desc")) {
sortOrder = "asc";
}
List<SequencerRunReportId> rows = sampleReportService.getSequencerRunReportIds(seqRun, sortField, sortOrder, (page - 1) * rp, rp);
for (SequencerRunReportId srriD : rows) {
String[] statusesOut = new String[this.workflows.size()];
for (int i = 0; i < this.workflows.size(); i++) {
Status status = sampleReportService.getStatus(srriD.getStudy(), srriD.getChildSample(), srriD.getIus(), srriD.getLane(),
srriD.getSequencerRun(), this.workflows.get(i));
if (status == null) {
statusesOut[i] = wrapStatus(Status.notstarted);
} else {
statusesOut[i] = wrapStatus(status);
}
}
List<String> cellsModel = new LinkedList<>();
cellsModel.add(wrapSwAccession(srriD.getSequencerRun().getSwAccession(), removeNulls(srriD.getSequencerRun().getName())));
cellsModel.add(wrapSwAccession(srriD.getLane().getSwAccession(), removeNulls(srriD.getLane().getName())));
cellsModel.add(wrapSwAccession(srriD.getIus().getSwAccession(), removeNulls(srriD.getIus().getSwAccession().toString())));
cellsModel.add(wrapSwAccession(srriD.getChildSample().getSwAccession(), removeNulls(srriD.getChildSample().getTitle())));
cellsModel.addAll(Arrays.asList(statusesOut));
cellsModel.add(wrapOverall());
Flexigrid.Cells cells = flexigrid.new Cells(cellsModel);
flexigrid.addRow(cells);
}
int total = sampleReportService.countOfRows(seqRun);
flexigrid.setTotal(total);
flexigrid.setPage(page);
long end = System.nanoTime() - start;
Log.info("Flexigrid SampleTable created. Time: " + end / 1e6);
return flexigrid;
}
private String createSampleTableModelJson(List<Workflow> workflows) {
List<Flexigrid.ColumnModel> model = new LinkedList<>();
model.add(new Flexigrid.ColumnModel("SequencerRun", SAMPLE_SEQUENCER_NAME, WIDTH, true, "left"));
model.add(new Flexigrid.ColumnModel("Lane", FILE_LANE_NAME, WIDTH, true, "left"));
model.add(new Flexigrid.ColumnModel("IUS", FILE_IUS_SWID, WIDTH, true, "left"));
model.add(new Flexigrid.ColumnModel("Sample", FILE_SAMPLE_NAME, WIDTH, true, "left"));
for (Workflow workflow : workflows) {
Flexigrid.ColumnModel column = new Flexigrid.ColumnModel(workflow.getName() + " " + workflow.getVersion(), "wf_"
+ workflow.getSwAccession(), WIDTH, false, "left");
model.add(column);
}
model.add(new Flexigrid.ColumnModel("Overall", "overall", WIDTH, false, "left"));
// Convert to Flexigrid JSON
Gson gson = new Gson();
String json = gson.toJson(model);
return json;
}
private List<Workflow> getSequencersWorkflows(SequencerRun seqRun, Registration registration) {
return sampleReportService.getWorkflows(seqRun);// listSequencerRunsWorkflows(seqRun);
}
private String wrapSwAccession(Integer swId, String label) {
return "<div class=\"label\">" + label + "</div>" + "<div class=\"sw\" swid=\"" + swId + "\"></div>";
}
private String wrapStatus(Status status) {
return "<div class=\"status\" >" + status + "</div>";
}
private String wrapOverall() {
return "<div class=\"overall\" />";
}
private String removeNulls(String in) {
if (in == null) {
return "";
}
return in;
}
}