/* * OpenClinica is distributed under the * GNU Lesser General Public License (GNU LGPL). * For details see: http://www.openclinica.org/license * copyright 2003-2005 Akaza Research */ package org.akaza.openclinica.control; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.Locale; import org.akaza.openclinica.bean.login.UserAccountBean; import org.akaza.openclinica.bean.service.StudyParameterValueBean; import org.akaza.openclinica.control.admin.EventStatusStatisticsTableFactory; import org.akaza.openclinica.control.admin.SiteStatisticsTableFactory; import org.akaza.openclinica.control.admin.StudyStatisticsTableFactory; import org.akaza.openclinica.control.admin.StudySubjectStatusStatisticsTableFactory; import org.akaza.openclinica.control.core.SecureController; import org.akaza.openclinica.control.form.FormProcessor; import org.akaza.openclinica.control.submit.ListStudySubjectTableFactory; import org.akaza.openclinica.dao.login.UserAccountDAO; import org.akaza.openclinica.dao.managestudy.DiscrepancyNoteDAO; import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO; import org.akaza.openclinica.dao.managestudy.StudyDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO; import org.akaza.openclinica.dao.managestudy.StudyGroupClassDAO; import org.akaza.openclinica.dao.managestudy.StudyGroupDAO; import org.akaza.openclinica.dao.managestudy.StudySubjectDAO; import org.akaza.openclinica.dao.service.StudyParameterValueDAO; import org.akaza.openclinica.dao.submit.EventCRFDAO; import org.akaza.openclinica.dao.submit.SubjectDAO; import org.akaza.openclinica.dao.submit.SubjectGroupMapDAO; import org.akaza.openclinica.i18n.core.LocaleResolver; import org.akaza.openclinica.view.Page; import org.akaza.openclinica.web.InsufficientPermissionException; import org.akaza.openclinica.web.SQLInitServlet; import org.akaza.openclinica.web.table.sdv.SDVUtil; /** * * The main controller servlet for all the work behind study sites for * OpenClinica. * * @author jxu * */ public class MainMenuServlet extends SecureController { //Shaoyu Su Locale locale; private StudyEventDefinitionDAO studyEventDefinitionDAO; private SubjectDAO subjectDAO; private StudySubjectDAO studySubjectDAO; private StudyEventDAO studyEventDAO; private StudyGroupClassDAO studyGroupClassDAO; private SubjectGroupMapDAO subjectGroupMapDAO; private StudyDAO studyDAO; private EventCRFDAO eventCRFDAO; private EventDefinitionCRFDAO eventDefintionCRFDAO; private StudyGroupDAO studyGroupDAO; private DiscrepancyNoteDAO discrepancyNoteDAO; private StudyParameterValueDAO studyParameterValueDAO; // < ResourceBundle respage; @Override public void mayProceed() throws InsufficientPermissionException { locale = LocaleResolver.getLocale(request); // < respage = // ResourceBundle.getBundle("org.akaza.openclinica.i18n.page_messages",locale); } @Override public void processRequest() throws Exception { FormProcessor fp = new FormProcessor(request); ub.incNumVisitsToMainMenu(); session.setAttribute(USER_BEAN_NAME, ub); request.setAttribute("iconInfoShown", true); request.setAttribute("closeInfoShowIcons", false); if (ub == null || ub.getId() == 0) {// in case database connection is // broken forwardPage(Page.MENU, false); return; } StudyDAO sdao = new StudyDAO(sm.getDataSource()); ArrayList studies = null; long pwdExpireDay = new Long(SQLInitServlet.getField("passwd_expiration_time")).longValue(); Date lastPwdChangeDate = ub.getPasswdTimestamp(); // a flag tells whether users are required to change pwd upon the first // time log in or pwd expired int pwdChangeRequired = new Integer(SQLInitServlet.getField("change_passwd_required")).intValue(); // update last visit date to current date UserAccountDAO udao = new UserAccountDAO(sm.getDataSource()); UserAccountBean ub1 = (UserAccountBean) udao.findByPK(ub.getId()); ub1.setLastVisitDate(new Date(System.currentTimeMillis())); // have to actually set the above to a timestamp? tbh ub1.setOwner(ub1); ub1.setUpdater(ub1); udao.update(ub1); // Use study Id in JSPs request.setAttribute("studyId", currentStudy.getId()); // Event Definition list and Group Class list for add suybject window. request.setAttribute("allDefsArray", super.getEventDefinitionsByCurrentStudy()); request.setAttribute("studyGroupClasses", super.getStudyGroupClassesByCurrentStudy()); if (ub.isLdapUser()) { // "Forge" a password change date for LDAP user lastPwdChangeDate = new Date(); } System.out.println("is ub a ldapuser??"+ub.isLdapUser()); //@pgawade 18-Sep-2012: fix for issue #14506 (https://issuetracker.openclinica.com/view.php?id=14506#c58197) if( (lastPwdChangeDate != null) || ((lastPwdChangeDate == null) && (pwdChangeRequired == 0))) {// not a new user if(lastPwdChangeDate != null){ Calendar cal = Calendar.getInstance(); // compute difference between current date and lastPwdChangeDate long difference = Math.abs(cal.getTime().getTime() - lastPwdChangeDate.getTime()); long days = difference / (1000 * 60 * 60 * 24); session.setAttribute("passwordExpired", "no"); if (!ub.isLdapUser() && pwdExpireDay > 0 && days >= pwdExpireDay) {// password expired, need to be changed System.out.println("here"); studies = (ArrayList) sdao.findAllByUser(ub.getName()); request.setAttribute("studies", studies); session.setAttribute("userBean1", ub); addPageMessage(respage.getString("password_expired")); // YW 06-25-2007 << add the feature that if password is expired, // have to go through /ResetPassword page session.setAttribute("passwordExpired", "yes"); if (pwdChangeRequired == 1) { request.setAttribute("mustChangePass", "yes"); addPageMessage(respage.getString("your_password_has_expired_must_change")); } else { request.setAttribute("mustChangePass", "no"); addPageMessage(respage.getString("password_expired") + " " + respage.getString("if_you_do_not_want_change_leave_blank")); } forwardPage(Page.RESET_PASSWORD); // YW >> } } // else { if (ub.getNumVisitsToMainMenu() <= 1) { if (ub.getLastVisitDate() != null) { addPageMessage(respage.getString("welcome") + " " + ub.getFirstName() + " " + ub.getLastName() + ". " + respage.getString("last_logged") + " " + local_df.format(ub.getLastVisitDate()) + ". "); } else { addPageMessage(respage.getString("welcome") + " " + ub.getFirstName() + " " + ub.getLastName() + ". "); } if (currentStudy.getStatus().isLocked()) { addPageMessage(respage.getString("current_study_locked")); } else if (currentStudy.getStatus().isFrozen()) { addPageMessage(respage.getString("current_study_frozen")); } } ////Integer assignedDiscrepancies = getDiscrepancyNoteDAO().countAllItemDataByStudyAndUser(currentStudy, ub); //Integer assignedDiscrepancies = getDiscrepancyNoteDAO().getViewNotesCountWithFilter(" AND dn.assigned_user_id =" // + ub.getId() + " AND (dn.resolution_status_id=1 OR dn.resolution_status_id=2 OR dn.resolution_status_id=3)", currentStudy); //Yufang code added by Jamuna, to optimize the query on MainMenu Integer assignedDiscrepancies = getDiscrepancyNoteDAO().getViewNotesCountWithFilter(ub.getId(), currentStudy.getId()); request.setAttribute("assignedDiscrepancies", assignedDiscrepancies == null ? 0 : assignedDiscrepancies); int parentStudyId = currentStudy.getParentStudyId()>0?currentStudy.getParentStudyId():currentStudy.getId(); StudyParameterValueDAO spvdao = new StudyParameterValueDAO(sm.getDataSource()); StudyParameterValueBean parentSPV = spvdao.findByHandleAndStudy(parentStudyId, "subjectIdGeneration"); currentStudy.getStudyParameterConfig().setSubjectIdGeneration(parentSPV.getValue()); String idSetting = parentSPV.getValue(); if (idSetting.equals("auto editable") || idSetting.equals("auto non-editable")) { //Shaoyu Su //int nextLabel = this.getStudySubjectDAO().findTheGreatestLabel() + 1; //request.setAttribute("label", new Integer(nextLabel).toString()); request.setAttribute("label", resword.getString("id_generated_Save_Add")); //@pgawade 27-June-2012 fix for issue 13477: set label to "ID will be generated on Save or Add" in case of auto generated subject id fp.addPresetValue("label", resword.getString("id_generated_Save_Add")); } setPresetValues(fp.getPresetValues()); if (currentRole.isInvestigator() || currentRole.isResearchAssistant() || currentRole.isResearchAssistant2()) { setupListStudySubjectTable(); } if (currentRole.isMonitor()) { setupSubjectSDVTable(); } else if (currentRole.isCoordinator() || currentRole.isDirector()) { if (currentStudy.getStatus().isPending()) { response.sendRedirect(request.getContextPath() + Page.MANAGE_STUDY_MODULE.getFileName()); return; } setupStudySiteStatisticsTable(); setupSubjectEventStatusStatisticsTable(); setupStudySubjectStatusStatisticsTable(); if (currentStudy.getParentStudyId() == 0) { setupStudyStatisticsTable(); } } forwardPage(Page.MENU); // } } else {// a new user's first log in studies = (ArrayList) sdao.findAllByUser(ub.getName()); request.setAttribute("studies", studies); session.setAttribute("userBean1", ub); // addPageMessage(respage.getString("welcome") + " " + ub.getFirstName() + " " + ub.getLastName() + ". " + respage.getString("password_set")); // + "<a href=\"UpdateProfile\">" + respage.getString("user_profile") + " </a>"); if (pwdChangeRequired == 1) { } else { forwardPage(Page.MENU); } } } private void setupSubjectSDVTable() { request.setAttribute("studyId", currentStudy.getId()); request.setAttribute("showMoreLink", "true"); String sdvMatrix = getSDVUtil().renderEventCRFTableWithLimit(request, currentStudy.getId(), ""); request.setAttribute("sdvMatrix", sdvMatrix); } private void setupStudySubjectStatusStatisticsTable() { StudySubjectStatusStatisticsTableFactory factory = new StudySubjectStatusStatisticsTableFactory(); factory.setStudySubjectDao(getStudySubjectDAO()); factory.setCurrentStudy(currentStudy); factory.setStudyDao(getStudyDAO()); String studySubjectStatusStatistics = factory.createTable(request, response).render(); request.setAttribute("studySubjectStatusStatistics", studySubjectStatusStatistics); } private void setupSubjectEventStatusStatisticsTable() { EventStatusStatisticsTableFactory factory = new EventStatusStatisticsTableFactory(); factory.setStudySubjectDao(getStudySubjectDAO()); factory.setCurrentStudy(currentStudy); factory.setStudyEventDao(getStudyEventDAO()); factory.setStudyDao(getStudyDAO()); String subjectEventStatusStatistics = factory.createTable(request, response).render(); request.setAttribute("subjectEventStatusStatistics", subjectEventStatusStatistics); } private void setupStudySiteStatisticsTable() { SiteStatisticsTableFactory factory = new SiteStatisticsTableFactory(); factory.setStudySubjectDao(getStudySubjectDAO()); factory.setCurrentStudy(currentStudy); factory.setStudyDao(getStudyDAO()); String studySiteStatistics = factory.createTable(request, response).render(); request.setAttribute("studySiteStatistics", studySiteStatistics); } private void setupStudyStatisticsTable() { StudyStatisticsTableFactory factory = new StudyStatisticsTableFactory(); factory.setStudySubjectDao(getStudySubjectDAO()); factory.setCurrentStudy(currentStudy); factory.setStudyDao(getStudyDAO()); String studyStatistics = factory.createTable(request, response).render(); request.setAttribute("studyStatistics", studyStatistics); } private void setupListStudySubjectTable() { ListStudySubjectTableFactory factory = new ListStudySubjectTableFactory(true); factory.setStudyEventDefinitionDao(getStudyEventDefinitionDao()); factory.setSubjectDAO(getSubjectDAO()); factory.setStudySubjectDAO(getStudySubjectDAO()); factory.setStudyEventDAO(getStudyEventDAO()); factory.setStudyBean(currentStudy); factory.setStudyGroupClassDAO(getStudyGroupClassDAO()); factory.setSubjectGroupMapDAO(getSubjectGroupMapDAO()); factory.setStudyDAO(getStudyDAO()); factory.setCurrentRole(currentRole); factory.setCurrentUser(ub); factory.setEventCRFDAO(getEventCRFDAO()); factory.setEventDefintionCRFDAO(getEventDefinitionCRFDAO()); factory.setStudyGroupDAO(getStudyGroupDAO()); factory.setStudyParameterValueDAO(getStudyParameterValueDAO()); String findSubjectsHtml = factory.createTable(request, response).render(); request.setAttribute("findSubjectsHtml", findSubjectsHtml); } public StudyParameterValueDAO getStudyParameterValueDAO() { studyParameterValueDAO = this.studyParameterValueDAO == null ? new StudyParameterValueDAO(sm.getDataSource()) : studyParameterValueDAO; return studyParameterValueDAO; } public void setStudyParameterValueDAO(StudyParameterValueDAO studyParameterValueDAO) { studyParameterValueDAO = studyParameterValueDAO; } public StudyEventDefinitionDAO getStudyEventDefinitionDao() { studyEventDefinitionDAO = studyEventDefinitionDAO == null ? new StudyEventDefinitionDAO(sm.getDataSource()) : studyEventDefinitionDAO; return studyEventDefinitionDAO; } public SubjectDAO getSubjectDAO() { subjectDAO = this.subjectDAO == null ? new SubjectDAO(sm.getDataSource()) : subjectDAO; return subjectDAO; } public StudySubjectDAO getStudySubjectDAO() { studySubjectDAO = this.studySubjectDAO == null ? new StudySubjectDAO(sm.getDataSource()) : studySubjectDAO; return studySubjectDAO; } public StudyGroupClassDAO getStudyGroupClassDAO() { studyGroupClassDAO = this.studyGroupClassDAO == null ? new StudyGroupClassDAO(sm.getDataSource()) : studyGroupClassDAO; return studyGroupClassDAO; } public SubjectGroupMapDAO getSubjectGroupMapDAO() { subjectGroupMapDAO = this.subjectGroupMapDAO == null ? new SubjectGroupMapDAO(sm.getDataSource()) : subjectGroupMapDAO; return subjectGroupMapDAO; } public StudyEventDAO getStudyEventDAO() { studyEventDAO = this.studyEventDAO == null ? new StudyEventDAO(sm.getDataSource()) : studyEventDAO; return studyEventDAO; } public StudyDAO getStudyDAO() { studyDAO = this.studyDAO == null ? new StudyDAO(sm.getDataSource()) : studyDAO; return studyDAO; } public EventCRFDAO getEventCRFDAO() { eventCRFDAO = this.eventCRFDAO == null ? new EventCRFDAO(sm.getDataSource()) : eventCRFDAO; return eventCRFDAO; } public EventDefinitionCRFDAO getEventDefinitionCRFDAO() { eventDefintionCRFDAO = this.eventDefintionCRFDAO == null ? new EventDefinitionCRFDAO(sm.getDataSource()) : eventDefintionCRFDAO; return eventDefintionCRFDAO; } public StudyGroupDAO getStudyGroupDAO() { studyGroupDAO = this.studyGroupDAO == null ? new StudyGroupDAO(sm.getDataSource()) : studyGroupDAO; return studyGroupDAO; } public DiscrepancyNoteDAO getDiscrepancyNoteDAO() { discrepancyNoteDAO = this.discrepancyNoteDAO == null ? new DiscrepancyNoteDAO(sm.getDataSource()) : discrepancyNoteDAO; return discrepancyNoteDAO; } public SDVUtil getSDVUtil() { return (SDVUtil) SpringServletAccess.getApplicationContext(context).getBean("sdvUtil"); } }