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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sourceforge.seqware.common.business.ExperimentService;
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.SequencerRun;
import net.sourceforge.seqware.common.model.Study;
import net.sourceforge.seqware.common.model.WorkflowRun;
import net.sourceforge.solexatools.Security;
import net.sourceforge.solexatools.util.Constant;
import net.sourceforge.solexatools.util.PageInfo;
import net.sourceforge.solexatools.util.PaginationUtil;
import net.sourceforge.solexatools.util.StudyHtmlUtil;
import net.sourceforge.solexatools.webapp.metamodel.SampleDetailsLineItem;
import net.sourceforge.solexatools.webapp.metamodel.SampleDetailsWorkflowLineItems;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.BaseCommandController;
/**
* <p>
* StudyListDetailsController class.
* </p>
*
* @author boconnor
* @version $Id: $Id
*/
@SuppressWarnings("deprecation")
public class StudyListDetailsController extends BaseCommandController {
private StudyService studyService;
private ExperimentService experimentService;
private SampleService sampleService;
private LaneService laneService;
private ProcessingService processingService;
private IUSService iusService;
/**
* <p>
* Constructor for StudyListDetailsController.
* </p>
*/
public StudyListDetailsController() {
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;
}
/**
* <p>
* saveAscInSession.
* </p>
*
* @param request
* a {@link javax.servlet.http.HttpServletRequest} object.
* @param attrNameInSession
* a {@link java.lang.String} object.
* @return a {@link java.lang.Boolean} object.
*/
protected 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.requireRegistration(request,
// response);
Registration registration = Security.getRegistration(request);
if (registration == null) {
// return new ModelAndView("redirect:/login.htm");
return new ModelAndView("StudyListRoot");
}
/**
* Pass registration so that we can filter the list if its appropriate to do so.
*/
String type = getTypeParameter(request);
if (type != null) {
if ("list".equals(type)) {
setTypeSession(request, type);
} else {
setTypeSession(request, "tree");
}
}
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")) {
Boolean isAsc = saveAscInSession(request, "ascMyListStudy");
listAll = getStudyService().list(registration, isAsc);
listView = PaginationUtil.subList(request, "myStudiesPage", listAll);
listView = loadNode(listView, registration, request);
pageInfo = PaginationUtil.getPageInfo(request, "myStudiesPage", listView, listAll, nameOneItem, nameLotOfItem, ma);
// set error if want
if (listAll.isEmpty()) {
isHasError = true;
errorMessage = this.getMessageSourceAccessor().getMessage("study.list.required.one.item");
}
}
if (typeList.equals("mysharelist")) {
Boolean isAsc = saveAscInSession(request, "ascMyShareListStudy");
listAll = getStudyService().listMyShared(registration, isAsc);
listView = PaginationUtil.subList(request, "mySharedStudyPage", listAll);
listView = loadNode(listAll, registration, request);
pageInfo = PaginationUtil.getPageInfo(request, "mySharedStudyPage", listView, listAll, nameOneItem, nameLotOfItem, ma);
}
if (typeList.equals("bymesharelist")) {
Boolean isAsc = saveAscInSession(request, "ascByMeShareListStudy");
listAll = getStudyService().listSharedWithMe(registration, isAsc);
listView = PaginationUtil.subList(request, "studySharedWithMe", listAll);
pageInfo = PaginationUtil.getPageInfo(request, "studySharedWithMe", listView, listAll, nameOneItem, nameLotOfItem, ma);
}
} else {
if (root.indexOf("ae_") != -1) {
proc = getProcessingService().findByID(Constant.getId(root));
fillWorkflowProcessingMap(proc, wfrProc);
} else if (root.indexOf("ius_") != -1) {
ius = getIUSService().findByID(Constant.getId(root));
} else if (root.indexOf("sam_") != -1) {
sam = getSampleService().findByID(Constant.getId(root));
System.out.println(" CHILD SIZE = " + sam.getChildren().size());
} else if (root.indexOf("exp_") != -1) {
exp = getExperimentService().findByID(Constant.getId(root));
} else {
Study s = getStudyService().findByID(Constant.getId(root));
listView.add(s);
}
}
// System.err.println("Study length: "+listAll.size());
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());
// modelAndView.addObject("typeTree", "st");
} else if (root.indexOf("ius_") != -1) {
System.err.println("RENDERING INDIVIDUAL IUS");
modelAndView = new ModelAndView("StudyListProcessing");
modelAndView.addObject("ius", ius);
// modelAndView.addObject("typeTree", "st");
} else if (root.indexOf("sam_") != -1) {
System.err.println("RENDERING INDIVIDUAL Sample");
if (getTypeSession(request).equals("list")) {
modelAndView = new ModelAndView("StudyListFlatSampleDetails");
modelAndView.addObject("sample", sam);
List<SampleDetailsLineItem> sampleLineItems = getSampleDetails(sam);
modelAndView.addObject("lineItems", sampleLineItems);
SampleDetailsWorkflowLineItems wfLineItems = new SampleDetailsWorkflowLineItems(sam);
for (IUS sampleIus : sam.getIUS()) {
wfLineItems.addProcessings(sampleIus);
}
modelAndView.addObject("workflows", wfLineItems);
} else {
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 STUDY");
modelAndView = new ModelAndView("StudyListDetails");
} else {
System.err.println("RENDERING ALL STUDIES");
modelAndView = new ModelAndView("StudyListRoot");
modelAndView.addObject("pageInfo", pageInfo);
}
modelAndView.addObject("typeTree", "st");
modelAndView.addObject("typeList", getTypeSession(request));
// set error data
modelAndView.addObject("isHasError", isHasError);
modelAndView.addObject("errorMessage", errorMessage);
modelAndView.addObject("isBulkPage", false);
modelAndView.addObject("studies", listView);
modelAndView.addObject("registration", registration);
return modelAndView;
}
/**
* <p>
* fillWorkflowProcessingMap.
* </p>
*
* @param proc
* a {@link net.sourceforge.seqware.common.model.Processing} object.
* @param wfrProc
* a {@link java.util.Map} object.
*/
protected 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 List<SampleDetailsLineItem> getSampleDetails(Sample sam) {
List<SampleDetailsLineItem> sampleDetails = new ArrayList<>();
for (IUS ius : sam.getIUS()) {
Lane lane = ius.getLane();
SequencerRun sRun = lane.getSequencerRun();
sampleDetails.add(new SampleDetailsLineItem(sRun, lane, ius));
}
return sampleDetails;
}
private List<Study> loadNode(List<Study> list, Registration registration, HttpServletRequest request) {
Integer openStudyId = (Integer) request.getSession(false).getAttribute("rootStudyId");
// Object obj = request.getSession(false).getAttribute("nodeObject");
String objId = (String) request.getSession(false).getAttribute("objectId");
List<String> listStudyNodeId = (List<String>) request.getSession(false).getAttribute("listStudyNodeId");
String treeType = getTypeSession(request);
openStudyId = null;
objId = null;
if (listStudyNodeId != null) {
System.out.println("End Study id = " + Constant.getId(getEndId(listStudyNodeId)));
System.out.println("Start id = " + getSecondId(listStudyNodeId));
openStudyId = Constant.getId(getEndId(listStudyNodeId));
objId = getSecondId(listStudyNodeId);
if (objId.indexOf("wfr_") != -1) {
objId = listStudyNodeId.get(2);
}
}
// test open seq
// openStudyId = 1;
// objId = "fl_46159";
// objId = "seq_1995";
// objId = "ae_53883";
// objId = "ae_53851";
// objId = "ae_53966";
if (openStudyId != null) {
System.out.println("rootStudyId = " + openStudyId);
for (Study study : list) {
if (openStudyId.equals(study.getStudyId())) {
// study.setHtml(TreeNodeHtmlUtil.getHtml(obj, registration));
if (objId.indexOf("study_") != -1) {
// Integer id = Integer.parseInt(objId);
System.out.println(" SET STUDY HTML");
study.setHtml(StudyHtmlUtil.getHtml(study, registration, listStudyNodeId, treeType));
}
if (objId.indexOf("exp_") != -1) {
System.out.println(" SET EXP HTML");
Experiment currObj = getExperimentService().findByID(Constant.getId(objId));
study.setHtml(StudyHtmlUtil.getHtml(currObj, registration, listStudyNodeId, treeType));
}
if (objId.indexOf("sam_") != -1) {
System.out.println(" SET SAMPLE HTML");
Sample currObj = getSampleService().findByID(Constant.getId(objId));
study.setHtml(StudyHtmlUtil.getHtml(currObj, registration, listStudyNodeId, treeType));
}
if (objId.indexOf("ius_") != -1) {
System.out.println(" SET IUS HTML");
IUS currObj = getIUSService().findByID(Constant.getId(objId));
study.setHtml(StudyHtmlUtil.getHtml(currObj, registration, listStudyNodeId, treeType));
}
if (objId.indexOf("ae_") != -1) {
System.out.println(" SET Processing HTML");
Processing currObj = getProcessingService().findByID(Constant.getId(objId));
study.setHtml(StudyHtmlUtil.getHtml(currObj, registration, listStudyNodeId, treeType));
}
if (objId.indexOf("aefl_") != -1) {
System.out.println(" SET Processing FL HTML");
Processing currObj = getProcessingService().findByID(Constant.getId(objId));
study.setHtml(StudyHtmlUtil.getFileHtml(currObj, registration, listStudyNodeId, treeType));
}
}
}
}
return list;
}
private String getSecondId(List<String> ids) {
String id = null;
if (ids != null) {
id = ids.get(1);
}
return id;
}
private String getEndId(List<String> ids) {
String id = null;
if (ids != null) {
id = ids.get(ids.size() - 1);
}
return id;
}
/**
* <p>
* getRequestedTypeList.
* </p>
*
* @param request
* a {@link javax.servlet.http.HttpServletRequest} object.
* @return a {@link java.lang.String} object.
*/
protected String getRequestedTypeList(HttpServletRequest request) {
String typeList = (String) request.getParameter("typeList");
if (typeList == null) {
typeList = "";
}
return typeList;
}
private String getTypeParameter(HttpServletRequest request) {
String type = (String) request.getParameter("type");
return type;
}
private String getSearchCriteria(HttpServletRequest request) {
String search = (String) request.getParameter("search");
if (search == null) {
search = "";
}
return search;
}
private void setTypeSession(HttpServletRequest request, String type) {
request.getSession(false).setAttribute("typeList", type);
}
private String getTypeSession(HttpServletRequest request) {
String type = (String) request.getSession(false).getAttribute("typeList");
if (type == null) {
type = "tree";
}
return type;
}
/**
* <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>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;
}
}