package net.sourceforge.solexatools.webapp.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sourceforge.seqware.common.business.ExperimentService;
import net.sourceforge.seqware.common.business.FileService;
import net.sourceforge.seqware.common.business.IUSService;
import net.sourceforge.seqware.common.business.LaneService;
import net.sourceforge.seqware.common.business.ProcessingService;
import net.sourceforge.seqware.common.business.SampleService;
import net.sourceforge.seqware.common.business.StudyService;
import net.sourceforge.seqware.common.model.Experiment;
import net.sourceforge.seqware.common.model.IUS;
import net.sourceforge.seqware.common.model.Lane;
import net.sourceforge.seqware.common.model.Processing;
import net.sourceforge.seqware.common.model.Registration;
import net.sourceforge.seqware.common.model.Sample;
import net.sourceforge.seqware.common.model.Study;
import net.sourceforge.seqware.common.model.WorkflowParam;
import net.sourceforge.seqware.common.model.WorkflowRun;
import net.sourceforge.solexatools.Security;
import net.sourceforge.solexatools.util.BulkUtil;
import net.sourceforge.solexatools.util.Constant;
import net.sourceforge.solexatools.util.LaunchWorkflowUtil;
import net.sourceforge.solexatools.util.PageInfo;
import net.sourceforge.solexatools.util.PaginationUtil;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.BaseCommandController;
/**
* <p>
* LaunchWorkflowListDetailsController class.
* </p>
*
* @author boconnor
* @version $Id: $Id
*/
public class LaunchWorkflowListDetailsController extends BaseCommandController {
private StudyService studyService;
private ExperimentService experimentService;
private SampleService sampleService;
private LaneService laneService;
private IUSService iusService;
private ProcessingService processingService;
private FileService fileService;
/**
* <p>
* Constructor for LaunchWorkflowListDetailsController.
* </p>
*/
public LaunchWorkflowListDetailsController() {
super();
setSupportedMethods(new String[] { METHOD_GET });
}
private Boolean getRequestedAsc(HttpServletRequest request) {
Boolean isAsc = null;
String strAsc = request.getParameter("asc");
if (null != strAsc) switch (strAsc) {
case "true":
isAsc = true;
break;
case "false":
isAsc = false;
break;
}
return isAsc;
}
private Boolean saveAscInSession(HttpServletRequest request, String attrNameInSession) {
Boolean isAsc = getRequestedAsc(request);
if (isAsc != null) {
request.getSession(false).setAttribute(attrNameInSession, isAsc);
}
return isAsc(request, attrNameInSession);
}
private Boolean isAsc(HttpServletRequest request, String attrNameInSession) {
Boolean isAsc = (Boolean) request.getSession(false).getAttribute(attrNameInSession);
if (isAsc == null) {
isAsc = true;
}
return isAsc;
}
/**
* {@inheritDoc}
*
* @return
* @throws java.lang.Exception
*/
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
Registration registration = Security.getRegistration(request);
if (registration == null) return new ModelAndView("redirect:/login.htm");
/**
* Pass registration so that we can filter the list if its appropriate to do so.
*/
// List<String> selectedIds =
// (List<String>)request.getSession(false).getAttribute("launchSelectedNodes");
List<String> selectedIds = LaunchWorkflowUtil.getCurrentSelectedNodes(request);
String metaType = getCurrentWorkflowParam(request).getFileMetaType();
Experiment exp = new Experiment();
Sample sam = new Sample();
Lane lane = new Lane();
IUS ius = new IUS();
Processing proc = new Processing();
Map<WorkflowRun, Set<Processing>> wfrProc = new HashMap<>();
PageInfo pageInfo = null;
Boolean isHasError = false;
String errorMessage = "";
List<Study> listAll = new ArrayList<>();
List<Study> listView = new ArrayList<>();
String root = (String) request.getParameter("root");
System.err.println("ROOT: " + root);
if (root == null || "".equals(root) || "source".equals(root)) {
MessageSourceAccessor ma = this.getMessageSourceAccessor();
String nameOneItem = "study.list.pagination.nameOneItem";
String nameLotOfItem = "study.list.pagination.nameLotOfItem";
String typeList = getRequestedTypeList(request);
if (typeList.equals("mylist")) {
// listAll = getStudyService().list(registration);
// set error if want
if (getStudyService().list(registration).isEmpty()) {
isHasError = true;
errorMessage = this.getMessageSourceAccessor().getMessage("study.list.required.one.item");
}
// get study which has files needed META TYPE
// listAll = getStudyService().listWithHasFile(listAll,
// metaType);
Boolean isAsc = saveAscInSession(request, "ascLaunchListStudy");
listAll = getStudyService().listStudyHasFile(registration, metaType, isAsc);
// set error if want
if (!isHasError && listAll.isEmpty()) {
isHasError = true;
errorMessage = this.getMessageSourceAccessor().getMessage("launchWorkflow.list.no.item", new Object[] { metaType });
}
listView = PaginationUtil.subList(request, "mySelectInputPage", listAll);
pageInfo = PaginationUtil.getPageInfo(request, "mySelectInputPage", listView, listAll, nameOneItem, nameLotOfItem, ma);
}
// listView = getStudyService().listWithHasFile(listView, metaType);
BulkUtil.selectStudyNode(selectedIds, listView);
} else {
if (root.indexOf("ae_") != -1) {
proc = getProcessingService().findByID(Constant.getId(root));
proc.setChildren(getProcessingService().setWithHasFile(proc.getChildren(), metaType));
proc.setFiles(getFileService().setWithHasFile(proc.getFiles(), metaType));
BulkUtil.selectProcessingNode(selectedIds, proc);
fillWorkflowProcessingMap(proc, wfrProc);
} else if (root.indexOf("seq_") != -1) {
lane = getLaneService().findByID(Constant.getId(root));
lane.setProcessingsForView(getProcessingService().setWithHasFile(lane.getProcessings(), metaType));
BulkUtil.selectProcessingNode(selectedIds, lane);
} else if (root.indexOf("ius_") != -1) {
ius = getIUSService().findByID(Constant.getId(root));
ius.setProcessings(getProcessingService().setWithHasFile(ius.getProcessings(), metaType));
BulkUtil.selectProcessingNode(selectedIds, ius);
} else if (root.indexOf("sam_") != -1) {
sam = getSampleService().findByID(Constant.getId(root));
SortedSet<IUS> iuss = getIUSService().listWithHasFile(sam.getIUS(), metaType);
// Log.info("Lanes SIZE1 = " + lanes.size());
// sam.setLanesForView(lanes);
sam.setIUS(iuss);
sam.setProcessings(getProcessingService().setWithHasFile(sam.getProcessings(), metaType));
SortedSet<Sample> children = new TreeSet<>(sam.getChildren());
getSampleService().setWithHasFile(null, children);
// Log.info("Lanes SIZE2 = " + sam.getLanes().size());
BulkUtil.selectIUSNode(selectedIds, sam);
} else if (root.indexOf("exp_") != -1) {
Integer expId = Constant.getId(root);
exp = getExperimentService().findByID(expId);
exp.setSamples(getSampleService().listWithHasFile(expId, exp.getSamples(), metaType));
exp.setProcessings(getProcessingService().setWithHasFile(exp.getProcessings(), metaType));
BulkUtil.selectSampleNode(selectedIds, exp);
} else {
Study s = getStudyService().findByID(Integer.parseInt(root));
listView.add(s);
s.setExperiments(getExperimentService().listWithHasFile(s.getExperiments(), metaType));
s.setProcessings(getProcessingService().setWithHasFile(s.getProcessings(), metaType));
BulkUtil.selectExperimentNode(selectedIds, s);
}
}
// request.getSession(false).setAttribute("launchSelectedNodes",
// selectedIds);
LaunchWorkflowUtil.setCurrentSelectedNodes(request, selectedIds);
ModelAndView modelAndView;
if (root.indexOf("ae_") != -1) {
System.err.println("RENDERING INDIVIDUAL File with Processing");
modelAndView = new ModelAndView("StudyListFileProcessing");
modelAndView.addObject("processing", proc);
modelAndView.addObject("wfrproc", wfrProc);
modelAndView.addObject("wfrprockeys", wfrProc.keySet());
} else if (root.indexOf("seq_") != -1) {
System.err.println("RENDERING INDIVIDUAL Processing");
modelAndView = new ModelAndView("StudyListProcessing");
modelAndView.addObject("lane", lane);
} else if (root.indexOf("ius_") != -1) {
System.err.println("RENDERING INDIVIDUAL IUS");
modelAndView = new ModelAndView("StudyListProcessing");
modelAndView.addObject("ius", ius);
} else if (root.indexOf("sam_") != -1) {
System.err.println("RENDERING INDIVIDUAL Sample");
modelAndView = new ModelAndView("StudyListIUS");
modelAndView.addObject("sample", sam);
} else if (root.indexOf("exp_") != -1) {
System.err.println("RENDERING INDIVIDUAL EXPERIMENT");
modelAndView = new ModelAndView("StudyListSample");
modelAndView.addObject("experiment", exp);
} else if (root != null && !"".equals(root) && !"source".equals(root) && Integer.parseInt(root) > 0) {
System.err.println("RENDERING INDIVIDUAL SELECT INPUT STUDY");
modelAndView = new ModelAndView("StudyListDetails");
modelAndView.addObject("root", root);
} else {
System.err.println("RENDERING ALL SELECT INPUT STUDIES");
modelAndView = new ModelAndView("StudyListRoot");
modelAndView.addObject("pageInfo", pageInfo);
}
// set error data
modelAndView.addObject("isHasError", isHasError);
modelAndView.addObject("errorMessage", errorMessage);
modelAndView.addObject("isBulkPage", true);
modelAndView.addObject("studies", listView);
modelAndView.addObject("registration", registration);
modelAndView.addObject("typeList", "tree");
return modelAndView;
}
private void fillWorkflowProcessingMap(Processing proc, Map<WorkflowRun, Set<Processing>> wfrProc) {
for (Processing child : proc.getChildren()) {
Set<Processing> processings = wfrProc.get(child.getWorkflowRun());
if (processings == null) {
processings = new HashSet<>();
}
processings.add(child);
if (child.getWorkflowRun() != null) {
wfrProc.put(child.getWorkflowRun(), processings);
}
}
}
private WorkflowParam getCurrentWorkflowParam(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
Object workflowParam = session.getAttribute("workflowParam");
if (workflowParam != null) {
return (WorkflowParam) workflowParam;
}
}
return new WorkflowParam();
}
private String getRequestedTypeList(HttpServletRequest request) {
String typeList = (String) request.getParameter("typeList");
if (typeList == null) {
typeList = "";
}
return typeList;
}
/**
* <p>
* Getter for the field <code>studyService</code>.
* </p>
*
* @return a {@link net.sourceforge.seqware.common.business.StudyService} object.
*/
public StudyService getStudyService() {
return studyService;
}
/**
* <p>
* Setter for the field <code>studyService</code>.
* </p>
*
* @param studyService
* a {@link net.sourceforge.seqware.common.business.StudyService} object.
*/
public void setStudyService(StudyService studyService) {
this.studyService = studyService;
}
/**
* <p>
* Getter for the field <code>experimentService</code>.
* </p>
*
* @return a {@link net.sourceforge.seqware.common.business.ExperimentService} object.
*/
public ExperimentService getExperimentService() {
return experimentService;
}
/**
* <p>
* Setter for the field <code>experimentService</code>.
* </p>
*
* @param experimentService
* a {@link net.sourceforge.seqware.common.business.ExperimentService} object.
*/
public void setExperimentService(ExperimentService experimentService) {
this.experimentService = experimentService;
}
/**
* <p>
* Getter for the field <code>sampleService</code>.
* </p>
*
* @return a {@link net.sourceforge.seqware.common.business.SampleService} object.
*/
public SampleService getSampleService() {
return sampleService;
}
/**
* <p>
* Setter for the field <code>sampleService</code>.
* </p>
*
* @param sampleService
* a {@link net.sourceforge.seqware.common.business.SampleService} object.
*/
public void setSampleService(SampleService sampleService) {
this.sampleService = sampleService;
}
/**
* <p>
* Getter for the field <code>laneService</code>.
* </p>
*
* @return a {@link net.sourceforge.seqware.common.business.LaneService} object.
*/
public LaneService getLaneService() {
return laneService;
}
/**
* <p>
* Setter for the field <code>laneService</code>.
* </p>
*
* @param laneService
* a {@link net.sourceforge.seqware.common.business.LaneService} object.
*/
public void setLaneService(LaneService laneService) {
this.laneService = laneService;
}
/**
* <p>
* Getter for the field <code>processingService</code>.
* </p>
*
* @return a {@link net.sourceforge.seqware.common.business.ProcessingService} object.
*/
public ProcessingService getProcessingService() {
return processingService;
}
/**
* <p>
* Setter for the field <code>processingService</code>.
* </p>
*
* @param processingService
* a {@link net.sourceforge.seqware.common.business.ProcessingService} object.
*/
public void setProcessingService(ProcessingService processingService) {
this.processingService = processingService;
}
/**
* <p>
* Getter for the field <code>fileService</code>.
* </p>
*
* @return a {@link net.sourceforge.seqware.common.business.FileService} object.
*/
public FileService getFileService() {
return fileService;
}
/**
* <p>
* Setter for the field <code>fileService</code>.
* </p>
*
* @param fileService
* a {@link net.sourceforge.seqware.common.business.FileService} object.
*/
public void setFileService(FileService fileService) {
this.fileService = fileService;
}
/**
* <p>
* Getter for the field <code>iusService</code>.
* </p>
*
* @return a {@link net.sourceforge.seqware.common.business.IUSService} object.
*/
public IUSService getIusService() {
return iusService;
}
/**
* <p>
* Setter for the field <code>iusService</code>.
* </p>
*
* @param iusService
* a {@link net.sourceforge.seqware.common.business.IUSService} object.
*/
public void setIusService(IUSService iusService) {
this.iusService = iusService;
}
/**
* <p>
* getIUSService.
* </p>
*
* @return a {@link net.sourceforge.seqware.common.business.IUSService} object.
*/
public IUSService getIUSService() {
return iusService;
}
/**
* <p>
* setIUSService.
* </p>
*
* @param iusService
* a {@link net.sourceforge.seqware.common.business.IUSService} object.
*/
public void setIUSService(IUSService iusService) {
this.iusService = iusService;
}
}