Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rb2b30128caf5d566df4932050f02b91e8404fc7b -r41e55fa07dd5f8c94e8b719b53d59a8debca4e44 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision b2b30128caf5d566df4932050f02b91e8404fc7b) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 41e55fa07dd5f8c94e8b719b53d59a8debca4e44) @@ -402,15 +402,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); @@ -423,13 +424,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; @@ -444,7 +463,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 @@ -509,43 +528,27 @@ */ private float storeUserAnswer(AssessmentResult assessmentResult, AssessmentQuestion question, boolean isAutosave) { - AssessmentQuestionResult questionAnswer = null; + AssessmentQuestionResult questionResult = null; // get questionResult from DB instance of AssessmentResult - for (AssessmentQuestionResult dbQuestionAnswer : assessmentResult.getQuestionResults()) { - if (question.getUid().equals(dbQuestionAnswer.getAssessmentQuestion().getUid())) { - questionAnswer = dbQuestionAnswer; + for (AssessmentQuestionResult questionResultIter : assessmentResult.getQuestionResults()) { + if (question.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) { + questionResult = questionResultIter; } } - // create new questionAnswer if it's nonexistent - if (questionAnswer == null) { - questionAnswer = new AssessmentQuestionResult(); - questionAnswer.setAssessmentQuestion(question); - questionAnswer.setAssessmentResult(assessmentResult); - - Set optionAnswers = questionAnswer.getOptionAnswers(); - for (AssessmentQuestionOption option : question.getOptions()) { - AssessmentOptionAnswer optionAnswer = new AssessmentOptionAnswer(); - optionAnswer.setOptionUid(option.getUid()); - optionAnswers.add(optionAnswer); - } - - assessmentQuestionResultDao.saveObject(questionAnswer); - } - // store question answer values - questionAnswer.setAnswerBoolean(question.getAnswerBoolean()); - questionAnswer.setAnswerFloat(question.getAnswerFloat()); - questionAnswer.setAnswerString(question.getAnswerString()); + questionResult.setAnswerBoolean(question.getAnswerBoolean()); + questionResult.setAnswerFloat(question.getAnswerFloat()); + questionResult.setAnswerString(question.getAnswerString()); int j = 0; for (AssessmentQuestionOption option : question.getOptions()) { - // get optionAnswer from questionAnswer + // find according optionAnswer AssessmentOptionAnswer optionAnswer = null; - for (AssessmentOptionAnswer dbOptionAnswer : questionAnswer.getOptionAnswers()) { - if (option.getUid().equals(dbOptionAnswer.getOptionUid())) { - optionAnswer = dbOptionAnswer; + for (AssessmentOptionAnswer optionAnswerIter : questionResult.getOptionAnswers()) { + if (option.getUid().equals(optionAnswerIter.getOptionUid())) { + optionAnswer = optionAnswerIter; } } @@ -604,7 +607,7 @@ if (isAnswerCorrect) { mark = option.getGrade() * maxMark; - questionAnswer.setSubmittedOptionUid(option.getUid()); + questionResult.setSubmittedOptionUid(option.getUid()); break; } } @@ -645,7 +648,7 @@ } if (isAnswerCorrect) { mark = option.getGrade() * maxMark; - questionAnswer.setSubmittedOptionUid(option.getUid()); + questionResult.setSubmittedOptionUid(option.getUid()); break; } } @@ -682,7 +685,7 @@ // we start calculating and storing marks only in case it's not an autosave request if (!isAutosave) { - questionAnswer.setFinishDate(new Date()); + questionResult.setFinishDate(new Date()); if (mark > maxMark) { mark = maxMark; @@ -706,16 +709,16 @@ if (penalty > maxMark) { penalty = maxMark; } - questionAnswer.setPenalty(penalty); + questionResult.setPenalty(penalty); // don't let penalty make mark less than 0 if (mark < 0) { mark = 0; } } - questionAnswer.setMark(mark); - questionAnswer.setMaxMark(maxMark); + questionResult.setMark(mark); + questionResult.setMaxMark(maxMark); // for displaying purposes in case of submitSingleMarkHedgingQuestion() Ajax call question.setMark(mark); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -rdb4bd53f341896f8d1087dda549c89b3ab785ede -r41e55fa07dd5f8c94e8b719b53d59a8debca4e44 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision db4bd53f341896f8d1087dda549c89b3ab785ede) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 41e55fa07dd5f8c94e8b719b53d59a8debca4e44) @@ -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 -r33a5ad24fad4e3e2d3d8f0c67d88ccb5167affe7 -r41e55fa07dd5f8c94e8b719b53d59a8debca4e44 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision 33a5ad24fad4e3e2d3d8f0c67d88ccb5167affe7) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision 41e55fa07dd5f8c94e8b719b53d59a8debca4e44) @@ -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();