Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r347569bcf8c86a502e240c5e906a14b1b37fd1f6 -rd79f11a931afed7c73eff3049967bdb1d312ece3 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 347569bcf8c86a502e240c5e906a14b1b37fd1f6) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision d79f11a931afed7c73eff3049967bdb1d312ece3) @@ -399,15 +399,16 @@ } @Override - public void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId) { + public void setAttemptStarted(Assessment assessment, List> pagedQuestions, + AssessmentUser assessmentUser, Long toolSessionId) { AssessmentResult lastResult = getLastAssessmentResult(assessment.getUid(), assessmentUser.getUserId()); if (lastResult != null) { // don't instantiate new attempt if the previous one wasn't finished and thus continue working with it if (lastResult.getFinishDate() == null) { return; - // mark previous attempt as not the latest anymore + // mark previous attempt as being not the latest any longer } else { lastResult.setLatest(false); assessmentResultDao.saveObject(lastResult); @@ -420,13 +421,31 @@ result.setSessionId(toolSessionId); result.setStartDate(new Timestamp(new Date().getTime())); result.setLatest(true); + + // create questionResult for each question + Set questionResults = result.getQuestionResults(); + for (Set questionsForOnePage : pagedQuestions) { + for (AssessmentQuestion question : questionsForOnePage) { + AssessmentQuestionResult questionResult = new AssessmentQuestionResult(); + questionResult.setAssessmentQuestion(question); + questionResults.add(questionResult); + + // create optionAnswer for each option + Set optionAnswers = questionResult.getOptionAnswers(); + for (AssessmentQuestionOption option : question.getOptions()) { + AssessmentOptionAnswer optionAnswer = new AssessmentOptionAnswer(); + optionAnswer.setOptionUid(option.getUid()); + optionAnswers.add(optionAnswer); + } + } + } + assessmentResultDao.saveObject(result); } @Override - public boolean storeUserAnswers(Long assessmentUid, Long userId, - ArrayList> pagedQuestions, Long singleMarkHedgingQuestionUid, - boolean isAutosave) { + public boolean storeUserAnswers(Long assessmentUid, Long userId, List> pagedQuestions, + Long singleMarkHedgingQuestionUid, boolean isAutosave) { int maximumGrade = 0; float grade = 0; @@ -441,7 +460,7 @@ } // store all answers (in all pages) - for (LinkedHashSet questionsForOnePage : pagedQuestions) { + for (Set questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { // in case single MarkHedging question needs to be stored -- search for that question @@ -508,28 +527,12 @@ AssessmentQuestionResult questionResult = null; // get questionResult from DB instance of AssessmentResult - for (AssessmentQuestionResult dbQuestionAnswer : assessmentResult.getQuestionResults()) { - if (question.getUid().equals(dbQuestionAnswer.getAssessmentQuestion().getUid())) { - questionResult = dbQuestionAnswer; + for (AssessmentQuestionResult questionResultIter : assessmentResult.getQuestionResults()) { + if (question.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) { + questionResult = questionResultIter; } } - // create new questionAnswer if it's nonexistent - if (questionResult == null) { - questionResult = new AssessmentQuestionResult(); - questionResult.setAssessmentQuestion(question); - questionResult.setAssessmentResult(assessmentResult); - - Set optionAnswers = questionResult.getOptionAnswers(); - for (AssessmentQuestionOption option : question.getOptions()) { - AssessmentOptionAnswer optionAnswer = new AssessmentOptionAnswer(); - optionAnswer.setOptionUid(option.getUid()); - optionAnswers.add(optionAnswer); - } - - assessmentQuestionResultDao.saveObject(questionResult); - } - // store question answer values questionResult.setAnswerBoolean(question.getAnswerBoolean()); questionResult.setAnswerFloat(question.getAnswerFloat()); @@ -538,11 +541,11 @@ int j = 0; for (AssessmentQuestionOption option : question.getOptions()) { - // get optionAnswer from questionAnswer + // find according optionAnswer AssessmentOptionAnswer optionAnswer = null; - for (AssessmentOptionAnswer dbOptionAnswer : questionResult.getOptionAnswers()) { - if (option.getUid().equals(dbOptionAnswer.getOptionUid())) { - optionAnswer = dbOptionAnswer; + for (AssessmentOptionAnswer optionAnswerIter : questionResult.getOptionAnswers()) { + if (option.getUid().equals(optionAnswerIter.getOptionUid())) { + optionAnswer = optionAnswerIter; } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r347569bcf8c86a502e240c5e906a14b1b37fd1f6 -rd79f11a931afed7c73eff3049967bdb1d312ece3 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 347569bcf8c86a502e240c5e906a14b1b37fd1f6) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision d79f11a931afed7c73eff3049967bdb1d312ece3) @@ -183,7 +183,8 @@ * * @param assessmentResult */ - void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId); + void setAttemptStarted(Assessment assessment, List> pagedQuestions, + AssessmentUser assessmentUser, Long toolSessionId); /** * Store user answers into DB. It can be autosave and non-autosave requests. @@ -196,9 +197,8 @@ * * @return whether storing results is allowed, false otherwise */ - boolean storeUserAnswers(Long assessmentUid, Long userId, - ArrayList> pagedQuestions, Long singleMarkHedgingQuestionUid, - boolean isAutosave); + boolean storeUserAnswers(Long assessmentUid, Long userId, List> pagedQuestions, + Long singleMarkHedgingQuestionUid, boolean isAutosave); /** * Return the latest result (it can be unfinished). Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java =================================================================== diff -u -r613b476be08c495e3da27743a90b9b932782179a -rd79f11a931afed7c73eff3049967bdb1d312ece3 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision 613b476be08c495e3da27743a90b9b932782179a) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision d79f11a931afed7c73eff3049967bdb1d312ece3) @@ -294,25 +294,25 @@ } //sort questions - LinkedList questionList = new LinkedList(); + LinkedList questions = new LinkedList(); for (QuestionReference questionReference : questionReferences) { AssessmentQuestion question = questionToReferenceMap.get(questionReference.getUid()); - // becuase in webpage will use this login name. Here is just initialize it to avoid session close error in proxy object. + // initialize login name to avoid session close error in proxy object when displaying on a webpage if (question.getCreateBy() != null) { question.getCreateBy().getLoginName(); } question.setGrade(questionReference.getDefaultGrade()); - questionList.add(question); + questions.add(question); } // shuffling if (assessment.isShuffled()) { - ArrayList shuffledList = new ArrayList(questionList); + ArrayList shuffledList = new ArrayList(questions); Collections.shuffle(shuffledList); - questionList = new LinkedList(shuffledList); + questions = new LinkedList(shuffledList); } - for (AssessmentQuestion question : questionList) { + for (AssessmentQuestion question : questions) { if (question.isShuffle() || (question.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING)) { ArrayList shuffledList = new ArrayList(question.getOptions()); Collections.shuffle(shuffledList); @@ -325,23 +325,17 @@ } } - //setAttemptStarted - if (!finishedLock && hasEditRight) { - service.setAttemptStarted(assessment, assessmentUser, toolSessionId); - } - //paging - ArrayList> pagedQuestions = new ArrayList>(); + List> pagedQuestions = new ArrayList>(); int maxQuestionsPerPage = ((assessment.getQuestionsPerPage() != 0) && hasEditRight) ? assessment.getQuestionsPerPage() - : questionList.size(); + : questions.size(); LinkedHashSet questionsForOnePage = new LinkedHashSet(); pagedQuestions.add(questionsForOnePage); - int count = 0; - for (AssessmentQuestion question : questionList) { + for (AssessmentQuestion question : questions) { questionsForOnePage.add(question); count++; - if ((questionsForOnePage.size() == maxQuestionsPerPage) && (count != questionList.size())) { + if ((questionsForOnePage.size() == maxQuestionsPerPage) && (count != questions.size())) { questionsForOnePage = new LinkedHashSet(); pagedQuestions.add(questionsForOnePage); } @@ -352,6 +346,11 @@ sessionMap.put(AssessmentConstants.ATTR_PAGE_NUMBER, 1); sessionMap.put(AssessmentConstants.ATTR_ASSESSMENT, assessment); + //set attempt started + if (!finishedLock && hasEditRight) { + service.setAttemptStarted(assessment, pagedQuestions, assessmentUser, toolSessionId); + } + // loadupLastAttempt for display purpose loadupLastAttempt(sessionMap); @@ -414,9 +413,9 @@ } int questionNumberingOffset = 0; - ArrayList> pagedQuestions = (ArrayList>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + List> pagedQuestions = (List>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); for (int i = 0; i < pageNumber-1; i++) { - LinkedHashSet questionsForOnePage = pagedQuestions.get(i); + Set questionsForOnePage = pagedQuestions.get(i); questionNumberingOffset += questionsForOnePage.size(); } sessionMap.put(AssessmentConstants.ATTR_QUESTION_NUMBERING_OFFSET, ++questionNumberingOffset); @@ -433,7 +432,7 @@ HttpServletResponse response) throws ServletException { String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - ArrayList> pagedQuestions = (ArrayList>) sessionMap + List> pagedQuestions = (List>) sessionMap .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); Assessment assessment = (Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT); Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId(); @@ -454,7 +453,7 @@ //find according question in order to get its mark AssessmentQuestion question = null; - for (LinkedHashSet questionsForOnePage : pagedQuestions) { + for (Set questionsForOnePage : pagedQuestions) { for (AssessmentQuestion questionIter : questionsForOnePage) { if (questionIter.getUid().equals(singleMarkHedgingQuestionUid)) { question = questionIter; @@ -532,18 +531,23 @@ } /** - * Display same entire authoring page content from HttpSession variable. + * User pressed Resubmit button. */ private ActionForward resubmit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException { + 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); Long toolSessionId = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_SESSION_ID); AssessmentUser assessmentUser = (AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER); - IAssessmentService service = getAssessmentService(); - service.setAttemptStarted(assessment, assessmentUser, toolSessionId); + //set attempt started: create a new one + mark previous as not being the latest any longer + List> pagedQuestions = (List>) sessionMap + .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + service.setAttemptStarted(assessment, pagedQuestions, assessmentUser, toolSessionId); + sessionMap.put(AssessmentConstants.ATTR_FINISHED_LOCK, false); sessionMap.put(AssessmentConstants.ATTR_PAGE_NUMBER, 1); sessionMap.put(AssessmentConstants.ATTR_QUESTION_NUMBERING_OFFSET, 1); @@ -601,8 +605,8 @@ String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); int pageNumber = (Integer) sessionMap.get(AssessmentConstants.ATTR_PAGE_NUMBER); - ArrayList> pagedQuestions = (ArrayList>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); - LinkedHashSet questionsForOnePage = pagedQuestions.get(pageNumber-1); + List> pagedQuestions = (List>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + Set questionsForOnePage = pagedQuestions.get(pageNumber-1); Long questionUid = new Long(request.getParameter(AssessmentConstants.PARAM_QUESTION_UID)); AssessmentQuestion question = null; @@ -727,8 +731,8 @@ String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); int pageNumber = (Integer) sessionMap.get(AssessmentConstants.ATTR_PAGE_NUMBER); - ArrayList> pagedQuestions = (ArrayList>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); - LinkedHashSet questionsForOnePage = pagedQuestions.get(pageNumber-1); + List> pagedQuestions = (List>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + Set questionsForOnePage = pagedQuestions.get(pageNumber-1); for (int i = 0; i < questionsForOnePage.size(); i++) { Long assessmentQuestionUid = WebUtil.readLongParam(request, AssessmentConstants.PARAM_QUESTION_UID + i); @@ -821,7 +825,7 @@ */ private int validateAnswers(SessionMap sessionMap){ - ArrayList> pagedQuestions = (ArrayList>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + List> pagedQuestions = (List>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); //array of missing required questions boolean isAllQuestionsAnswered = true; @@ -830,7 +834,7 @@ //iterate through all pages to find first that contains missing required questions int pageCount; for (pageCount = 0; pageCount < pagedQuestions.size(); pageCount++) { - LinkedHashSet questionsForOnePage = pagedQuestions.get(pageCount); + Set questionsForOnePage = pagedQuestions.get(pageCount); for (AssessmentQuestion question : questionsForOnePage) { int questionType = question.getType(); @@ -913,15 +917,15 @@ * Prepare data for displaying results page */ private void prepareResultsPageData(SessionMap sessionMap){ - ArrayList> pagedQuestions = (ArrayList>) sessionMap + List> pagedQuestions = (List>) sessionMap .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); Assessment assessment = (Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT); Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId(); IAssessmentService service = getAssessmentService(); //release object from the cache (it's required when we have modified result object in the same request) AssessmentResult result = service.getLastFinishedAssessmentResultNotFromChache(assessment.getUid(), userId); - for (LinkedHashSet questionsForOnePage : pagedQuestions) { + for (Set questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { //find corresponding questionResult @@ -982,7 +986,7 @@ private void loadupLastAttempt(SessionMap sessionMap){ IAssessmentService service = getAssessmentService(); - ArrayList> pagedQuestions = (ArrayList>) sessionMap + List> pagedQuestions = (List>) sessionMap .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); Long assessmentUid = ((Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT)).getUid(); Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId(); @@ -999,7 +1003,7 @@ lastFinishedResult = service.getLastFinishedAssessmentResult(assessmentUid, userId); } - for(LinkedHashSet questionsForOnePage : pagedQuestions) { + for(Set questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { //load last finished results for hedging type of questions (in order to prevent retry) @@ -1047,8 +1051,8 @@ * Store user answers in DB in last unfinished attempt and notify teachers about it. */ private boolean storeUserAnswersIntoDatabase(SessionMap sessionMap, boolean isAutosave) { - - ArrayList> pagedQuestions = (ArrayList>) sessionMap + + List> pagedQuestions = (List>) sessionMap .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); Long assessmentUid = ((Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT)).getUid(); Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId();