package net.sourceforge.solexatools.webapp.controller; import java.util.List; import java.util.SortedSet; 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.Registration; import net.sourceforge.seqware.common.model.Workflow; import net.sourceforge.seqware.common.model.WorkflowParam; import net.sourceforge.seqware.common.model.WorkflowParamValue; import net.sourceforge.seqware.common.model.WorkflowRun; import io.seqware.common.model.WorkflowRunStatus; import net.sourceforge.seqware.common.util.Log; import net.sourceforge.solexatools.Security; import net.sourceforge.solexatools.util.LaunchWorkflowUtil; import org.springframework.validation.BindException; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.SimpleFormController; /** * <p> * LaunchWorkflowController class. * </p> * * @author boconnor * @version $Id: $Id */ public class LaunchWorkflowController extends SimpleFormController { private WorkflowService workflowService; private WorkflowRunService workflowRunService; /** * <p> * Constructor for LaunchWorkflowController. * </p> */ public LaunchWorkflowController() { super(); setSupportedMethods(new String[] { METHOD_GET, METHOD_POST }); setCommandClass(Workflow.class); } /** * <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; } /** * {@inheritDoc} * * Handles the user's request to submit a new study. * * @return * @throws java.lang.Exception */ @Override protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { Registration registration = Security.getRegistration(request); if (registration == null) return new ModelAndView("redirect:/login.htm"); ModelAndView modelAndView = null; Workflow comm = (Workflow) command; Log.info("WORKFLOW ID = " + comm.getWorkflowId()); Workflow workflow = getWorkflowService().findByID(comm.getWorkflowId()); boolean isHasError = false; if (workflow == null || !workflow.isLaunch()/* workflow.getVisibleWorkflowParams().size() == 0 */) { // errors.reject("error.launch.workflow.hasnot.params"); isHasError = true; } if (!isHasError) { isHasError = hasError(request, workflow, errors); } if (isHasError) { List<Workflow> list = getWorkflowService().list(); request.setAttribute("workflows", list); request.setAttribute(getCommandName(), new Workflow()); modelAndView = showForm(request, response, errors); } else { setRequestedValues(request, workflow); boolean isHasParam = setRequestedFirstParam(request, workflow); request.getSession(false).setAttribute("workflow", workflow); // set this attribute for view Select Inputs bar request.setAttribute("isHasSelectedInputMenu", true); if (isHasParam) { HttpSession session = request.getSession(false); if (session.getAttribute("ascLaunchListStudy") == null) { session.setAttribute("ascLaunchListStudy", true); } modelAndView = new ModelAndView(getSuccessView()); } else { // get current workflow SortedSet<WorkflowParam> visibleParams = workflow.getVisibleWorkflowParams(); workflow = getWorkflowService().findByID(workflow.getWorkflowId()); // create new workflow WorkflowRun workflowRun = new WorkflowRun(); workflowRun.setWorkflow(workflow); workflowRun.setStatus(WorkflowRunStatus.pending); workflowRun.setOwner(registration); getWorkflowRunService().insert(workflowRun, LaunchWorkflowUtil.getWorkflowRunParam(visibleParams), LaunchWorkflowUtil.getAllSelectedFiles(request)); request.getSession(false).setAttribute("workflowRun", workflowRun); request.setAttribute("summaryData", LaunchWorkflowUtil.getSummaryData(request)); clearSession(request); modelAndView = new ModelAndView("SummaryLaunchWorkflow"); } } return modelAndView; } private void clearSession(HttpServletRequest request) { LaunchWorkflowUtil.removeSelectedItemsLaunchWorkflow(request); } private boolean setRequestedFirstParam(HttpServletRequest request, Workflow workflow) { // SortedSet<WorkflowParam> params = workflow.getWorkflowParams(); // for (WorkflowParam workflowParam : params) { // request.getSession(false).setAttribute("workflowParam", workflowParam); // } // WorkflowParam workflowParam = workflow.getVisibleWorkflowParams().first(); boolean isHasParam = false; WorkflowParam workflowParam = null; if (workflow.getWorkflowParamsWithDifferentFileMetaType() != null) { if (workflow.getWorkflowParamsWithDifferentFileMetaType().size() > 0) { workflowParam = workflow.getWorkflowParamsWithDifferentFileMetaType().first(); isHasParam = true; } } request.getSession(false).setAttribute("workflowParam", workflowParam); return isHasParam; } private boolean setRequestedValues(HttpServletRequest request, Workflow workflow) { boolean isHasNotError = true; SortedSet<WorkflowParam> visibleParams = workflow.getVisibleWorkflowParams(); for (WorkflowParam visibleWorkflowParam : visibleParams) { // if param display if (visibleWorkflowParam.getDisplay()) { // String value = request.getParameter(workflowParam.getWorkflowParamId().toString()); String valueParam = request.getParameter(visibleWorkflowParam.getWorkflowParamId().toString()); Log.info(" Get Launch param value"); Log.info(" name = " + visibleWorkflowParam.getWorkflowParamId().toString()); Log.info(" valueParam = " + valueParam); String value = valueParam; if ("pulldown".equals(visibleWorkflowParam.getType()) && visibleWorkflowParam.getValues().size() > 1) { Log.info(" Type workflow param is PULLDOWN"); String[] values = getValues(visibleWorkflowParam, valueParam); value = values[0]; String displayValue = values[1]; Log.info("value = " + value); Log.info("displayValue = " + displayValue); visibleWorkflowParam.setDisplayValue(displayValue); } visibleWorkflowParam.setValue(value); } } return isHasNotError; } private String[] getValues(WorkflowParam workflowParam, String valueParam) { String value = workflowParam.getDefaultValue(); String displayValue = workflowParam.getDisplayName(); // if single param DEFAULT VALUE if (workflowParam.getValues().size() == 0 && !value.isEmpty()) { } else // if single param ONE PARAM VALUE if (workflowParam.getValues().size() == 1 && value.isEmpty()) { // get first param value value = workflowParam.getValues().first().getValue(); displayValue = workflowParam.getValues().first().getDisplayName(); } else // if multi values if (!valueParam.equals("defaultValue")) { SortedSet<WorkflowParamValue> values = workflowParam.getValues(); for (WorkflowParamValue paramValue : values) { if (paramValue.getWorkflowParamValueId().equals(Integer.parseInt(valueParam))) { value = paramValue.getValue(); displayValue = paramValue.getDisplayName(); } } } String values[] = { value, displayValue }; return values; } private boolean hasError(HttpServletRequest request, Workflow workflow, BindException errors) { boolean isHasError = false; SortedSet<WorkflowParam> params = workflow.getVisibleWorkflowParams(); for (WorkflowParam workflowParam : params) { // if param display if (workflowParam.getDisplay()) { String valueParamId = request.getParameter(workflowParam.getWorkflowParamId().toString()); /* * if( (workflowParam.getValues().size() == 0 && workflowParam.getDefaultValue() == null) || * (workflowParam.getValues().size() == 0 && workflowParam.getDefaultValue().equals("")) ) { isHasError = true; * Log.info("Has ERROR! Empty value"); errors.reject("error.launch.workflow.hasnot.value.for.param"); }else{ if( * (valueParamId.equals("defaultValue") && workflowParam.getDefaultValue() == null) || (valueParamId.equals("defaultValue") * && workflowParam.getDefaultValue().equals("")) ) { isHasError = true; * errors.reject("error.launch.workflow.not.set.params"); } * * } */ // if(workflowParam.getDefaultValue() != null){ String valueParam = request.getParameter(workflowParam.getWorkflowParamId().toString()); if ("".equals(valueParam)) { // isHasError = true; // errors.reject("error.launch.workflow.not.set.params"); } else { Log.info("workflowParam.getType() = " + workflowParam.getType()); if ("int".equals(workflowParam.getType())) { if (isHasErrorIntValue(valueParam)) { isHasError = true; // errors.reject("error.launch.workflow.bad.format.int.value"); // Log.info("workflowParam.getDisplayName() = " + workflowParam.getDisplayName()); // Log.info("valueParam = " + valueParam); errors.reject("error.launch.workflow.bad.format.int.value", new Object[] { workflowParam.getDisplayName() }, "bad value"); } } if ("float".equals(workflowParam.getType())) { if (isHasErrorFloatValue(valueParam)) { isHasError = true; // errors.reject("error.launch.workflow.bad.format.float.value"); errors.reject("error.launch.workflow.bad.format.float.value", new Object[] { workflowParam.getDisplayName() }, "bad value"); } } } // } } } return isHasError; } private boolean isHasErrorIntValue(String value) { boolean isHasError = false; try { Integer.parseInt(value); } catch (Exception e) { isHasError = true; } return isHasError; } private boolean isHasErrorFloatValue(String value) { boolean isHasError = false; try { Float.parseFloat(value); } catch (Exception e) { isHasError = true; } return isHasError; } }