Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rf4a7078c373180ac9d6a5887366241bda9f3e719 -r3cdcf7089fbe6ff974365dfc3bde433fcd89429d --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision f4a7078c373180ac9d6a5887366241bda9f3e719) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 3cdcf7089fbe6ff974365dfc3bde433fcd89429d) @@ -402,9 +402,31 @@ // don't instantiate new attempt if the previous one wasn't finished and thus continue working with it if (lastResult.getFinishDate() == null) { + + //check all required questionResults exist, it can be missing in case of random question - create new one then + Set questionResults = lastResult.getQuestionResults(); + Set updatedQuestionResults = new TreeSet(new AssessmentQuestionResultComparator()); + for (Set questionsForOnePage : pagedQuestions) { + for (AssessmentQuestion question : questionsForOnePage) { + + // get questionResult from DB instance of AssessmentResult + AssessmentQuestionResult questionResult = null; + for (AssessmentQuestionResult questionResultIter : questionResults) { + if (question.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) { + questionResult = questionResultIter; + } + } + if (questionResult == null) { + questionResult = createQuestionResultObject(question); + } + updatedQuestionResults.add(questionResult); + } + } + lastResult.setQuestionResults(updatedQuestionResults); + assessmentResultDao.saveObject(lastResult); return; - // mark previous attempt as being not the latest any longer + // mark previous attempt as being not the latest any longer } else { lastResult.setLatest(false); assessmentResultDao.saveObject(lastResult); @@ -422,23 +444,34 @@ Set questionResults = result.getQuestionResults(); for (Set questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { - AssessmentQuestionResult questionResult = new AssessmentQuestionResult(); - questionResult.setAssessmentQuestion(question); + AssessmentQuestionResult questionResult = createQuestionResultObject(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); } + + /* Auiliary method for setAttemptStarted(). Simply init new AssessmentQuestionResult object and fills it in with values. + * @param question + * @param questionResults + * @return + */ + private AssessmentQuestionResult createQuestionResultObject(AssessmentQuestion question) { + AssessmentQuestionResult questionResult = new AssessmentQuestionResult(); + questionResult.setAssessmentQuestion(question); + // 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); + } + + return questionResult; + } + @Override public boolean storeUserAnswers(Long assessmentUid, Long userId, List> pagedQuestions, Long singleMarkHedgingQuestionUid, boolean isAutosave) {