Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r7b01f2faaa0d72d872e4624687e4c269b8bf522a -r3004d09a72bb86597e40ef2277e1e158b6b62b0a --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 7b01f2faaa0d72d872e4624687e4c269b8bf522a) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 3004d09a72bb86597e40ef2277e1e158b6b62b0a) @@ -475,8 +475,16 @@ } @Override - public void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId) { - Set questions = assessment.getQuestions(); + public void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId, + List> pagedQuestionDtos) { + //create list of all questions that user is going to answer (it will exclude random questions that user not going to answer) + Set questions = new TreeSet<>(); + for (Set questionsForOnePage : pagedQuestionDtos) { + for (QuestionDTO questionDto : questionsForOnePage) { + AssessmentQuestion question = assessmentQuestionDao.getByUid(questionDto.getUid()); + questions.add(question); + } + } AssessmentResult lastResult = getLastAssessmentResult(assessment.getUid(), assessmentUser.getUserId()); if (lastResult != null) { Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -rf9c66e78afa51f175afcaf22ee81f9b3460afea8 -r3004d09a72bb86597e40ef2277e1e158b6b62b0a --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision f9c66e78afa51f175afcaf22ee81f9b3460afea8) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 3004d09a72bb86597e40ef2277e1e158b6b62b0a) @@ -227,11 +227,10 @@ List getSessionsByContentId(Long toolContentId); /** - * Save or update assessment result. - * - * @param assessmentResult + * Create new assessment result object. */ - void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId); + void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId, + List> pagedQuestionDtos); void storeSingleMarkHedgingQuestion(Assessment assessment, Long userId, List> pagedQuestions, Long singleMarkHedgingQuestionUid) Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java =================================================================== diff -u -r2b3d3b2f61d37cf2fa7cccc0cf4565e5dfc4b88e -r3004d09a72bb86597e40ef2277e1e158b6b62b0a --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 2b3d3b2f61d37cf2fa7cccc0cf4565e5dfc4b88e) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 3004d09a72bb86597e40ef2277e1e158b6b62b0a) @@ -26,11 +26,11 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; @@ -46,7 +46,6 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.lamsfoundation.lams.notebook.model.NotebookEntry; @@ -194,29 +193,54 @@ questionReferences.addAll(assessment.getQuestionReferences()); HashMap questionToReferenceMap = new HashMap<>(); + //add non-random questions + for (QuestionReference questionReference : questionReferences) { + if (!questionReference.isRandomQuestion()) { + AssessmentQuestion question = questionReference.getQuestion(); + questionToReferenceMap.put(questionReference.getUid(), question); + } + } + // init random pool questions List availableRandomQuestions = new ArrayList<>(); for (AssessmentQuestion question : assessment.getQuestions()) { if (question.isRandomQuestion()) { availableRandomQuestions.add(question); } } - + //add random questions (actually replacing them with real ones) + AssessmentResult lastResult = service.getLastAssessmentResult(assessment.getUid(), user.getUserId()); for (QuestionReference questionReference : questionReferences) { - //add non-random questions - if (!questionReference.isRandomQuestion()) { - AssessmentQuestion question = questionReference.getQuestion(); - questionToReferenceMap.put(questionReference.getUid(), question); - } - - //add random questions (actually replacing them with real ones) if (questionReference.isRandomQuestion()) { - //pick a random element - Random rand = new Random(System.currentTimeMillis()); - AssessmentQuestion question = (AssessmentQuestion) availableRandomQuestions.toArray()[rand - .nextInt(availableRandomQuestions.size())]; - questionToReferenceMap.put(questionReference.getUid(), question); - availableRandomQuestions.remove(question); + + //find random question that will be shown to the user + AssessmentQuestion randomQuestion = null; + if (lastResult == null) { + //pick element randomly + Random rand = new Random(System.currentTimeMillis()); + randomQuestion = (AssessmentQuestion) availableRandomQuestions.toArray()[rand + .nextInt(availableRandomQuestions.size())]; + availableRandomQuestions.remove(randomQuestion); + + } else { + //pick element from the last result + for (Iterator iter = availableRandomQuestions.iterator(); iter.hasNext();) { + AssessmentQuestion availableRandomQuestion = iter.next(); + + for (AssessmentQuestionResult questionResult : lastResult.getQuestionResults()) { + if (availableRandomQuestion.getUid().equals(questionResult.getQbToolQuestion().getUid())) { + randomQuestion = availableRandomQuestion; + iter.remove(); + break; + } + } + } + } + if (randomQuestion == null) { + throw new RuntimeException("Random question is null. Something went wrong. questionReference's uid:" + + questionReference.getUid()); + } + questionToReferenceMap.put(questionReference.getUid(), randomQuestion); } } @@ -225,7 +249,6 @@ || assessment.isUseSelectLeaderToolOuput() && isUserLeader; //showResults if user has finished the last result - AssessmentResult lastResult = service.getLastAssessmentResult(assessment.getUid(), user.getUserId()); boolean showResults = (lastResult != null) && (lastResult.getFinishDate() != null); // get notebook entry @@ -357,7 +380,7 @@ } else { // set attempt started if (hasEditRight) { - service.setAttemptStarted(assessment, user, toolSessionId); + service.setAttemptStarted(assessment, user, toolSessionId, pagedQuestionDtos); } return "pages/learning/learning"; @@ -587,13 +610,16 @@ ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); Assessment assessment = service.getAssessmentBySessionId(toolSessionId); AssessmentUser assessmentUser = (AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER); + List> pagedQuestionDtos = (List>) sessionMap + .get(AssessmentConstants.ATTR_PAGED_QUESTION_DTOS); + Long userId = assessmentUser.getUserId(); service.unsetSessionFinished(toolSessionId, userId); Date lastAttemptStartingDate = service.getLastAssessmentResult(assessment.getUid(), userId).getStartDate(); - // set attempt started: create a new one + mark previous as not being the latest any longer - service.setAttemptStarted(assessment, assessmentUser, toolSessionId); + // set attempt started: create a new one + mark previous one as not being the latest any longer + service.setAttemptStarted(assessment, assessmentUser, toolSessionId, pagedQuestionDtos); // in case of content was modified in monitor - redirect to start.do in order to refresh info from the DB if (assessment.isContentModifiedInMonitor(lastAttemptStartingDate)) {