Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java =================================================================== diff -u -ra8e7e92f2121c4b307fb49d28008a5828ad58c58 -ra3cbfca2faad29605192470bb2bb1ec21b0344f6 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java (.../LearningAction.java) (revision a8e7e92f2121c4b307fb49d28008a5828ad58c58) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java (.../LearningAction.java) (revision a3cbfca2faad29605192470bb2bb1ec21b0344f6) @@ -53,6 +53,7 @@ import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import org.apache.struts.upload.FormFile; +import org.lamsfoundation.lams.events.DeliveryMethodMail; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.tool.ToolAccessMode; @@ -69,6 +70,7 @@ import org.lamsfoundation.lams.tool.daco.util.DacoQuestionComparator; import org.lamsfoundation.lams.tool.daco.web.form.RecordForm; import org.lamsfoundation.lams.tool.daco.web.form.ReflectionForm; +import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.FileValidatorUtil; import org.lamsfoundation.lams.util.NumberUtil; @@ -87,1008 +89,980 @@ */ public class LearningAction extends Action { - private static Logger log = Logger.getLogger(LearningAction.class); + private static Logger log = Logger.getLogger(LearningAction.class); - @Override - public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - String param = mapping.getParameter(); - // -----------------------Daco Learner function - // --------------------------- - if (param.equals("start")) { - return start(mapping, request); - } + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + String param = mapping.getParameter(); + // -----------------------Daco Learner function + // --------------------------- + if (param.equals("start")) { + return start(mapping, request); + } - if (param.equals("finish")) { - return finish(mapping, request); - } + if (param.equals("finish")) { + return finish(mapping, request); + } - if (param.equals("saveOrUpdateRecord")) { - return saveOrUpdateRecord(mapping, form, request); - } + if (param.equals("saveOrUpdateRecord")) { + return saveOrUpdateRecord(mapping, form, request); + } - if (param.equals("editRecord")) { - return editRecord(mapping, form, request); - } + if (param.equals("editRecord")) { + return editRecord(mapping, form, request); + } - if (param.equals("removeRecord")) { - return removeRecord(mapping, request); - } + if (param.equals("removeRecord")) { + return removeRecord(mapping, request); + } - if (param.equals("diplayHorizontalRecordList")) { - return diplayHorizontalRecordList(mapping, request); - } + if (param.equals("diplayHorizontalRecordList")) { + return diplayHorizontalRecordList(mapping, request); + } - if (param.equals("changeView")) { - return changeView(mapping, request); - } + if (param.equals("changeView")) { + return changeView(mapping, request); + } - if (param.equals("refreshQuestionSummaries")) { - return refreshQuestionSummaries(mapping, request); - } - - // ================ Reflection ======================= - if (param.equals("startReflection")) { - return startReflection(mapping, form, request); - } - if (param.equals("submitReflection")) { - return submitReflection(mapping, form, request); - } - - return mapping.findForward(DacoConstants.ERROR); + if (param.equals("refreshQuestionSummaries")) { + return refreshQuestionSummaries(mapping, request); } - /** - * @param mapping - * @param request - * @return - */ - protected ActionForward diplayHorizontalRecordList(ActionMapping mapping, HttpServletRequest request) { - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID)); - return mapping.findForward(DacoConstants.SUCCESS); + // ================ Reflection ======================= + if (param.equals("startReflection")) { + return startReflection(mapping, form, request); } + if (param.equals("submitReflection")) { + return submitReflection(mapping, form, request); + } - /** - * Read daco data from database and put them into HttpSession. It will redirect to init.do directly after this method run - * successfully. - * - * This method will avoid read database again and lost un-saved resouce question lost when user "refresh page", - * - */ - protected ActionForward start(ActionMapping mapping, HttpServletRequest request) { + return mapping.findForward(DacoConstants.ERROR); + } - // initial Session Map - SessionMap sessionMap = new SessionMap(); - request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); + /** + * @param mapping + * @param request + * @return + */ + protected ActionForward diplayHorizontalRecordList(ActionMapping mapping, HttpServletRequest request) { + request + .setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, request + .getParameter(DacoConstants.ATTR_SESSION_MAP_ID)); + return mapping.findForward(DacoConstants.SUCCESS); + } - // save toolContentID into HTTPSession - ToolAccessMode mode = WebUtil.readToolAccessModeParam(request, AttributeNames.PARAM_MODE, true); + /** + * Read daco data from database and put them into HttpSession. It will redirect to init.do directly after this + * method run successfully. + * + * This method will avoid read database again and lost un-saved resouce question lost when user "refresh page", + * + */ + protected ActionForward start(ActionMapping mapping, HttpServletRequest request) { - Long sessionId = new Long(request.getParameter(AttributeNames.PARAM_TOOL_SESSION_ID)); + // initial Session Map + SessionMap sessionMap = new SessionMap(); + request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + // save toolContentID into HTTPSession + ToolAccessMode mode = WebUtil.readToolAccessModeParam(request, AttributeNames.PARAM_MODE, true); - // get back the daco and question list and display them on page - IDacoService service = getDacoService(); - DacoUser dacoUser = null; - Daco daco = service.getDacoBySessionId(sessionId); + Long sessionId = new Long(request.getParameter(AttributeNames.PARAM_TOOL_SESSION_ID)); - if (mode != null && mode.isTeacher()) { - // monitoring mode - user is specified in URL - // dacoUser may be null if the user was force completed. - dacoUser = getSpecifiedUser(service, sessionId, WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, false)); - } - else { - dacoUser = getCurrentUser(service, sessionId, daco); - } + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); - // check whehter finish lock is on/off - boolean lock = daco.getLockOnFinished() && dacoUser != null && dacoUser.isSessionFinished(); + // get back the daco and question list and display them on page + IDacoService service = getDacoService(); + DacoUser dacoUser = null; + Daco daco = service.getDacoBySessionId(sessionId); - // get notebook entry - String entryText = null; - if (dacoUser != null) { - NotebookEntry notebookEntry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, - DacoConstants.TOOL_SIGNATURE, dacoUser.getUserId().intValue()); - if (notebookEntry != null) { - entryText = notebookEntry.getEntry(); - } - } + if (mode != null && mode.isTeacher()) { + // monitoring mode - user is specified in URL + // dacoUser may be null if the user was force completed. + dacoUser = getSpecifiedUser(service, sessionId, WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, + false)); + } else { + dacoUser = getCurrentUser(service, sessionId, daco); + } - sessionMap.put(DacoConstants.ATTR_FINISH_LOCK, lock); - sessionMap.put(DacoConstants.ATTR_USER_FINISHED, dacoUser != null && dacoUser.isSessionFinished()); - sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, sessionId); - sessionMap.put(AttributeNames.ATTR_MODE, mode); - sessionMap.put(DacoConstants.ATTR_REFLECTION_ENTRY, entryText); - sessionMap.put(DacoConstants.ATTR_DACO, daco); - sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); + // check whehter finish lock is on/off + boolean lock = daco.getLockOnFinished() && dacoUser != null && dacoUser.isSessionFinished(); - List> records = service.getDacoAnswersByUserUid(dacoUser.getUid()); - sessionMap.put(DacoConstants.ATTR_RECORD_LIST, records); - request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, records.size() + 1); + // get notebook entry + String entryText = null; + if (dacoUser != null) { + NotebookEntry notebookEntry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, + DacoConstants.TOOL_SIGNATURE, dacoUser.getUserId().intValue()); + if (notebookEntry != null) { + entryText = notebookEntry.getEntry(); + } + } - List summaries = service.getQuestionSummaries(dacoUser.getUid()); - sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); + sessionMap.put(DacoConstants.ATTR_FINISH_LOCK, lock); + sessionMap.put(DacoConstants.ATTR_USER_FINISHED, dacoUser != null && dacoUser.isSessionFinished()); + sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, sessionId); + sessionMap.put(AttributeNames.ATTR_MODE, mode); + sessionMap.put(DacoConstants.ATTR_REFLECTION_ENTRY, entryText); + sessionMap.put(DacoConstants.ATTR_DACO, daco); + sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); - Integer totalRecordCount = service.getGroupRecordCount(dacoUser.getSession().getSessionId()); - sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); + List> records = service.getDacoAnswersByUserUid(dacoUser.getUid()); + sessionMap.put(DacoConstants.ATTR_RECORD_LIST, records); + request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, records.size() + 1); - // add define later support - if (daco.isDefineLater()) { - return mapping.findForward(DacoConstants.DEFINE_LATER); - } + List summaries = service.getQuestionSummaries(dacoUser.getUid()); + sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); - // set contentInUse flag to true! - daco.setContentInUse(true); - daco.setDefineLater(false); - service.saveOrUpdateDaco(daco); + Integer totalRecordCount = service.getGroupRecordCount(dacoUser.getSession().getSessionId()); + sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); - // add run offline support - if (daco.getRunOffline()) { - sessionMap.put(DacoConstants.PARAM_RUN_OFFLINE, true); - return mapping.findForward(DacoConstants.RUN_OFFLINE); - } - else { - sessionMap.put(DacoConstants.PARAM_RUN_OFFLINE, false); - } + // add define later support + if (daco.isDefineLater()) { + return mapping.findForward(DacoConstants.DEFINE_LATER); + } - sessionMap.put(DacoConstants.ATTR_DACO, daco); + // set contentInUse flag to true! + daco.setContentInUse(true); + daco.setDefineLater(false); + service.saveOrUpdateDaco(daco); - if (daco.isNotifyTeachersOnLearnerEntry() - && service.getEventNotificationService().eventExists(DacoConstants.TOOL_SIGNATURE, - DacoConstants.EVENT_NAME_NOTIFY_TEACHERS_ON_LEARNER_ENTRY, daco.getContentId())) { - String fullName = dacoUser.getLastName() + " " + dacoUser.getFirstName(); - service.getEventNotificationService().trigger(DacoConstants.TOOL_SIGNATURE, - DacoConstants.EVENT_NAME_NOTIFY_TEACHERS_ON_LEARNER_ENTRY, daco.getContentId(), new Object[] { fullName }); - } - - return mapping.findForward(DacoConstants.SUCCESS); + // add run offline support + if (daco.getRunOffline()) { + sessionMap.put(DacoConstants.PARAM_RUN_OFFLINE, true); + return mapping.findForward(DacoConstants.RUN_OFFLINE); + } else { + sessionMap.put(DacoConstants.PARAM_RUN_OFFLINE, false); } - /** - * Finish learning session. - * - * @param mapping - * @param form - * @param request - * @param response - * @return - */ - protected ActionForward finish(ActionMapping mapping, HttpServletRequest request) { + sessionMap.put(DacoConstants.ATTR_DACO, daco); - // get back SessionMap - String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - - // get mode and ToolSessionID from sessionMAP - ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); - Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); - - ActionErrors errors = validateBeforeFinish(request, sessionMapID); - if (!errors.isEmpty()) { - this.addErrors(request, errors); - return mapping.getInputForward(); + if (daco.isNotifyTeachersOnLearnerEntry()) { + List monitoringUsers = service.getMonitorsByToolSessionId(sessionId); + if (monitoringUsers != null && !monitoringUsers.isEmpty()) { + Long[] monitoringUsersIds = new Long[monitoringUsers.size()]; + for (int i = 0; i < monitoringUsersIds.length; i++) { + monitoringUsersIds[i] = monitoringUsers.get(i).getUserId().longValue(); } + String fullName = dacoUser.getLastName() + " " + dacoUser.getFirstName(); + service.getEventNotificationService().sendMessage(monitoringUsersIds, DeliveryMethodMail.getInstance(), + service.getLocalisedMessage("event.learnerentry.subject", null), + service.getLocalisedMessage("event.learnerentry.body", new Object[] { fullName })); + } + } + return mapping.findForward(DacoConstants.SUCCESS); + } - IDacoService service = getDacoService(); - // get sessionId from HttpServletRequest - String nextActivityUrl = null; - try { - HttpSession httpSession = SessionManager.getSession(); - UserDTO user = (UserDTO) httpSession.getAttribute(AttributeNames.USER); - Long userUid = new Long(user.getUserID().longValue()); + /** + * Finish learning session. + * + * @param mapping + * @param form + * @param request + * @param response + * @return + */ + protected ActionForward finish(ActionMapping mapping, HttpServletRequest request) { - nextActivityUrl = service.finishToolSession(sessionId, userUid); - request.setAttribute(DacoConstants.ATTR_NEXT_ACTIVITY_URL, nextActivityUrl); - } - catch (DacoApplicationException e) { + // get back SessionMap + String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - LearningAction.log.error("Failed get next activity url:" + e.getMessage()); - } + // get mode and ToolSessionID from sessionMAP + ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); + Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); - return mapping.findForward(DacoConstants.SUCCESS); + ActionErrors errors = validateBeforeFinish(request, sessionMapID); + if (!errors.isEmpty()) { + this.addErrors(request, errors); + return mapping.getInputForward(); } - /** - * Save file or textfield daco question into database. - * - * @param mapping - * @param form - * @param request - * @param response - * @return - */ - protected ActionForward saveOrUpdateRecord(ActionMapping mapping, ActionForm form, HttpServletRequest request) { - RecordForm recordForm = (RecordForm) form; - String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - Daco daco = (Daco) sessionMap.get(DacoConstants.ATTR_DACO); - Set questionList = daco.getDacoQuestions(); - Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); - IDacoService service = getDacoService(); - DacoUser user = getCurrentUser(service, sessionId, daco); + IDacoService service = getDacoService(); + // get sessionId from HttpServletRequest + String nextActivityUrl = null; + try { + HttpSession httpSession = SessionManager.getSession(); + UserDTO user = (UserDTO) httpSession.getAttribute(AttributeNames.USER); + Long userUid = new Long(user.getUserID().longValue()); - service.releaseAnswersFromCache(user.getAnswers()); + nextActivityUrl = service.finishToolSession(sessionId, userUid); + request.setAttribute(DacoConstants.ATTR_NEXT_ACTIVITY_URL, nextActivityUrl); + } catch (DacoApplicationException e) { - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - sessionMap.put(DacoConstants.ATTR_LEARNING_CURRENT_TAB, 1); + LearningAction.log.error("Failed get next activity url:" + e.getMessage()); + } - ActionErrors errors = validateRecordForm(recordForm, questionList); - if (!errors.isEmpty()) { - this.addErrors(request, errors); - refreshQuestionSummaries(mapping, request); - request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, recordForm.getDisplayedRecordNumber()); - return mapping.findForward(DacoConstants.SUCCESS); - } + return mapping.findForward(DacoConstants.SUCCESS); + } - List record = null; + /** + * Save file or textfield daco question into database. + * + * @param mapping + * @param form + * @param request + * @param response + * @return + */ + protected ActionForward saveOrUpdateRecord(ActionMapping mapping, ActionForm form, HttpServletRequest request) { + RecordForm recordForm = (RecordForm) form; + String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + Daco daco = (Daco) sessionMap.get(DacoConstants.ATTR_DACO); + Set questionList = daco.getDacoQuestions(); + Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); + IDacoService service = getDacoService(); + DacoUser user = getCurrentUser(service, sessionId, daco); - List> records = (List>) sessionMap.get(DacoConstants.ATTR_RECORD_LIST); - int displayedRecordNumber = recordForm.getDisplayedRecordNumber(); - boolean isEdit = false; - if (displayedRecordNumber <= records.size()) { - record = records.get(displayedRecordNumber - 1); - isEdit = true; - } - else { - record = new LinkedList(); - } + service.releaseAnswersFromCache(user.getAnswers()); - Iterator questionIterator = questionList.iterator(); - DacoQuestion question = null; - int formAnswerNumber = 0; - int answerNumber = 0; - int fileNumber = 0; - DacoAnswer answer = null; + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + sessionMap.put(DacoConstants.ATTR_LEARNING_CURRENT_TAB, 1); - while (questionIterator.hasNext()) { + ActionErrors errors = validateRecordForm(recordForm, questionList); + if (!errors.isEmpty()) { + this.addErrors(request, errors); + refreshQuestionSummaries(mapping, request); + request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, recordForm.getDisplayedRecordNumber()); + return mapping.findForward(DacoConstants.SUCCESS); + } - question = questionIterator.next(); - if (isEdit) { - answer = record.get(answerNumber++); - } - else { - answer = new DacoAnswer(); - answer.setQuestion(question); - answer.setRecordId(displayedRecordNumber); - answer.setUser(user); - } + List record = null; - switch (question.getType()) { - case DacoConstants.QUESTION_TYPE_NUMBER: { - String formAnswer = recordForm.getAnswer(formAnswerNumber); - if (StringUtils.isBlank(formAnswer)) { - answer.setAnswer(null); - } - else { - if (question.getDigitsDecimal() != null) { - formAnswer = NumberUtil.formatLocalisedNumber(Double.parseDouble(formAnswer), (Locale) null, question - .getDigitsDecimal()); - } - answer.setAnswer(formAnswer); - } - formAnswerNumber++; - } - break; - case DacoConstants.QUESTION_TYPE_DATE: { - String[] dateParts = new String[] { recordForm.getAnswer(formAnswerNumber++), - recordForm.getAnswer(formAnswerNumber++), recordForm.getAnswer(formAnswerNumber) }; - if (!(StringUtils.isBlank(dateParts[0]) || StringUtils.isBlank(dateParts[1]) || StringUtils - .isBlank(dateParts[2]))) { + List> records = (List>) sessionMap.get(DacoConstants.ATTR_RECORD_LIST); + int displayedRecordNumber = recordForm.getDisplayedRecordNumber(); + boolean isEdit = false; + if (displayedRecordNumber <= records.size()) { + record = records.get(displayedRecordNumber - 1); + isEdit = true; + } else { + record = new LinkedList(); + } - Calendar calendar = Calendar.getInstance(); - calendar.clear(); - calendar.set(Integer.parseInt(dateParts[2]), Integer.parseInt(dateParts[1]) - 1, Integer - .parseInt(dateParts[0])); - answer.setAnswer(DacoConstants.DEFAULT_DATE_FORMAT.format(calendar.getTime())); - } - else { - answer.setAnswer(null); - } - } - formAnswerNumber++; - break; - case DacoConstants.QUESTION_TYPE_CHECKBOX: { - String formAnswer = recordForm.getAnswer(formAnswerNumber); - String[] checkboxes = formAnswer.split("&"); - if (isEdit) { - DacoAnswer localAnswer = answer; - answerNumber--; - do { - service.deleteDacoAnswer(localAnswer.getUid()); - record.remove(answerNumber); - if (answerNumber <= record.size()) { - localAnswer = record.get(answerNumber); - if (localAnswer.getQuestion().getType() != DacoConstants.QUESTION_TYPE_CHECKBOX) { - localAnswer = null; - } - } - else { - localAnswer = null; - } - } - while (localAnswer != null); - answer = (DacoAnswer) answer.clone(); + Iterator questionIterator = questionList.iterator(); + DacoQuestion question = null; + int formAnswerNumber = 0; + int answerNumber = 0; + int fileNumber = 0; + DacoAnswer answer = null; - } - if (StringUtils.isBlank(formAnswer)) { - answer.setAnswer(null); - } - else { - for (int checkboxNumber = 0; checkboxNumber < checkboxes.length; checkboxNumber++) { - answer.setAnswer(checkboxes[checkboxNumber]); - if (checkboxNumber < checkboxes.length - 1) { - service.saveOrUpdateAnswer(answer); - if (isEdit) { - record.add(answerNumber++, answer); - } - else { - record.add(answer); - } + while (questionIterator.hasNext()) { - answer = (DacoAnswer) answer.clone(); - } - } - } - if (isEdit) { - record.add(answerNumber++, answer); - } - } - formAnswerNumber++; - break; - case DacoConstants.QUESTION_TYPE_LONGLAT: { - answer.setAnswer(recordForm.getAnswer(formAnswerNumber++)); - service.saveOrUpdateAnswer(answer); - if (isEdit) { - answer = record.get(answerNumber++); - } - else { - record.add(answer); - answer = (DacoAnswer) answer.clone(); - } - answer.setAnswer(recordForm.getAnswer(formAnswerNumber)); - } - formAnswerNumber++; - break; - case DacoConstants.QUESTION_TYPE_FILE: - case DacoConstants.QUESTION_TYPE_IMAGE: { - FormFile file = recordForm.getFile(fileNumber); - if (file != null) { - try { - service.uploadDacoAnswerFile(answer, file); - } - catch (UploadDacoFileException e) { - LearningAction.log.error("Failed upload Resource File " + e.toString()); - e.printStackTrace(); - } - } - } - fileNumber++; - break; - case DacoConstants.QUESTION_TYPE_DROPDOWN: { - String formAnswer = recordForm.getAnswer(formAnswerNumber); - answer.setAnswer("0".equals(formAnswer) ? null : formAnswer); - } - formAnswerNumber++; - break; - default: - answer.setAnswer(recordForm.getAnswer(formAnswerNumber)); - formAnswerNumber++; - break; - } + question = questionIterator.next(); + if (isEdit) { + answer = record.get(answerNumber++); + } else { + answer = new DacoAnswer(); + answer.setQuestion(question); + answer.setRecordId(displayedRecordNumber); + answer.setUser(user); + } - service.saveOrUpdateAnswer(answer); - if (!isEdit) { - record.add(answer); - } + switch (question.getType()) { + case DacoConstants.QUESTION_TYPE_NUMBER: { + String formAnswer = recordForm.getAnswer(formAnswerNumber); + if (StringUtils.isBlank(formAnswer)) { + answer.setAnswer(null); + } else { + if (question.getDigitsDecimal() != null) { + formAnswer = NumberUtil.formatLocalisedNumber(Double.parseDouble(formAnswer), (Locale) null, + question.getDigitsDecimal()); + } + answer.setAnswer(formAnswer); } + formAnswerNumber++; + } + break; + case DacoConstants.QUESTION_TYPE_DATE: { + String[] dateParts = new String[] { recordForm.getAnswer(formAnswerNumber++), + recordForm.getAnswer(formAnswerNumber++), recordForm.getAnswer(formAnswerNumber) }; + if (!(StringUtils.isBlank(dateParts[0]) || StringUtils.isBlank(dateParts[1]) || StringUtils + .isBlank(dateParts[2]))) { - form.reset(mapping, request); + Calendar calendar = Calendar.getInstance(); + calendar.clear(); + calendar.set(Integer.parseInt(dateParts[2]), Integer.parseInt(dateParts[1]) - 1, Integer + .parseInt(dateParts[0])); + answer.setAnswer(DacoConstants.DEFAULT_DATE_FORMAT.format(calendar.getTime())); + } else { + answer.setAnswer(null); + } + } + formAnswerNumber++; + break; + case DacoConstants.QUESTION_TYPE_CHECKBOX: { + String formAnswer = recordForm.getAnswer(formAnswerNumber); + String[] checkboxes = formAnswer.split("&"); if (isEdit) { - request.setAttribute(DacoConstants.ATTR_RECORD_OPERATION_SUCCESS, DacoConstants.RECORD_OPERATION_EDIT); + DacoAnswer localAnswer = answer; + answerNumber--; + do { + service.deleteDacoAnswer(localAnswer.getUid()); + record.remove(answerNumber); + if (answerNumber <= record.size()) { + localAnswer = record.get(answerNumber); + if (localAnswer.getQuestion().getType() != DacoConstants.QUESTION_TYPE_CHECKBOX) { + localAnswer = null; + } + } else { + localAnswer = null; + } + } while (localAnswer != null); + answer = (DacoAnswer) answer.clone(); + } - else { + if (StringUtils.isBlank(formAnswer)) { + answer.setAnswer(null); + } else { + for (int checkboxNumber = 0; checkboxNumber < checkboxes.length; checkboxNumber++) { + answer.setAnswer(checkboxes[checkboxNumber]); + if (checkboxNumber < checkboxes.length - 1) { + service.saveOrUpdateAnswer(answer); + if (isEdit) { + record.add(answerNumber++, answer); + } else { + record.add(answer); + } - records.add(record); - request.setAttribute(DacoConstants.ATTR_RECORD_OPERATION_SUCCESS, DacoConstants.RECORD_OPERATION_ADD); - - //notify teachers - if (daco.isNotifyTeachersOnRecordSumbit() - && service.getEventNotificationService().eventExists(DacoConstants.TOOL_SIGNATURE, - DacoConstants.EVENT_NAME_NOTIFY_TEACHERS_ON_RECORD_SUBMIT, daco.getContentId())) { - String fullName = user.getLastName() + " " + user.getFirstName(); - service.getEventNotificationService() - .trigger(DacoConstants.TOOL_SIGNATURE, DacoConstants.EVENT_NAME_NOTIFY_TEACHERS_ON_RECORD_SUBMIT, - daco.getContentId(), new Object[] { fullName }); + answer = (DacoAnswer) answer.clone(); } + } } + if (isEdit) { + record.add(answerNumber++, answer); + } + } + formAnswerNumber++; + break; + case DacoConstants.QUESTION_TYPE_LONGLAT: { + answer.setAnswer(recordForm.getAnswer(formAnswerNumber++)); + service.saveOrUpdateAnswer(answer); + if (isEdit) { + answer = record.get(answerNumber++); + } else { + record.add(answer); + answer = (DacoAnswer) answer.clone(); + } + answer.setAnswer(recordForm.getAnswer(formAnswerNumber)); + } + formAnswerNumber++; + break; + case DacoConstants.QUESTION_TYPE_FILE: + case DacoConstants.QUESTION_TYPE_IMAGE: { + FormFile file = recordForm.getFile(fileNumber); + if (file != null) { + try { + service.uploadDacoAnswerFile(answer, file); + } catch (UploadDacoFileException e) { + LearningAction.log.error("Failed upload Resource File " + e.toString()); + e.printStackTrace(); + } + } + } + fileNumber++; + break; + case DacoConstants.QUESTION_TYPE_DROPDOWN: { + String formAnswer = recordForm.getAnswer(formAnswerNumber); + answer.setAnswer("0".equals(formAnswer) ? null : formAnswer); + } + formAnswerNumber++; + break; + default: + answer.setAnswer(recordForm.getAnswer(formAnswerNumber)); + formAnswerNumber++; + break; + } - request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, records.size() + 1); - refreshQuestionSummaries(mapping, request); - - return mapping.findForward(DacoConstants.SUCCESS); + service.saveOrUpdateAnswer(answer); + if (!isEdit) { + record.add(answer); + } } - /** - * Display empty reflection form. - * - * @param mapping - * @param form - * @param request - * @param response - * @return - */ - protected ActionForward startReflection(ActionMapping mapping, ActionForm form, HttpServletRequest request) { + form.reset(mapping, request); + if (isEdit) { + request.setAttribute(DacoConstants.ATTR_RECORD_OPERATION_SUCCESS, DacoConstants.RECORD_OPERATION_EDIT); + } else { - // get session value - String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); + records.add(record); + request.setAttribute(DacoConstants.ATTR_RECORD_OPERATION_SUCCESS, DacoConstants.RECORD_OPERATION_ADD); - ActionErrors errors = validateBeforeFinish(request, sessionMapID); - if (!errors.isEmpty()) { - this.addErrors(request, errors); - refreshQuestionSummaries(mapping, request); - request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, request - .getParameter(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER)); - return mapping.getInputForward(); + // notify teachers + + if (daco.isNotifyTeachersOnRecordSumbit()) { + List monitoringUsers = service.getMonitorsByToolSessionId(sessionId); + if (monitoringUsers != null && !monitoringUsers.isEmpty()) { + Long[] monitoringUsersIds = new Long[monitoringUsers.size()]; + for (int i = 0; i < monitoringUsersIds.length; i++) { + monitoringUsersIds[i] = monitoringUsers.get(i).getUserId().longValue(); + } + String fullName = user.getLastName() + " " + user.getFirstName(); + service.getEventNotificationService().sendMessage(monitoringUsersIds, + DeliveryMethodMail.getInstance(), + service.getLocalisedMessage("event.recordsubmit.subject", null), + service.getLocalisedMessage("event.recordsubmit.body", new Object[] { fullName })); } - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + } + } - Long toolSessionID = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); - IDacoService service = getDacoService(); - ReflectionForm reflectionForm = (ReflectionForm) form; - HttpSession httpSession = SessionManager.getSession(); - UserDTO userDTO = (UserDTO) httpSession.getAttribute(AttributeNames.USER); - DacoUser user = service.getUserByUserIdAndSessionId(userDTO.getUserID().longValue(), toolSessionID); + request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, records.size() + 1); + refreshQuestionSummaries(mapping, request); - reflectionForm.setUserId(userDTO.getUserID()); - reflectionForm.setSessionId(toolSessionID); + return mapping.findForward(DacoConstants.SUCCESS); + } - // get the existing reflection entry + /** + * Display empty reflection form. + * + * @param mapping + * @param form + * @param request + * @param response + * @return + */ + protected ActionForward startReflection(ActionMapping mapping, ActionForm form, HttpServletRequest request) { - NotebookEntry entry = service.getEntry(toolSessionID, CoreNotebookConstants.NOTEBOOK_TOOL, DacoConstants.TOOL_SIGNATURE, - userDTO.getUserID()); + // get session value + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); - if (entry != null) { - reflectionForm.setEntryText(entry.getEntry()); - } - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - reflectionForm.setSessionMapID(sessionMapID); - return mapping.findForward(DacoConstants.SUCCESS); + ActionErrors errors = validateBeforeFinish(request, sessionMapID); + if (!errors.isEmpty()) { + this.addErrors(request, errors); + refreshQuestionSummaries(mapping, request); + request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, request + .getParameter(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER)); + return mapping.getInputForward(); } + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - /** - * Submit reflection form input database. - * - * @param mapping - * @param form - * @param request - * @param response - * @return - */ - protected ActionForward submitReflection(ActionMapping mapping, ActionForm form, HttpServletRequest request) { - ReflectionForm reflectionForm = (ReflectionForm) form; - Integer userId = reflectionForm.getUserId(); - Long sessionId = reflectionForm.getSessionId(); - IDacoService service = getDacoService(); - // check for existing notebook entry - NotebookEntry entry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, DacoConstants.TOOL_SIGNATURE, - userId); + Long toolSessionID = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); + IDacoService service = getDacoService(); + ReflectionForm reflectionForm = (ReflectionForm) form; + HttpSession httpSession = SessionManager.getSession(); + UserDTO userDTO = (UserDTO) httpSession.getAttribute(AttributeNames.USER); + DacoUser user = service.getUserByUserIdAndSessionId(userDTO.getUserID().longValue(), toolSessionID); - if (entry == null) { - // create new entry - service.createNotebookEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, DacoConstants.TOOL_SIGNATURE, userId, - reflectionForm.getEntryText()); - } - else { - // update existing entry - entry.setEntry(reflectionForm.getEntryText()); - entry.setLastModified(new Date()); - service.updateEntry(entry); - } + reflectionForm.setUserId(userDTO.getUserID()); + reflectionForm.setSessionId(toolSessionID); - return finish(mapping, request); - } + // get the existing reflection entry - // ************************************************************************************* - // Private method - // ************************************************************************************* - protected ActionErrors validateBeforeFinish(HttpServletRequest request, String sessionMapID) { - ActionErrors errors = new ActionErrors(); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - int recordCount = ((List) sessionMap.get(DacoConstants.ATTR_RECORD_LIST)).size(); - Daco daco = (Daco) sessionMap.get(DacoConstants.ATTR_DACO); - Short min = daco.getMinRecords(); - Short max = daco.getMaxRecords(); - if (min != null && min > 0 && recordCount < min) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_NOTENOUGH, daco - .getMinRecords())); - } - else if (max != null && max > 0 && recordCount > max) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_TOOMUCH, daco - .getMaxRecords())); - } - return errors; - } + NotebookEntry entry = service.getEntry(toolSessionID, CoreNotebookConstants.NOTEBOOK_TOOL, + DacoConstants.TOOL_SIGNATURE, userDTO.getUserID()); - protected IDacoService getDacoService() { - WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet().getServletContext()); - return (IDacoService) wac.getBean(DacoConstants.DACO_SERVICE); + if (entry != null) { + reflectionForm.setEntryText(entry.getEntry()); } + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + reflectionForm.setSessionMapID(sessionMapID); + return mapping.findForward(DacoConstants.SUCCESS); + } - /** - * List save current daco questions. - * - * @param request - * @return - */ - protected SortedSet getDacoQuestionList(SessionMap sessionMap) { - SortedSet list = (SortedSet) sessionMap.get(DacoConstants.ATTR_QUESTION_LIST); - if (list == null) { - list = new TreeSet(new DacoQuestionComparator()); - sessionMap.put(DacoConstants.ATTR_QUESTION_LIST, list); - } - return list; + /** + * Submit reflection form input database. + * + * @param mapping + * @param form + * @param request + * @param response + * @return + */ + protected ActionForward submitReflection(ActionMapping mapping, ActionForm form, HttpServletRequest request) { + ReflectionForm reflectionForm = (ReflectionForm) form; + Integer userId = reflectionForm.getUserId(); + Long sessionId = reflectionForm.getSessionId(); + IDacoService service = getDacoService(); + // check for existing notebook entry + NotebookEntry entry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, + DacoConstants.TOOL_SIGNATURE, userId); + + if (entry == null) { + // create new entry + service.createNotebookEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, DacoConstants.TOOL_SIGNATURE, + userId, reflectionForm.getEntryText()); + } else { + // update existing entry + entry.setEntry(reflectionForm.getEntryText()); + entry.setLastModified(new Date()); + service.updateEntry(entry); } - /** - * Get java.util.List from HttpSession by given name. - * - * @param request - * @param name - * @return - */ - protected List getListFromSession(SessionMap sessionMap, String name) { - List list = (List) sessionMap.get(name); - if (list == null) { - list = new ArrayList(); - sessionMap.put(name, list); - } - return list; + return finish(mapping, request); + } + + // ************************************************************************************* + // Private method + // ************************************************************************************* + protected ActionErrors validateBeforeFinish(HttpServletRequest request, String sessionMapID) { + ActionErrors errors = new ActionErrors(); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + int recordCount = ((List) sessionMap.get(DacoConstants.ATTR_RECORD_LIST)).size(); + Daco daco = (Daco) sessionMap.get(DacoConstants.ATTR_DACO); + Short min = daco.getMinRecords(); + Short max = daco.getMaxRecords(); + if (min != null && min > 0 && recordCount < min) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_NOTENOUGH, daco + .getMinRecords())); + } else if (max != null && max > 0 && recordCount > max) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_TOOMUCH, daco + .getMaxRecords())); } + return errors; + } - protected DacoUser getCurrentUser(IDacoService service, Long sessionId, Daco daco) { - // try to get form system session - HttpSession ss = SessionManager.getSession(); - // get back login user DTO - UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); - DacoUser dacoUser = service.getUserByUserIdAndSessionId(new Long(user.getUserID().intValue()), sessionId); + protected IDacoService getDacoService() { + WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet() + .getServletContext()); + return (IDacoService) wac.getBean(DacoConstants.DACO_SERVICE); + } - if (dacoUser == null) { - DacoSession session = service.getSessionBySessionId(sessionId); - dacoUser = new DacoUser(user, session); - dacoUser.setDaco(daco); - service.createUser(dacoUser); - } - return dacoUser; + /** + * List save current daco questions. + * + * @param request + * @return + */ + protected SortedSet getDacoQuestionList(SessionMap sessionMap) { + SortedSet list = (SortedSet) sessionMap.get(DacoConstants.ATTR_QUESTION_LIST); + if (list == null) { + list = new TreeSet(new DacoQuestionComparator()); + sessionMap.put(DacoConstants.ATTR_QUESTION_LIST, list); } + return list; + } - protected DacoUser getSpecifiedUser(IDacoService service, Long sessionId, Integer userId) { - DacoUser dacoUser = service.getUserByUserIdAndSessionId(new Long(userId.intValue()), sessionId); - if (dacoUser == null) { - LearningAction.log.error("Unable to find specified user for daco activity. Screens are likely to fail. SessionId=" - + sessionId + " UserId=" + userId); - } - return dacoUser; + /** + * Get java.util.List from HttpSession by given name. + * + * @param request + * @param name + * @return + */ + protected List getListFromSession(SessionMap sessionMap, String name) { + List list = (List) sessionMap.get(name); + if (list == null) { + list = new ArrayList(); + sessionMap.put(name, list); } + return list; + } - protected ActionErrors validateRecordForm(RecordForm recordForm, Set questionList) { - ActionErrors errors = new ActionErrors(); - Iterator questionIterator = questionList.iterator(); - DacoQuestion question = null; - int answerNumber = 0; - int fileNumber = 0; - int questionNumber = 1; - while (questionIterator.hasNext()) { - question = questionIterator.next(); - switch (question.getType()) { - case DacoConstants.QUESTION_TYPE_TEXTFIELD: - case DacoConstants.QUESTION_TYPE_RADIO: - if (question.isRequired() && StringUtils.isBlank(recordForm.getAnswer(answerNumber))) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, - questionNumber)); + protected DacoUser getCurrentUser(IDacoService service, Long sessionId, Daco daco) { + // try to get form system session + HttpSession ss = SessionManager.getSession(); + // get back login user DTO + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + DacoUser dacoUser = service.getUserByUserIdAndSessionId(new Long(user.getUserID().intValue()), sessionId); - } - answerNumber++; - break; - case DacoConstants.QUESTION_TYPE_TEXTAREA: { - if (StringUtils.isBlank(recordForm.getAnswer(answerNumber))) { - if (question.isRequired()) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, - questionNumber)); - } - } - else if (question.getMax() != null) { - long words = 0; - int index = 0; - boolean prevWhiteSpace = true; - while (index < recordForm.getAnswer(answerNumber).length()) { - char c = recordForm.getAnswer(answerNumber).charAt(index++); - boolean currWhiteSpace = Character.isWhitespace(c); - if (prevWhiteSpace && !currWhiteSpace) { - words++; - } - prevWhiteSpace = currWhiteSpace; - } - int max = question.getMax().intValue(); - if (words > max) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_TEXTAREA_LONG, questionNumber, max)); - } - } - } - answerNumber++; - break; - case DacoConstants.QUESTION_TYPE_NUMBER: { - if (StringUtils.isBlank(recordForm.getAnswer(answerNumber))) { - if (question.isRequired()) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, - questionNumber)); - } - } - else { - try { - float number = Float.parseFloat(recordForm.getAnswer(answerNumber)); - Float min = question.getMin(); - Float max = question.getMax(); - if (min != null && number < min) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_NUMBER_MIN, questionNumber, min)); - } - else if (max != null && number > max) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_NUMBER_MAX, questionNumber, max)); - } - } - catch (NumberFormatException e) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_NUMBER_FLOAT, questionNumber)); - } - } - } - answerNumber++; - break; - case DacoConstants.QUESTION_TYPE_DATE: { - String day = recordForm.getAnswer(answerNumber++); - String month = recordForm.getAnswer(answerNumber++); - String year = recordForm.getAnswer(answerNumber); - if (StringUtils.isBlank(day) && StringUtils.isBlank(month) && StringUtils.isBlank(year)) { - if (question.isRequired()) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, - questionNumber)); - } - } - else { - Integer yearNum = null; - Integer monthNum = null; - if (StringUtils.isBlank(year)) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_DATE_YEAR_BLANK, questionNumber)); - } - else { - try { - yearNum = Integer.parseInt(year); - } - catch (NumberFormatException e) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_DATE_YEAR_INT, questionNumber)); - } - } + if (dacoUser == null) { + DacoSession session = service.getSessionBySessionId(sessionId); + dacoUser = new DacoUser(user, session); + dacoUser.setDaco(daco); + service.createUser(dacoUser); + } + return dacoUser; + } - if (StringUtils.isBlank(month)) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_DATE_MONTH_BLANK, questionNumber)); - } - else { - try { - monthNum = Integer.parseInt(month); - if (monthNum < 1 || monthNum > 12) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_DATE_MONTH_LIMIT, questionNumber)); - } - } - catch (NumberFormatException e) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_DATE_MONTH_INT, questionNumber)); - } - } + protected DacoUser getSpecifiedUser(IDacoService service, Long sessionId, Integer userId) { + DacoUser dacoUser = service.getUserByUserIdAndSessionId(new Long(userId.intValue()), sessionId); + if (dacoUser == null) { + LearningAction.log + .error("Unable to find specified user for daco activity. Screens are likely to fail. SessionId=" + + sessionId + " UserId=" + userId); + } + return dacoUser; + } - if (StringUtils.isBlank(day)) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_DATE_DAY_BLANK, questionNumber)); - } - else { - try { + protected ActionErrors validateRecordForm(RecordForm recordForm, Set questionList) { + ActionErrors errors = new ActionErrors(); + Iterator questionIterator = questionList.iterator(); + DacoQuestion question = null; + int answerNumber = 0; + int fileNumber = 0; + int questionNumber = 1; + while (questionIterator.hasNext()) { + question = questionIterator.next(); + switch (question.getType()) { + case DacoConstants.QUESTION_TYPE_TEXTFIELD: + case DacoConstants.QUESTION_TYPE_RADIO: + if (question.isRequired() && StringUtils.isBlank(recordForm.getAnswer(answerNumber))) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, + questionNumber)); - int dayNum = Integer.parseInt(day); - Integer maxDays = yearNum == null || monthNum == null ? null : getMaxDays(monthNum, yearNum); - if (dayNum < 1 || maxDays != null && dayNum > maxDays) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_DATE_DAY_LIMIT, questionNumber, maxDays)); - } - } - catch (NumberFormatException e) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_DATE_DAY_INT, questionNumber)); - } - } - } - } - answerNumber++; - break; - case DacoConstants.QUESTION_TYPE_FILE: { - FormFile file = recordForm.getFile(fileNumber); - if (file == null || file.getFileSize() == 0) { - if (question.isRequired()) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, - questionNumber)); - } - } - else { - FileValidatorUtil.validateFileSize(file, true, errors); - } - fileNumber++; - } - break; - case DacoConstants.QUESTION_TYPE_IMAGE: { - FormFile file = recordForm.getFile(fileNumber); - if (file == null || file.getFileSize() == 0) { - if (question.isRequired()) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, - questionNumber)); - } - } - else { - String fileName = file.getFileName(); - boolean isImage = false; - if (fileName.length() > 5) { + } + answerNumber++; + break; + case DacoConstants.QUESTION_TYPE_TEXTAREA: { + if (StringUtils.isBlank(recordForm.getAnswer(answerNumber))) { + if (question.isRequired()) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_BLANK, questionNumber)); + } + } else if (question.getMax() != null) { + long words = 0; + int index = 0; + boolean prevWhiteSpace = true; + while (index < recordForm.getAnswer(answerNumber).length()) { + char c = recordForm.getAnswer(answerNumber).charAt(index++); + boolean currWhiteSpace = Character.isWhitespace(c); + if (prevWhiteSpace && !currWhiteSpace) { + words++; + } + prevWhiteSpace = currWhiteSpace; + } + int max = question.getMax().intValue(); + if (words > max) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_TEXTAREA_LONG, questionNumber, max)); + } + } + } + answerNumber++; + break; + case DacoConstants.QUESTION_TYPE_NUMBER: { + if (StringUtils.isBlank(recordForm.getAnswer(answerNumber))) { + if (question.isRequired()) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_BLANK, questionNumber)); + } + } else { + try { + float number = Float.parseFloat(recordForm.getAnswer(answerNumber)); + Float min = question.getMin(); + Float max = question.getMax(); + if (min != null && number < min) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_NUMBER_MIN, questionNumber, min)); + } else if (max != null && number > max) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_NUMBER_MAX, questionNumber, max)); + } + } catch (NumberFormatException e) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_NUMBER_FLOAT, questionNumber)); + } + } + } + answerNumber++; + break; + case DacoConstants.QUESTION_TYPE_DATE: { + String day = recordForm.getAnswer(answerNumber++); + String month = recordForm.getAnswer(answerNumber++); + String year = recordForm.getAnswer(answerNumber); + if (StringUtils.isBlank(day) && StringUtils.isBlank(month) && StringUtils.isBlank(year)) { + if (question.isRequired()) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_BLANK, questionNumber)); + } + } else { + Integer yearNum = null; + Integer monthNum = null; + if (StringUtils.isBlank(year)) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_DATE_YEAR_BLANK, questionNumber)); + } else { + try { + yearNum = Integer.parseInt(year); + } catch (NumberFormatException e) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_DATE_YEAR_INT, questionNumber)); + } + } - String extension = fileName.substring(fileName.length() - 3); - for (String acceptedExtension : DacoConstants.IMAGE_EXTENSIONS) { - if (extension.equalsIgnoreCase(acceptedExtension)) { - isImage = true; - break; - } - } - } - if (!isImage) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_IMAGE_FORMAT, questionNumber)); - } - else { - FileValidatorUtil.validateFileSize(file, true, errors); - } - } - fileNumber++; - } - break; - case DacoConstants.QUESTION_TYPE_DROPDOWN: { - if (question.isRequired() && "0".equals(recordForm.getAnswer(answerNumber))) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, - questionNumber)); + if (StringUtils.isBlank(month)) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_DATE_MONTH_BLANK, questionNumber)); + } else { + try { + monthNum = Integer.parseInt(month); + if (monthNum < 1 || monthNum > 12) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_DATE_MONTH_LIMIT, questionNumber)); + } + } catch (NumberFormatException e) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_DATE_MONTH_INT, questionNumber)); + } + } - } - } - answerNumber++; - break; - case DacoConstants.QUESTION_TYPE_CHECKBOX: { - if (StringUtils.isBlank(recordForm.getAnswer(answerNumber))) { - if (question.isRequired()) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, - questionNumber)); - } - } - else { - int count = recordForm.getAnswer(answerNumber).split("&").length; - Float min = question.getMin(); - Float max = question.getMax(); - if (min != null && count < min) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_CHECKBOX_MIN, questionNumber, min.intValue())); - } - else if (max != null && count > max) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_CHECKBOX_MAX, questionNumber, max.intValue())); - } - } - } - answerNumber++; - break; - case DacoConstants.QUESTION_TYPE_LONGLAT: { - String longitude = recordForm.getAnswer(answerNumber++); - String latitude = recordForm.getAnswer(answerNumber); - if (StringUtils.isBlank(longitude)) { - if (StringUtils.isBlank(latitude)) { - if (question.isRequired()) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, - questionNumber)); - } - } - else { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_LONGITUDE_BLANK, questionNumber)); - } + if (StringUtils.isBlank(day)) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_DATE_DAY_BLANK, questionNumber)); + } else { + try { - } - else if (StringUtils.isBlank(latitude)) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_LATITUDE_BLANK, questionNumber)); - } - else { - try { - Float.parseFloat(longitude); - } - catch (NumberFormatException e) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_LONGITUDE_FLOAT, questionNumber)); - } - try { - Float.parseFloat(latitude); - } - catch (NumberFormatException e) { - errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( - DacoConstants.ERROR_MSG_RECORD_LATITUDE_FLOAT, questionNumber)); - } - } - } - answerNumber++; - break; + int dayNum = Integer.parseInt(day); + Integer maxDays = yearNum == null || monthNum == null ? null + : getMaxDays(monthNum, yearNum); + if (dayNum < 1 || maxDays != null && dayNum > maxDays) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_DATE_DAY_LIMIT, questionNumber, maxDays)); + } + } catch (NumberFormatException e) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_DATE_DAY_INT, questionNumber)); } - questionNumber++; + } } - return errors; - } + } + answerNumber++; + break; + case DacoConstants.QUESTION_TYPE_FILE: { + FormFile file = recordForm.getFile(fileNumber); + if (file == null || file.getFileSize() == 0) { + if (question.isRequired()) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_BLANK, questionNumber)); + } + } else { + FileValidatorUtil.validateFileSize(file, true, errors); + } + fileNumber++; + } + break; + case DacoConstants.QUESTION_TYPE_IMAGE: { + FormFile file = recordForm.getFile(fileNumber); + if (file == null || file.getFileSize() == 0) { + if (question.isRequired()) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_BLANK, questionNumber)); + } + } else { + String fileName = file.getFileName(); + boolean isImage = false; + if (fileName.length() > 5) { - protected final int getMaxDays(int month, int year) { - if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { - return 31; + String extension = fileName.substring(fileName.length() - 3); + for (String acceptedExtension : DacoConstants.IMAGE_EXTENSIONS) { + if (extension.equalsIgnoreCase(acceptedExtension)) { + isImage = true; + break; + } + } + } + if (!isImage) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_IMAGE_FORMAT, questionNumber)); + } else { + FileValidatorUtil.validateFileSize(file, true, errors); + } } - if (month == 2) { - return isLeapYear(year) ? 29 : 28; + fileNumber++; + } + break; + case DacoConstants.QUESTION_TYPE_DROPDOWN: { + if (question.isRequired() && "0".equals(recordForm.getAnswer(answerNumber))) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(DacoConstants.ERROR_MSG_RECORD_BLANK, + questionNumber)); + } - return 30; + } + answerNumber++; + break; + case DacoConstants.QUESTION_TYPE_CHECKBOX: { + if (StringUtils.isBlank(recordForm.getAnswer(answerNumber))) { + if (question.isRequired()) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_BLANK, questionNumber)); + } + } else { + int count = recordForm.getAnswer(answerNumber).split("&").length; + Float min = question.getMin(); + Float max = question.getMax(); + if (min != null && count < min) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_CHECKBOX_MIN, questionNumber, min.intValue())); + } else if (max != null && count > max) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_CHECKBOX_MAX, questionNumber, max.intValue())); + } + } + } + answerNumber++; + break; + case DacoConstants.QUESTION_TYPE_LONGLAT: { + String longitude = recordForm.getAnswer(answerNumber++); + String latitude = recordForm.getAnswer(answerNumber); + if (StringUtils.isBlank(longitude)) { + if (StringUtils.isBlank(latitude)) { + if (question.isRequired()) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_BLANK, questionNumber)); + } + } else { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_LONGITUDE_BLANK, questionNumber)); + } + + } else if (StringUtils.isBlank(latitude)) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_LATITUDE_BLANK, questionNumber)); + } else { + try { + Float.parseFloat(longitude); + } catch (NumberFormatException e) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_LONGITUDE_FLOAT, questionNumber)); + } + try { + Float.parseFloat(latitude); + } catch (NumberFormatException e) { + errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage( + DacoConstants.ERROR_MSG_RECORD_LATITUDE_FLOAT, questionNumber)); + } + } + } + answerNumber++; + break; + } + questionNumber++; } + return errors; + } - protected final boolean isLeapYear(int year) { - if (year % 4 == 0) { + protected final int getMaxDays(int month, int year) { + if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { + return 31; + } + if (month == 2) { + return isLeapYear(year) ? 29 : 28; + } + return 30; + } - if (year % 100 != 0) { - return true; - } - else if (year % 400 == 0) { - return false; - } - else { - return false; - } - } - else { - return false; - } + protected final boolean isLeapYear(int year) { + if (year % 4 == 0) { + + if (year % 100 != 0) { + return true; + } else if (year % 400 == 0) { + return false; + } else { + return false; + } + } else { + return false; } + } - protected ActionForward editRecord(ActionMapping mapping, ActionForm form, HttpServletRequest request) { - String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - int recordIndex = NumberUtils.stringToInt(request.getParameter(DacoConstants.PARAM_RECORD_INDEX), -1); - List> records = (List>) sessionMap.get(DacoConstants.ATTR_RECORD_LIST); - if (recordIndex != -1 && records != null && records.size() >= recordIndex) { - List record = records.get(recordIndex - 1); - RecordForm recordForm = (RecordForm) form; - recordForm.setDisplayedRecordNumber(recordIndex); - recordForm.setSessionMapID(sessionMapID); - StringBuilder checkboxes = null; - int checkboxQuestionNumber = 0; - int formAnswerNumber = 0; - for (int answerNumber = 0; answerNumber < record.size(); answerNumber++) { - DacoAnswer answer = record.get(answerNumber); - short questionType = answer.getQuestion().getType(); + protected ActionForward editRecord(ActionMapping mapping, ActionForm form, HttpServletRequest request) { + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + int recordIndex = NumberUtils.stringToInt(request.getParameter(DacoConstants.PARAM_RECORD_INDEX), -1); + List> records = (List>) sessionMap.get(DacoConstants.ATTR_RECORD_LIST); + if (recordIndex != -1 && records != null && records.size() >= recordIndex) { + List record = records.get(recordIndex - 1); + RecordForm recordForm = (RecordForm) form; + recordForm.setDisplayedRecordNumber(recordIndex); + recordForm.setSessionMapID(sessionMapID); + StringBuilder checkboxes = null; + int checkboxQuestionNumber = 0; + int formAnswerNumber = 0; + for (int answerNumber = 0; answerNumber < record.size(); answerNumber++) { + DacoAnswer answer = record.get(answerNumber); + short questionType = answer.getQuestion().getType(); - if (questionType == DacoConstants.QUESTION_TYPE_CHECKBOX) { - if (checkboxes == null) { - checkboxes = new StringBuilder(record.size() * 3); - checkboxQuestionNumber = formAnswerNumber++; - } - checkboxes.append(answer.getAnswer()).append('&'); - } - else { - if (checkboxes != null) { - recordForm.setAnswer(checkboxQuestionNumber, checkboxes.toString()); - checkboxes = null; - } - if (questionType == DacoConstants.QUESTION_TYPE_DATE) { - String[] dateParts = new String[3]; - if (answer.getAnswer() != null) { - Calendar calendar = Calendar.getInstance(); - calendar.clear(); + if (questionType == DacoConstants.QUESTION_TYPE_CHECKBOX) { + if (checkboxes == null) { + checkboxes = new StringBuilder(record.size() * 3); + checkboxQuestionNumber = formAnswerNumber++; + } + checkboxes.append(answer.getAnswer()).append('&'); + } else { + if (checkboxes != null) { + recordForm.setAnswer(checkboxQuestionNumber, checkboxes.toString()); + checkboxes = null; + } + if (questionType == DacoConstants.QUESTION_TYPE_DATE) { + String[] dateParts = new String[3]; + if (answer.getAnswer() != null) { + Calendar calendar = Calendar.getInstance(); + calendar.clear(); - try { - calendar.setTime(DacoConstants.DEFAULT_DATE_FORMAT.parse(answer.getAnswer())); - } - catch (ParseException e) { - LearningAction.log.error(e.getMessage()); - e.printStackTrace(); - } + try { + calendar.setTime(DacoConstants.DEFAULT_DATE_FORMAT.parse(answer.getAnswer())); + } catch (ParseException e) { + LearningAction.log.error(e.getMessage()); + e.printStackTrace(); + } - dateParts[0] = String.valueOf(calendar.get(Calendar.DAY_OF_YEAR)); - dateParts[1] = String.valueOf(calendar.get(Calendar.MONTH) + 1); - dateParts[2] = String.valueOf(calendar.get(Calendar.YEAR)); - } - recordForm.setAnswer(formAnswerNumber++, dateParts[0]); - recordForm.setAnswer(formAnswerNumber++, dateParts[1]); - recordForm.setAnswer(formAnswerNumber++, dateParts[2]); - } - else if (!(questionType == DacoConstants.QUESTION_TYPE_FILE || questionType == DacoConstants.QUESTION_TYPE_IMAGE)) { - recordForm.setAnswer(formAnswerNumber++, answer.getAnswer()); - } - } + dateParts[0] = String.valueOf(calendar.get(Calendar.DAY_OF_YEAR)); + dateParts[1] = String.valueOf(calendar.get(Calendar.MONTH) + 1); + dateParts[2] = String.valueOf(calendar.get(Calendar.YEAR)); } - if (checkboxes != null) { - recordForm.setAnswer(checkboxQuestionNumber, checkboxes.toString()); - } - - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - sessionMap.put(DacoConstants.ATTR_LEARNING_CURRENT_TAB, 1); - request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, recordIndex); - return mapping.findForward(DacoConstants.SUCCESS); + recordForm.setAnswer(formAnswerNumber++, dateParts[0]); + recordForm.setAnswer(formAnswerNumber++, dateParts[1]); + recordForm.setAnswer(formAnswerNumber++, dateParts[2]); + } else if (!(questionType == DacoConstants.QUESTION_TYPE_FILE || questionType == DacoConstants.QUESTION_TYPE_IMAGE)) { + recordForm.setAnswer(formAnswerNumber++, answer.getAnswer()); + } } - else { - return null; - } + } + if (checkboxes != null) { + recordForm.setAnswer(checkboxQuestionNumber, checkboxes.toString()); + } + + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + sessionMap.put(DacoConstants.ATTR_LEARNING_CURRENT_TAB, 1); + request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, recordIndex); + return mapping.findForward(DacoConstants.SUCCESS); + } else { + return null; } + } - protected ActionForward removeRecord(ActionMapping mapping, HttpServletRequest request) { - String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - int recordIndex = NumberUtils.stringToInt(request.getParameter(DacoConstants.PARAM_RECORD_INDEX), -1); - List> records = (List>) sessionMap.get(DacoConstants.ATTR_RECORD_LIST); - IDacoService service = getDacoService(); - if (recordIndex != -1 && records != null && records.size() >= recordIndex) { - List record = records.get(recordIndex - 1); - service.deleteDacoRecord(record); - records.remove(record); - sessionMap.put(DacoConstants.ATTR_RECORD_LIST, records); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - return mapping.findForward(DacoConstants.SUCCESS); - } - else { - return null; - } + protected ActionForward removeRecord(ActionMapping mapping, HttpServletRequest request) { + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + int recordIndex = NumberUtils.stringToInt(request.getParameter(DacoConstants.PARAM_RECORD_INDEX), -1); + List> records = (List>) sessionMap.get(DacoConstants.ATTR_RECORD_LIST); + IDacoService service = getDacoService(); + if (recordIndex != -1 && records != null && records.size() >= recordIndex) { + List record = records.get(recordIndex - 1); + service.deleteDacoRecord(record); + records.remove(record); + sessionMap.put(DacoConstants.ATTR_RECORD_LIST, records); + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + return mapping.findForward(DacoConstants.SUCCESS); + } else { + return null; } + } - protected ActionForward changeView(ActionMapping mapping, HttpServletRequest request) { - String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, WebUtil.readIntParam(request, - DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER)); - request.setAttribute(DacoConstants.ATTR_LEARNING_CURRENT_TAB, WebUtil.readIntParam(request, - DacoConstants.ATTR_LEARNING_CURRENT_TAB)); - String currentView = (String) sessionMap.get(DacoConstants.ATTR_LEARNING_VIEW); - if (DacoConstants.LEARNING_VIEW_HORIZONTAL.equals(currentView)) { - sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); - } - else { - sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_HORIZONTAL); - } - return mapping.findForward(DacoConstants.SUCCESS); + protected ActionForward changeView(ActionMapping mapping, HttpServletRequest request) { + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + request.setAttribute(DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER, WebUtil.readIntParam(request, + DacoConstants.ATTR_DISPLAYED_RECORD_NUMBER)); + request.setAttribute(DacoConstants.ATTR_LEARNING_CURRENT_TAB, WebUtil.readIntParam(request, + DacoConstants.ATTR_LEARNING_CURRENT_TAB)); + String currentView = (String) sessionMap.get(DacoConstants.ATTR_LEARNING_VIEW); + if (DacoConstants.LEARNING_VIEW_HORIZONTAL.equals(currentView)) { + sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); + } else { + sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_HORIZONTAL); } + return mapping.findForward(DacoConstants.SUCCESS); + } - protected ActionForward refreshQuestionSummaries(ActionMapping mapping, HttpServletRequest request) { - String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - Daco daco = (Daco) sessionMap.get(DacoConstants.ATTR_DACO); - Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); - IDacoService service = getDacoService(); - DacoUser user = getCurrentUser(service, sessionId, daco); + protected ActionForward refreshQuestionSummaries(ActionMapping mapping, HttpServletRequest request) { + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + Daco daco = (Daco) sessionMap.get(DacoConstants.ATTR_DACO); + Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); + IDacoService service = getDacoService(); + DacoUser user = getCurrentUser(service, sessionId, daco); - List summaries = service.getQuestionSummaries(user.getUid()); - sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); + List summaries = service.getQuestionSummaries(user.getUid()); + sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); - Integer totalRecordCount = service.getGroupRecordCount(user.getSession().getSessionId()); - sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + Integer totalRecordCount = service.getGroupRecordCount(user.getSession().getSessionId()); + sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - return mapping.findForward(DacoConstants.SUCCESS); - } + return mapping.findForward(DacoConstants.SUCCESS); + } } \ No newline at end of file Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/MonitoringAction.java =================================================================== diff -u -ra8e7e92f2121c4b307fb49d28008a5828ad58c58 -ra3cbfca2faad29605192470bb2bb1ec21b0344f6 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision a8e7e92f2121c4b307fb49d28008a5828ad58c58) +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision a3cbfca2faad29605192470bb2bb1ec21b0344f6) @@ -37,7 +37,6 @@ import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; -import org.lamsfoundation.lams.events.IEventNotificationService; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.tool.daco.DacoConstants; @@ -56,168 +55,144 @@ import org.springframework.web.context.support.WebApplicationContextUtils; public class MonitoringAction extends Action { - public static Logger log = Logger.getLogger(MonitoringAction.class); + public static Logger log = Logger.getLogger(MonitoringAction.class); - @Override - public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - String param = mapping.getParameter(); + @Override + public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + String param = mapping.getParameter(); - if (param.equals("summary")) { - return summary(mapping, request); - } - if (param.equals("viewReflection")) { - return viewReflection(mapping, request); - } - - if (param.equals("listRecords")) { - return listRecords(mapping, request); - } - if (param.equals("changeView")) { - return changeView(mapping, request); - } - - return mapping.findForward(DacoConstants.ERROR); + if (param.equals("summary")) { + return summary(mapping, request); } + if (param.equals("viewReflection")) { + return viewReflection(mapping, request); + } - protected ActionForward listRecords(ActionMapping mapping, HttpServletRequest request) { - String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - Long userUid = WebUtil.readLongParam(request, DacoConstants.USER_UID, true); - Daco daco = (Daco) sessionMap.get(DacoConstants.ATTR_DACO); - IDacoService service = getDacoService(); - sessionMap.put(DacoConstants.ATTR_MONITORING_SUMMARY, service.getMonitoringSummary(daco.getContentId(), userUid)); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - - request.setAttribute(DacoConstants.USER_UID, userUid); - return mapping.findForward(DacoConstants.SUCCESS); + if (param.equals("listRecords")) { + return listRecords(mapping, request); } + if (param.equals("changeView")) { + return changeView(mapping, request); + } - protected ActionForward summary(ActionMapping mapping, HttpServletRequest request) { - // initial Session Map - IDacoService service = getDacoService(); - String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID, true); + return mapping.findForward(DacoConstants.ERROR); + } - boolean newSession = sessionMapID == null || request.getSession().getAttribute(sessionMapID) == null; - SessionMap sessionMap = null; - if (newSession) { - sessionMap = new SessionMap(); - sessionMapID = sessionMap.getSessionID(); - request.getSession().setAttribute(sessionMapID, sessionMap); - sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); - } - else { - sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - } + protected ActionForward listRecords(ActionMapping mapping, HttpServletRequest request) { + String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + Long userUid = WebUtil.readLongParam(request, DacoConstants.USER_UID, true); + Daco daco = (Daco) sessionMap.get(DacoConstants.ATTR_DACO); + IDacoService service = getDacoService(); + sessionMap.put(DacoConstants.ATTR_MONITORING_SUMMARY, service + .getMonitoringSummary(daco.getContentId(), userUid)); + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - Long contentId = sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID) == null ? WebUtil.readLongParam(request, - AttributeNames.PARAM_TOOL_CONTENT_ID) : (Long) sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID); - Daco daco = service.getDacoByContentId(contentId); - daco.toDTO(); + request.setAttribute(DacoConstants.USER_UID, userUid); + return mapping.findForward(DacoConstants.SUCCESS); + } - List monitoringSummaryList = service.getMonitoringSummary(contentId, - DacoConstants.MONITORING_SUMMARY_MATCH_NONE); + protected ActionForward summary(ActionMapping mapping, HttpServletRequest request) { + // initial Session Map + IDacoService service = getDacoService(); + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID, true); - Long userUid = WebUtil.readLongParam(request, DacoConstants.USER_UID, true); - if (userUid == null) { - userUid = (Long) sessionMap.get(DacoConstants.USER_UID); - request.setAttribute(DacoConstants.ATTR_MONITORING_CURRENT_TAB, 1); - } - else { - request.setAttribute(DacoConstants.ATTR_MONITORING_CURRENT_TAB, 4); - } + boolean newSession = sessionMapID == null || request.getSession().getAttribute(sessionMapID) == null; + SessionMap sessionMap = null; + if (newSession) { + sessionMap = new SessionMap(); + sessionMapID = sessionMap.getSessionID(); + request.getSession().setAttribute(sessionMapID, sessionMap); + sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); + } else { + sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + } - if (userUid == null && !monitoringSummaryList.isEmpty() && !monitoringSummaryList.get(0).getUsers().isEmpty()) { - userUid = monitoringSummaryList.get(0).getUsers().get(0).getUid(); - } - if (userUid != null) { - List summaries = service.getQuestionSummaries(userUid); - sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); + Long contentId = sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID) == null ? WebUtil.readLongParam(request, + AttributeNames.PARAM_TOOL_CONTENT_ID) : (Long) sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID); + Daco daco = service.getDacoByContentId(contentId); + daco.toDTO(); - Integer totalRecordCount = service.getGroupRecordCount(service.getUser(userUid).getSession().getSessionId()); - sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); - monitoringSummaryList = service.getMonitoringSummary(contentId, userUid); - } + List monitoringSummaryList = service.getMonitoringSummary(contentId, + DacoConstants.MONITORING_SUMMARY_MATCH_NONE); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - sessionMap.put(DacoConstants.USER_UID, userUid); - sessionMap.put(DacoConstants.PAGE_EDITABLE, !daco.isContentInUse()); - sessionMap.put(DacoConstants.ATTR_MONITORING_SUMMARY, monitoringSummaryList); + Long userUid = WebUtil.readLongParam(request, DacoConstants.USER_UID, true); + if (userUid == null) { + userUid = (Long) sessionMap.get(DacoConstants.USER_UID); + request.setAttribute(DacoConstants.ATTR_MONITORING_CURRENT_TAB, 1); + } else { + request.setAttribute(DacoConstants.ATTR_MONITORING_CURRENT_TAB, 4); + } - if (newSession) { - sessionMap.put(DacoConstants.ATTR_DACO, daco); - sessionMap.put(AttributeNames.PARAM_TOOL_CONTENT_ID, contentId); - sessionMap.put(AttributeNames.PARAM_CONTENT_FOLDER_ID, WebUtil.readStrParam(request, - AttributeNames.PARAM_CONTENT_FOLDER_ID)); + if (userUid == null && !monitoringSummaryList.isEmpty() && !monitoringSummaryList.get(0).getUsers().isEmpty()) { + userUid = monitoringSummaryList.get(0).getUsers().get(0).getUid(); + } + if (userUid != null) { + List summaries = service.getQuestionSummaries(userUid); + sessionMap.put(DacoConstants.ATTR_QUESTION_SUMMARIES, summaries); - HttpSession ss = SessionManager.getSession(); - UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); - if (daco.isNotifyTeachersOnLearnerEntry()) { - //Since we don't know if the event exists, we just try to create it. - service.getEventNotificationService().createEvent(DacoConstants.TOOL_SIGNATURE, - DacoConstants.EVENT_NAME_NOTIFY_TEACHERS_ON_LEARNER_ENTRY, contentId, - service.getLocalisedMessage("event.learnerentry.subject", null), - service.getLocalisedMessage("event.learnerentry.body", null)); + Integer totalRecordCount = service + .getGroupRecordCount(service.getUser(userUid).getSession().getSessionId()); + sessionMap.put(DacoConstants.ATTR_TOTAL_RECORD_COUNT, totalRecordCount); + monitoringSummaryList = service.getMonitoringSummary(contentId, userUid); + } - //Now we subscribe the teacher - service.getEventNotificationService().subscribe(DacoConstants.TOOL_SIGNATURE, - DacoConstants.EVENT_NAME_NOTIFY_TEACHERS_ON_LEARNER_ENTRY, contentId, user.getUserID().longValue(), - IEventNotificationService.DELIVERY_METHOD_MAIL, IEventNotificationService.PERIODICITY_SINGLE); - } - if (daco.isNotifyTeachersOnRecordSumbit()) { - //Since we don't know if the event exists, we just try to create it. - service.getEventNotificationService().createEvent(DacoConstants.TOOL_SIGNATURE, - DacoConstants.EVENT_NAME_NOTIFY_TEACHERS_ON_RECORD_SUBMIT, contentId, - service.getLocalisedMessage("event.recordsubmit.subject", null), - service.getLocalisedMessage("event.recordsubmit.body", null)); + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + sessionMap.put(DacoConstants.USER_UID, userUid); + sessionMap.put(DacoConstants.PAGE_EDITABLE, !daco.isContentInUse()); + sessionMap.put(DacoConstants.ATTR_MONITORING_SUMMARY, monitoringSummaryList); - //Now we subscribe the teacher - service.getEventNotificationService().subscribe(DacoConstants.TOOL_SIGNATURE, - DacoConstants.EVENT_NAME_NOTIFY_TEACHERS_ON_RECORD_SUBMIT, contentId, user.getUserID().longValue(), - IEventNotificationService.DELIVERY_METHOD_MAIL, IEventNotificationService.PERIODICITY_SINGLE); - } - } - return mapping.findForward(DacoConstants.SUCCESS); + if (newSession) { + sessionMap.put(DacoConstants.ATTR_DACO, daco); + sessionMap.put(AttributeNames.PARAM_TOOL_CONTENT_ID, contentId); + sessionMap.put(AttributeNames.PARAM_CONTENT_FOLDER_ID, WebUtil.readStrParam(request, + AttributeNames.PARAM_CONTENT_FOLDER_ID)); + + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); } + return mapping.findForward(DacoConstants.SUCCESS); + } - protected ActionForward viewReflection(ActionMapping mapping, HttpServletRequest request) { - String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - Integer userId = WebUtil.readIntParam(request, DacoConstants.USER_ID); - Long sessionId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID); + protected ActionForward viewReflection(ActionMapping mapping, HttpServletRequest request) { + String sessionMapID = request.getParameter(DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + Integer userId = WebUtil.readIntParam(request, DacoConstants.USER_ID); + Long sessionId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID); - IDacoService service = getDacoService(); - DacoUser user = service.getUserByUserIdAndSessionId(userId.longValue(), sessionId); - NotebookEntry notebookEntry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, - DacoConstants.TOOL_SIGNATURE, userId); + IDacoService service = getDacoService(); + DacoUser user = service.getUserByUserIdAndSessionId(userId.longValue(), sessionId); + NotebookEntry notebookEntry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL, + DacoConstants.TOOL_SIGNATURE, userId); - MonitoringSummaryUserDTO userDTO = new MonitoringSummaryUserDTO(null, userId, user.getLastName() + " " - + user.getFirstName(), null); - userDTO.setReflectionEntry(notebookEntry.getEntry()); - sessionMap.put(DacoConstants.ATTR_USER, userDTO); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - return mapping.findForward(DacoConstants.SUCCESS); - } + MonitoringSummaryUserDTO userDTO = new MonitoringSummaryUserDTO(null, userId, user.getLastName() + " " + + user.getFirstName(), null); + userDTO.setReflectionEntry(notebookEntry.getEntry()); + sessionMap.put(DacoConstants.ATTR_USER, userDTO); + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + return mapping.findForward(DacoConstants.SUCCESS); + } - private IDacoService getDacoService() { - WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet().getServletContext()); - return (IDacoService) wac.getBean(DacoConstants.DACO_SERVICE); - } + private IDacoService getDacoService() { + WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServlet() + .getServletContext()); + return (IDacoService) wac.getBean(DacoConstants.DACO_SERVICE); + } - protected ActionForward changeView(ActionMapping mapping, HttpServletRequest request) { - String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); + protected ActionForward changeView(ActionMapping mapping, HttpServletRequest request) { + String sessionMapID = WebUtil.readStrParam(request, DacoConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + request.setAttribute(DacoConstants.ATTR_SESSION_MAP_ID, sessionMapID); - String currentView = (String) sessionMap.get(DacoConstants.ATTR_LEARNING_VIEW); - Long userUid = WebUtil.readLongParam(request, DacoConstants.USER_UID, true); - request.setAttribute(DacoConstants.USER_UID, userUid); - if (DacoConstants.LEARNING_VIEW_HORIZONTAL.equals(currentView)) { - sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); - } - else { - sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_HORIZONTAL); - } - return mapping.findForward(DacoConstants.SUCCESS); + String currentView = (String) sessionMap.get(DacoConstants.ATTR_LEARNING_VIEW); + Long userUid = WebUtil.readLongParam(request, DacoConstants.USER_UID, true); + request.setAttribute(DacoConstants.USER_UID, userUid); + if (DacoConstants.LEARNING_VIEW_HORIZONTAL.equals(currentView)) { + sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_VERTICAL); + } else { + sessionMap.put(DacoConstants.ATTR_LEARNING_VIEW, DacoConstants.LEARNING_VIEW_HORIZONTAL); } + return mapping.findForward(DacoConstants.SUCCESS); + } }