package org.akaza.openclinica.controller; import static org.jmesa.facade.TableFacadeFactory.createTableFacade; import org.akaza.openclinica.bean.core.Role; import org.akaza.openclinica.bean.login.StudyUserRoleBean; import org.akaza.openclinica.bean.login.UserAccountBean; import org.akaza.openclinica.bean.managestudy.StudyBean; import org.akaza.openclinica.bean.managestudy.StudySubjectBean; import org.akaza.openclinica.bean.submit.EventCRFBean; import org.akaza.openclinica.controller.helper.SdvFilterDataBean; import org.akaza.openclinica.controller.helper.table.SubjectSDVContainer; import org.akaza.openclinica.dao.managestudy.StudyDAO; import org.akaza.openclinica.dao.managestudy.StudySubjectDAO; import org.akaza.openclinica.i18n.core.LocaleResolver; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.akaza.openclinica.view.StudyInfoPanel; import org.akaza.openclinica.web.table.sdv.SDVUtil; import org.akaza.openclinica.web.table.sdv.SubjectIdSDVFactory; import org.jmesa.facade.TableFacade; import org.jmesa.view.html.component.HtmlColumn; import org.jmesa.view.html.component.HtmlRow; import org.jmesa.view.html.component.HtmlTable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ResourceBundle; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.sql.DataSource; /** * Implement the functionality for displaying a table of Event CRFs for Source Data * Verification. This is an autowired, multiaction Controller. */ @Controller("sdvController") public class SDVController { public final static String SUBJECT_SDV_TABLE_ATTRIBUTE = "sdvTableAttribute"; @Autowired @Qualifier("dataSource") private DataSource dataSource; @Autowired @Qualifier("sdvUtil") private SDVUtil sdvUtil; @Autowired @Qualifier("sdvFactory") private SubjectIdSDVFactory sdvFactory; //Autowire the class that handles the sidebar structure with a configured //bean named "sidebarInit" @Autowired @Qualifier("sidebarInit") private SidebarInit sidebarInit; public SDVController() { } @RequestMapping("/viewSubjectAggregate") public ModelMap viewSubjectAggregateHandler(HttpServletRequest request, HttpServletResponse response, @RequestParam("studyId") int studyId) { if(!mayProceed(request)){ try{ response.sendRedirect(request.getContextPath() + "/MainMenu?message=authentication_failed"); }catch (Exception e){ e.printStackTrace(); } return null; } ModelMap gridMap = new ModelMap(); HttpSession session = request.getSession(); boolean showMoreLink = false; if(session.getAttribute("sSdvRestore") != null && session.getAttribute("sSdvRestore") == "false") { session.setAttribute("sSdvRestore", "true"); showMoreLink = true; }else if(request.getParameter("showMoreLink")!=null){ showMoreLink = Boolean.parseBoolean(request.getParameter("showMoreLink").toString()); }else if(session.getAttribute("s_sdv_showMoreLink")!=null) { showMoreLink = Boolean.parseBoolean(session.getAttribute("s_sdv_showMoreLink")+""); }else { showMoreLink = true; } request.setAttribute("showMoreLink", showMoreLink+""); session.setAttribute("s_sdv_showMoreLink", showMoreLink+""); request.setAttribute("studyId", studyId); String restore = (String)request.getAttribute("s_sdv_restore"); restore = restore != null && restore.length()>0 ? restore : "false"; request.setAttribute("s_sdv_restore", restore); // request.setAttribute("studySubjectId",studySubjectId); /*SubjectIdSDVFactory tableFactory = new SubjectIdSDVFactory(); * @RequestParam("studySubjectId") int studySubjectId,*/ request.setAttribute("imagePathPrefix", "../"); ArrayList<String> pageMessages = (ArrayList<String>) request.getAttribute("pageMessages"); if (pageMessages == null) { pageMessages = new ArrayList<String>(); } request.setAttribute("pageMessages", pageMessages); sdvFactory.showMoreLink = showMoreLink; TableFacade facade = sdvFactory.createTable(request, response); String sdvMatrix = facade.render(); gridMap.addAttribute(SUBJECT_SDV_TABLE_ATTRIBUTE, sdvMatrix); return gridMap; } @RequestMapping("/viewAllSubjectSDV") public ModelMap viewSubjectHandler(HttpServletRequest request, @RequestParam("studySubjectId") int studySubjectId, @RequestParam("studyId") int studyId) { ModelMap gridMap = new ModelMap(); /*EventCRFDAO eventCRFDAO = new EventCRFDAO(dataSource); List<EventCRFBean> eventCRFBeans = eventCRFDAO.findAllByStudySubject(studySubjectId);*/ request.setAttribute("studyId", studyId); request.setAttribute("studySubjectId", studySubjectId); // request.setAttribute("isViewSubjectRequest","y"); request.setAttribute("imagePathPrefix", "../"); ArrayList<String> pageMessages = (ArrayList<String>) request.getAttribute("pageMessages"); if (pageMessages == null) { pageMessages = new ArrayList<String>(); } request.setAttribute("pageMessages", pageMessages); String sdvMatrix = sdvUtil.renderSubjectsTableWithLimit(request, studyId, studySubjectId); gridMap.addAttribute(SUBJECT_SDV_TABLE_ATTRIBUTE, sdvMatrix); return gridMap; } @RequestMapping("/viewAllSubjectSDVtmp") public ModelMap viewAllSubjectHandler(HttpServletRequest request, @RequestParam("studyId") int studyId, HttpServletResponse response) { if(!mayProceed(request)){ try{ response.sendRedirect(request.getContextPath() + "/MainMenu?message=authentication_failed"); }catch (Exception e){ e.printStackTrace(); } return null; } ResourceBundleProvider.updateLocale(LocaleResolver.getLocale(request)); // Reseting the side info panel set by SecureControler Mantis Issue: 8680. // Todo need something to reset panel from all the Spring Controllers StudyInfoPanel panel = new StudyInfoPanel(); panel.reset(); HttpSession session = request.getSession(); request.getSession().setAttribute("panel", panel); ModelMap gridMap = new ModelMap(); //set up request attributes for sidebar //Not necessary when using old page design... // setUpSidebar(request); boolean showMoreLink = false; if(session.getAttribute("tableFacadeRestore") != null && session.getAttribute("tableFacadeRestore") == "false") { session.setAttribute("tableFacadeRestore","true"); session.setAttribute("sSdvRestore", "false"); showMoreLink = true; }else if(request.getParameter("showMoreLink")!=null){ showMoreLink = Boolean.parseBoolean(request.getParameter("showMoreLink").toString()); }else if(session.getAttribute("sdv_showMoreLink")!=null) { showMoreLink = Boolean.parseBoolean(session.getAttribute("sdv_showMoreLink")+""); } else { showMoreLink = true; } request.setAttribute("showMoreLink", showMoreLink+""); session.setAttribute("sdv_showMoreLink", showMoreLink+""); request.setAttribute("studyId", studyId); String restore = (String)request.getAttribute("sdv_restore"); restore = restore != null && restore.length()>0 ? restore : "false"; request.setAttribute("sdv_restore", restore); //request.setAttribute("imagePathPrefix","../"); //We need a study subject id for the first tab; Integer studySubjectId = (Integer) request.getAttribute("studySubjectId"); studySubjectId = studySubjectId == null || studySubjectId == 0 ? 0 : studySubjectId; request.setAttribute("studySubjectId", studySubjectId); //set up the elements for the view's filter box // sdvUtil.prepareSDVSelectElements(request,studyBean); ArrayList<String> pageMessages = (ArrayList<String>) request.getAttribute("pageMessages"); if (pageMessages == null) { pageMessages = new ArrayList<String>(); } request.setAttribute("pageMessages", pageMessages); String sdvMatrix = sdvUtil.renderEventCRFTableWithLimit(request, studyId, "../"); gridMap.addAttribute(SUBJECT_SDV_TABLE_ATTRIBUTE, sdvMatrix); return gridMap; } @RequestMapping("/viewAllSubjectSDVform") public ModelMap viewAllSubjectFormHandler(HttpServletRequest request, HttpServletResponse response, @RequestParam("studyId") int studyId) { ModelMap gridMap = new ModelMap(); StudyDAO studyDAO = new StudyDAO(dataSource); // StudyEventDAO studyEventDAO = new StudyEventDAO(dataSource); StudyBean studyBean = (StudyBean) studyDAO.findByPK(studyId); String pattern = "MM/dd/yyyy"; SimpleDateFormat sdf = new SimpleDateFormat(pattern); // List<StudyEventBean> studyEventBeans = studyEventDAO.findAllByStudy(studyBean); // List<EventCRFBean> eventCRFBeans = sdvUtil.getAllEventCRFs(studyEventBeans); //set up the parameters to take part in filtering ServletRequestDataBinder dataBinder = new ServletRequestDataBinder(new SdvFilterDataBean()); dataBinder.setAllowedFields(new String[] { "study_subject_id", "studyEventDefinition", "studyEventStatus", "eventCRFStatus", "sdvRequirement", "eventcrfSDVStatus", "startUpdatedDate", "endDate", "eventCRFName" }); dataBinder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(sdf, true)); dataBinder.bind(request); BindingResult bindingResult = dataBinder.getBindingResult(); // eventCRFBeans = sdvUtil.filterEventCRFs(eventCRFBeans,bindingResult); //set up request attributes for sidebar //Not necessary when using old page design... // setUpSidebar(request); request.setAttribute("studyId", studyId); //We need a study subject id for the first tab; take it somewhat arbitrarily from the first study event bean /* int studySubjectId = 0; StudyEventBean studyBeanUrl = studyEventBeans.get(0); if(studyBeanUrl != null) { studySubjectId= studyBeanUrl.getStudySubjectId(); } request.setAttribute("studySubjectId",studySubjectId);*/ //set up the elements for the view's filter box /*sdvUtil.prepareSDVSelectElements(request,studyBean);*/ ArrayList<String> pageMessages = (ArrayList<String>) request.getAttribute("pageMessages"); if (pageMessages == null) { pageMessages = new ArrayList<String>(); } request.setAttribute("pageMessages", pageMessages); String sdvMatrix = sdvUtil.renderEventCRFTableWithLimit(request, studyId, ""); gridMap.addAttribute(SUBJECT_SDV_TABLE_ATTRIBUTE, sdvMatrix); return gridMap; } /* @RequestMapping("/viewSubjectAggregateSDV") public ModelMap viewSubjectAggregateHandler(HttpServletRequest request, @RequestParam("studyId") int studyId) { ModelMap gridMap = new ModelMap(); //set up request attributes for sidebar setUpSidebar(request); String sdvMatrix = sdvUtil.renderSubjectsAggregateTable(studyId,request); gridMap.addAttribute(SUBJECT_SDV_TABLE_ATTRIBUTE,sdvMatrix); return gridMap; }*/ //method = RequestMethod.POST @RequestMapping("/handleSDVPost") public String sdvAllSubjectsFormHandler(HttpServletRequest request, HttpServletResponse response, @RequestParam("studyId") int studyId, @RequestParam("redirection") String redirection, ModelMap model) { //The application is POSTing parameters with the name "sdvCheck_" plus the //Event CRF id, so the parameter is sdvCheck_534. Enumeration paramNames = request.getParameterNames(); Map<String, String> parameterMap = new HashMap<String, String>(); String tmpName = ""; for (; paramNames.hasMoreElements();) { tmpName = (String) paramNames.nextElement(); if (tmpName.contains(SDVUtil.CHECKBOX_NAME)) { parameterMap.put(tmpName, request.getParameter(tmpName)); } } request.setAttribute("sdv_restore", "true"); //For the messages that appear in the left column of the results page ArrayList<String> pageMessages = new ArrayList<String>(); //In this case, no checked event CRFs were submitted if (parameterMap.isEmpty()) { pageMessages.add("None of the Event CRFs were selected for SDV."); request.setAttribute("pageMessages", pageMessages); sdvUtil.forwardRequestFromController(request, response, "/pages/" + redirection); } List<Integer> eventCRFIds = sdvUtil.getListOfSdvEventCRFIds(parameterMap.keySet()); boolean updateCRFs = sdvUtil.setSDVerified(eventCRFIds, getCurrentUser(request).getId(), true); if (updateCRFs) { pageMessages.add("The Event CRFs have been source data verified."); } else { pageMessages .add("There was a problem with submitting the Event CRF verification to the database. Is it possible that the database system is down temporarily?"); } request.setAttribute("pageMessages", pageMessages); //model.addAttribute("allParams",parameterMap); //model.addAttribute("verified",updateCRFs); sdvUtil.forwardRequestFromController(request, response, "/pages/" + redirection); //The name of the view, as in allSdvResult.jsp return null; } @RequestMapping("/handleSDVGet") public String sdvOneCRFFormHandler(HttpServletRequest request, HttpServletResponse response, @RequestParam("crfId") int crfId, @RequestParam("redirection") String redirection, ModelMap model) { if(!mayProceed(request)){ try{ response.sendRedirect(request.getContextPath() + "/MainMenu?message=authentication_failed"); }catch (Exception e){ e.printStackTrace(); } return null; } //For the messages that appear in the left column of the results page ArrayList<String> pageMessages = new ArrayList<String>(); List<Integer> eventCRFIds = new ArrayList<Integer>(); eventCRFIds.add(crfId); boolean updateCRFs = sdvUtil.setSDVerified(eventCRFIds, getCurrentUser(request).getId(), true); if (updateCRFs) { pageMessages.add("The Event CRFs have been source data verified."); } else { pageMessages .add("There was a problem with submitting the Event CRF verification to the database. Is it possible that the database system is down temporarily?"); } request.setAttribute("pageMessages", pageMessages); request.setAttribute("sdv_restore", "true"); //model.addAttribute("allParams",parameterMap); //model.addAttribute("verified",updateCRFs); sdvUtil.forwardRequestFromController(request, response, "/pages/" + redirection); //The name of the view, as in allSdvResult.jsp return null; } @RequestMapping("/handleSDVRemove") public String changeSDVHandler(HttpServletRequest request, HttpServletResponse response, @RequestParam("crfId") int crfId, @RequestParam("redirection") String redirection, ModelMap model) { //For the messages that appear in the left column of the results page ArrayList<String> pageMessages = new ArrayList<String>(); List<Integer> eventCRFIds = new ArrayList<Integer>(); eventCRFIds.add(crfId); boolean updateCRFs = sdvUtil.setSDVerified(eventCRFIds, getCurrentUser(request).getId(), false); if (updateCRFs) { pageMessages.add("The application has unset SDV for the Event CRF."); } else { pageMessages .add("There was a problem with submitting the Event CRF verification to the database. Is it possible that the database system is down temporarily?"); } request.setAttribute("pageMessages", pageMessages); request.setAttribute("sdv_restore", "true"); //model.addAttribute("allParams",parameterMap); //model.addAttribute("verified",updateCRFs); sdvUtil.forwardRequestFromController(request, response, "/pages/" + redirection); //The name of the view, as in allSdvResult.jsp return null; } @RequestMapping("/sdvStudySubject") public String sdvStudySubjectHandler(HttpServletRequest request, HttpServletResponse response, @RequestParam("theStudySubjectId") int studySubjectId, @RequestParam("redirection") String redirection, ModelMap model) { //For the messages that appear in the left column of the results page ArrayList<String> pageMessages = new ArrayList<String>(); List<Integer> studySubjectIds = new ArrayList<Integer>(); studySubjectIds.add(studySubjectId); boolean updateCRFs = sdvUtil.setSDVStatusForStudySubjects(studySubjectIds, getCurrentUser(request).getId(), true); if (updateCRFs) { pageMessages.add("The Subject has been source data verified."); } else { pageMessages .add("There was a problem with submitting the Event CRF verification to the database. Is it possible that the database system is down temporarily?"); } request.setAttribute("pageMessages", pageMessages); request.setAttribute("s_sdv_restore", "true"); sdvUtil.forwardRequestFromController(request, response, "/pages/" + redirection); return null; } @RequestMapping("/unSdvStudySubject") public String unSdvStudySubjectHandler(HttpServletRequest request, HttpServletResponse response, @RequestParam("theStudySubjectId") int studySubjectId, @RequestParam("redirection") String redirection, ModelMap model) { ArrayList<String> pageMessages = new ArrayList<String>(); List<Integer> studySubjectIds = new ArrayList<Integer>(); studySubjectIds.add(studySubjectId); boolean updateCRFs = sdvUtil.setSDVStatusForStudySubjects(studySubjectIds, getCurrentUser(request).getId(), false); if (updateCRFs) { pageMessages.add("The application has unset SDV for the Event CRF."); } else { pageMessages .add("There was a problem with submitting the Event CRF verification to the database. Is it possible that the database system is down temporarily?"); } request.setAttribute("pageMessages", pageMessages); request.setAttribute("s_sdv_restore", "true"); sdvUtil.forwardRequestFromController(request, response, "/pages/" + redirection); return null; } @RequestMapping("/sdvStudySubjects") public String sdvStudySubjectsHandler(HttpServletRequest request, HttpServletResponse response, @RequestParam("studyId") int studyId, @RequestParam("redirection") String redirection, ModelMap model) { //The application is POSTing parameters with the name "sdvCheck_" plus the //Event CRF id, so the parameter is sdvCheck_534. Enumeration paramNames = request.getParameterNames(); Map<String, String> parameterMap = new HashMap<String, String>(); String tmpName = ""; for (; paramNames.hasMoreElements();) { tmpName = (String) paramNames.nextElement(); if (tmpName.contains(SDVUtil.CHECKBOX_NAME)) { parameterMap.put(tmpName, request.getParameter(tmpName)); } } request.setAttribute("s_sdv_restore", "true"); //For the messages that appear in the left column of the results page ArrayList<String> pageMessages = new ArrayList<String>(); //In this case, no checked event CRFs were submitted if (parameterMap.isEmpty()) { pageMessages.add("None of the Study Subjects were selected for SDV."); request.setAttribute("pageMessages", pageMessages); sdvUtil.forwardRequestFromController(request, response, "/pages/" + redirection); } List<Integer> studySubjectIds = sdvUtil.getListOfStudySubjectIds(parameterMap.keySet()); boolean updateCRFs = sdvUtil.setSDVStatusForStudySubjects(studySubjectIds, getCurrentUser(request).getId(), true); if (updateCRFs) { pageMessages.add("The Event CRFs have been source data verified."); } else { pageMessages .add("There was a problem with submitting the Event CRF verification to the database. Is it possible that the database system is down temporarily?"); } request.setAttribute("pageMessages", pageMessages); //model.addAttribute("allParams",parameterMap); //model.addAttribute("verified",updateCRFs); sdvUtil.forwardRequestFromController(request, response, "/pages/" + redirection); //The name of the view, as in allSdvResult.jsp return null; } /* Create a JMesa-based table for showing the event CRFs. */ private String renderSubjectsTable(List<EventCRFBean> eventCRFBeans, int studySubjectId, HttpServletRequest request) { StudySubjectDAO studySubjectDAO = new StudySubjectDAO(dataSource); StudySubjectBean subjectBean = (StudySubjectBean) studySubjectDAO.findByPK(studySubjectId); Collection<SubjectSDVContainer> items = sdvUtil.getSubjectRows(eventCRFBeans, request); //The number of items represents the total number of returned rows int totalRowCount = 0; if (items != null && items.size() > 0) { totalRowCount = items.size(); } TableFacade tableFacade = createTableFacade("sdv", request); //The default display for the JMesa Limit select widget is 1,50,100 rows //We'll change this if the subject has more than one row, and have the last choice //set to the total row count if (totalRowCount > 1) { tableFacade.setMaxRowsIncrements(15, 50, totalRowCount); } tableFacade.setColumnProperties("studySubjectId", "personId", "secondaryId", "eventName", "eventDate", "enrollmentDate", "subjectStatus", "crfNameVersion", "crfStatus", "lastUpdatedDate", "lastUpdatedBy", "sdvStatusActions"); tableFacade.setItems(items); //Fix column titles HtmlTable table = (HtmlTable) tableFacade.getTable(); //i18n caption; TODO: convert to Spring messages ResourceBundle resourceBundle = ResourceBundle.getBundle("org.akaza.openclinica.i18n.words", LocaleResolver.getLocale(request)); String[] allTitles = { resourceBundle.getString("study_subject_ID"), resourceBundle.getString("person_ID"), resourceBundle.getString("secondary_ID"), resourceBundle.getString("event_name"), resourceBundle.getString("event_date"), resourceBundle.getString("enrollment_date"), resourceBundle.getString("subject_status"),resourceBundle.getString("CRF_name")+" / "+resourceBundle.getString("version"), resourceBundle.getString("CRF_status"),resourceBundle.getString("last_updated_date"), resourceBundle.getString("last_updated_by"), resourceBundle.getString("SDV_status")+" / "+resourceBundle.getString("actions") }; setTitles(allTitles, table); table.getTableRenderer().setWidth("800"); return tableFacade.render(); } /* Create the titles for the HTML table's rows */ private void setTitles(String[] allTitles, HtmlTable table) { HtmlRow row = table.getRow(); HtmlColumn tempColumn = null; for (int i = 0; i < allTitles.length; i++) { tempColumn = row.getColumn(i); tempColumn.setTitle(allTitles[i]); } } private void setUpSidebar(HttpServletRequest request) { if (sidebarInit.getAlertsBoxSetup() == SidebarEnumConstants.OPENALERTS) { request.setAttribute("alertsBoxSetup", true); } if (sidebarInit.getInfoBoxSetup() == SidebarEnumConstants.OPENINFO) { request.setAttribute("infoBoxSetup", true); } if (sidebarInit.getInstructionsBoxSetup() == SidebarEnumConstants.OPENINSTRUCTIONS) { request.setAttribute("instructionsBoxSetup", true); } if (!(sidebarInit.getEnableIconsBoxSetup() == SidebarEnumConstants.DISABLEICONS)) { request.setAttribute("enableIconsBoxSetup", true); } } private UserAccountBean getCurrentUser (HttpServletRequest request){ UserAccountBean ub = (UserAccountBean)request.getSession().getAttribute("userBean"); return ub; } public static void main(String[] args) throws ParseException { String pattern = "MM/dd/yyyy"; SimpleDateFormat sdf = new SimpleDateFormat(pattern); Date date = sdf.parse("01/01/2007"); System.out.println("date = " + date); } private boolean mayProceed(HttpServletRequest request) { StudyUserRoleBean currentRole = (StudyUserRoleBean)request.getSession().getAttribute("userRole"); Role r = currentRole.getRole(); if (r.equals(Role.STUDYDIRECTOR) || r.equals(Role.COORDINATOR) || r.equals(Role.MONITOR)) { return true; } return false; } }