package net.sourceforge.solexatools.webapp.controller; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; 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.SequencerRunService; import net.sourceforge.seqware.common.business.StudyService; import net.sourceforge.seqware.common.business.WorkflowRunService; import net.sourceforge.seqware.common.business.WorkflowService; import net.sourceforge.seqware.common.model.Experiment; import net.sourceforge.seqware.common.model.File; 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.Workflow; import net.sourceforge.seqware.common.model.WorkflowRun; import net.sourceforge.solexatools.Security; 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> * SearchResultsListController class. * </p> * * @author boconnor * @version $Id: $Id */ public class SearchResultsListController extends BaseCommandController { private final String nameOneItem = "search.list.pagination.nameOneItem"; private final String nameLotOfItem = "search.list.pagination.nameLotOfItem"; private List<Object> searchResults; // Services Used for Search private StudyService studyService; private ExperimentService experimentService; private SampleService sampleService; private IUSService IUSService; private SequencerRunService sequencerRunService; private LaneService laneService; private ProcessingService processingService; private FileService fileService; private WorkflowService workflowService; private WorkflowRunService workflowRunService; /** * <p> * Constructor for SearchResultsListController. * </p> */ public SearchResultsListController() { } /** * <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> * 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> * 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> * setIUSService. * </p> * * @param iusService * a {@link net.sourceforge.seqware.common.business.IUSService} object. */ public void setIUSService(IUSService iusService) { this.IUSService = iusService; } /** * <p> * Setter for the field <code>sequencerRunService</code>. * </p> * * @param sequencerRunService * a {@link net.sourceforge.seqware.common.business.SequencerRunService} object. */ public void setSequencerRunService(SequencerRunService sequencerRunService) { this.sequencerRunService = sequencerRunService; } /** * <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> * 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> * 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> * 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> * 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; } /** * {@inheritDoc} * * @return * @throws java.lang.Exception */ @SuppressWarnings("unchecked") @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { Registration registration = Security.getRegistration(request); if (registration == null) { return new ModelAndView("redirect:/login.htm"); } Boolean isHasError = false; String errorMessage = ""; String criteria = request.getParameter("criteria"); String type = request.getParameter("type"); // if (criteria == null || type == null) { // return new ModelAndView("redirect:/search.htm"); // } String mode = request.getParameter("mode"); // Create ModelAndView ModelAndView modelAndView = new ModelAndView("SearchResultsList"); if ("create".equals(mode)) { // return to the first page here request.getSession(false).removeAttribute("mySearchPage"); boolean isCaseSens = getCaseSens(request); searchResults = getListForCriteria(criteria, type, modelAndView, isCaseSens); } if ("create".equals(mode) || "sort".equals(mode)) { Comparator<Object> comp = new Comparator<Object>() { @Override public int compare(Object arg0, Object arg1) { // Compare by class name String name1 = arg0.getClass().getSimpleName(); String name2 = arg1.getClass().getSimpleName(); return name1.compareTo(name2); } }; Collections.sort(searchResults, comp); } MessageSourceAccessor ma = this.getMessageSourceAccessor(); List<Object> listView = PaginationUtil.subList(request, "mySearchPage", searchResults); PageInfo pageInfo = PaginationUtil.getPageInfo(request, "mySearchPage", listView, searchResults, nameOneItem, nameLotOfItem, ma); // set error data modelAndView.addObject("isHasError", isHasError); modelAndView.addObject("errorMessage", errorMessage); modelAndView.addObject("pageInfo", pageInfo); modelAndView.addObject("results", listView); return modelAndView; } private boolean getCaseSens(HttpServletRequest request) { HttpSession session = request.getSession(false); String out = (String) session.getAttribute(SearchController.SEARCH_CASE_SENSITIVE); if ("true".equals(out)) { return true; } return false; } private List<Object> getListForCriteria(String criteria, String type, ModelAndView modelAndView, boolean isCaseSens) { modelAndView.addObject(criteria); List<Object> out = new ArrayList<>(); // Create appropriate model for selected type if (type.equals("Study") || type.equals("All")) { List<Study> studies = studyService.findByCriteria(criteria, isCaseSens); out.addAll(studies); } if (type.equals("Experiment") || type.equals("All")) { List<Experiment> experiments = experimentService.findByCriteria(criteria, isCaseSens); out.addAll(experiments); } if (type.equals("Sample") || type.equals("All")) { List<Sample> samples = sampleService.findByCriteria(criteria, isCaseSens); out.addAll(samples); } if (type.equals("IUS") || type.equals("All")) { List<IUS> iuses = IUSService.findByCriteria(criteria, isCaseSens); out.addAll(iuses); } if (type.equals("SequencerRun") || type.equals("All")) { List<SequencerRun> seqRuns = sequencerRunService.findByCriteria(criteria, isCaseSens); out.addAll(seqRuns); } if (type.equals("Lane") || type.equals("All")) { List<Lane> lanes = laneService.findByCriteria(criteria, isCaseSens); out.addAll(lanes); } if (type.equals("Processing") || type.equals("All")) { List<Processing> processings = processingService.findByCriteria(criteria, isCaseSens); out.addAll(processings); } if (type.equals("File") || type.equals("All")) { List<File> files = fileService.findByCriteria(criteria, isCaseSens); out.addAll(files); } if (type.equals("Workflow") || type.equals("All")) { List<Workflow> workflows = workflowService.findByCriteria(criteria, isCaseSens); out.addAll(workflows); } if (type.equals("WorkflowRun") || type.equals("All")) { List<WorkflowRun> workflowRuns = workflowRunService.findByCriteria(criteria, isCaseSens); out.addAll(workflowRuns); } return out; } }