Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java =================================================================== diff -u -rd154d92adbc4d7f3f3906fa918af4227a69ee403 -re0f0bfaf1b029e6241352c307a86381e9c5faf42 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision d154d92adbc4d7f3f3906fa918af4227a69ee403) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision e0f0bfaf1b029e6241352c307a86381e9c5faf42) @@ -67,7 +67,6 @@ import org.lamsfoundation.lams.tool.assessment.model.AssessmentOptionAnswer; import org.lamsfoundation.lams.tool.assessment.model.AssessmentOverallFeedback; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion; -import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionOption; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession; @@ -135,6 +134,10 @@ if (param.equals("checkLeaderProgress")) { return checkLeaderProgress(mapping, form, request, response); } + if (param.equals("getSecondsLeft")) { + return getSecondsLeft(mapping, form, request, response); + } + // ================ Reflection ======================= if (param.equals("newReflection")) { return newReflection(mapping, form, request, response); @@ -293,7 +296,7 @@ //time limit boolean isTimeLimitEnabled = hasEditRight && !showResults && assessment.getTimeLimit() != 0; long secondsLeft = isTimeLimitEnabled ? service.getSecondsLeft(assessment, user) : 0; - request.setAttribute(AssessmentConstants.ATTR_SECONDS_LEFT, secondsLeft); + sessionMap.put(AssessmentConstants.ATTR_SECONDS_LEFT, secondsLeft); boolean isTimeLimitNotLaunched = (lastResult == null) || (lastResult.getTimeLimitLaunchedDate() == null); sessionMap.put(AssessmentConstants.ATTR_IS_TIME_LIMIT_NOT_LAUNCHED, isTimeLimitNotLaunched); @@ -489,7 +492,7 @@ storeUserAnswersIntoDatabase(sessionMap, true); long secondsLeft = service.getSecondsLeft(assessment, user); - request.setAttribute(AssessmentConstants.ATTR_SECONDS_LEFT, secondsLeft); + sessionMap.put(AssessmentConstants.ATTR_SECONDS_LEFT, secondsLeft); // use redirect to prevent form resubmission ActionRedirect redirect = new ActionRedirect(mapping.findForwardConfig(AssessmentConstants.LEARNING)); @@ -500,6 +503,32 @@ } /** + * Ajax call to get the remaining seconds. Needed when the page is reloaded in the browser to check with the server + * what the current values should be! Otherwise the learner can keep hitting reload after a page change or submit + * all (when questions are spread across pages) and increase their time! + * @return + * @throws JSONException + * @throws IOException + */ + private ActionForward getSecondsLeft(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) + throws ServletException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, JSONException, IOException { + + IAssessmentService service = getAssessmentService(); + String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + Assessment assessment = (Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT); + AssessmentUser user = (AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER); + long secondsLeft = service.getSecondsLeft(assessment, user); + JSONObject JSONObject = new JSONObject(); + JSONObject.put(AssessmentConstants.ATTR_SECONDS_LEFT, secondsLeft); + response.setContentType("application/x-json;charset=utf-8"); + response.getWriter().print(JSONObject); + return null; + } + + /** * Handling submittion of MarkHedging type of Questions (in case of leader aware tool). * @throws NoSuchMethodException * @throws InvocationTargetException @@ -641,7 +670,7 @@ // time limit feature sessionMap.put(AssessmentConstants.ATTR_IS_TIME_LIMIT_NOT_LAUNCHED, true); - request.setAttribute(AssessmentConstants.ATTR_SECONDS_LEFT, assessment.getTimeLimit() * 60); + sessionMap.put(AssessmentConstants.ATTR_SECONDS_LEFT, assessment.getTimeLimit() * 60); return mapping.findForward(AssessmentConstants.LEARNING); } @@ -1013,15 +1042,18 @@ if ((questionDto.getType() == AssessmentConstants.QUESTION_TYPE_ESSAY) && (questionDto.getMinWordsLimit() > 0)) { - String answer = new String(questionDto.getAnswerString()); - - boolean isMinWordsLimitReached = ValidationUtil.isMinWordsLimitReached(answer, - questionDto.getMinWordsLimit(), questionDto.isAllowRichEditor()); - - // check min words limit is reached - if (!isMinWordsLimitReached) { + if ( questionDto.getAnswerString() == null ) { isAllQuestionsReachedMinWordsLimit = false; break; + + } else { + boolean isMinWordsLimitReached = ValidationUtil.isMinWordsLimitReached(questionDto.getAnswerString(), + questionDto.getMinWordsLimit(), questionDto.isAllowRichEditor()); + // check min words limit is reached + if (!isMinWordsLimitReached) { + isAllQuestionsReachedMinWordsLimit = false; + break; + } } } Index: lams_tool_assessment/web/pages/learning/learning.jsp =================================================================== diff -u -r839af8b148458fd7202f178fb52274dca01fc090 -re0f0bfaf1b029e6241352c307a86381e9c5faf42 --- lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision 839af8b148458fd7202f178fb52274dca01fc090) +++ lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision e0f0bfaf1b029e6241352c307a86381e9c5faf42) @@ -20,6 +20,7 @@ + @@ -153,7 +154,18 @@ }, description: "
" }); - } + + <%-- double check if we have the correct number of seconds left in case user has clicked refresh --%> + $.ajax({ + url: '', + data: 'sessionMapID=${sessionMapID}', + dataType: 'json', + type: 'post', + success: function (json) { + $('#countdown').countdown('option', 'until', json.secondsLeft+'S'); + } + }); + } //autosave feature