Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r14f0555e4fe91e89ebaa9c9e7d29f0666e681437 -rd295cb9148c3c8cbe2e98de79ae41f7eba704fe9 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 14f0555e4fe91e89ebaa9c9e7d29f0666e681437) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision d295cb9148c3c8cbe2e98de79ae41f7eba704fe9) @@ -38,7 +38,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; @@ -1428,13 +1427,9 @@ } @Override - public Optional allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, - Long questionResultUid) { + public Long allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, String answer) { AssessmentQuestion assessmentQuestion = assessmentQuestionDao.getByUid(questionUid); QbQuestion qbQuestion = assessmentQuestion.getQbQuestion(); - AssessmentQuestionResult questionRes = assessmentQuestionResultDao - .getAssessmentQuestionResultByUid(questionResultUid); - String answer = questionRes.getAnswer(); //adding if (previousOptionUid.equals(-1L)) { @@ -1444,7 +1439,7 @@ String name = option.getName(); String[] alternatives = name.split("\r\n"); if (Arrays.asList(alternatives).contains(answer)) { - return Optional.of(option.getUid()); + return option.getUid(); } if (option.getUid().equals(targetOptionUid)) { targetOption = option; @@ -1460,10 +1455,11 @@ log.debug("Adding answer \"" + answer + "\" to option " + targetOptionUid + " in question " + questionUid); } - + return null; } + //removing - else if (targetOptionUid.equals(-1L)) { + if (targetOptionUid.equals(-1L)) { for (QbOption previousOption : qbQuestion.getQbOptions()) { if (previousOption.getUid().equals(previousOptionUid)) { String name = previousOption.getName(); @@ -1482,94 +1478,88 @@ break; } } - + return null; } - //reshuffling inside the same container - do nothing - else if (targetOptionUid.equals(previousOptionUid)) { - } //moving from one to another - else { - for (QbOption targetOption : qbQuestion.getQbOptions()) { - if (targetOption.getUid().equals(targetOptionUid)) { - String name = targetOption.getName(); - name += "\r\n" + answer; - targetOption.setName(name); - assessmentDao.saveObject(targetOption); - break; - } + for (QbOption targetOption : qbQuestion.getQbOptions()) { + if (targetOption.getUid().equals(targetOptionUid)) { + String name = targetOption.getName(); + name += "\r\n" + answer; + targetOption.setName(name); + assessmentDao.saveObject(targetOption); + break; } + } - for (QbOption previousOption : qbQuestion.getQbOptions()) { - if (previousOption.getUid().equals(previousOptionUid)) { - String name = previousOption.getName(); - String[] alternatives = name.split("\r\n"); + for (QbOption previousOption : qbQuestion.getQbOptions()) { + if (previousOption.getUid().equals(previousOptionUid)) { + String name = previousOption.getName(); + String[] alternatives = name.split("\r\n"); - StringBuilder nameWithoutUserAnswer = new StringBuilder(); - for (String alternative : alternatives) { - if (!alternative.equals(answer)) { - nameWithoutUserAnswer.append(alternative).append("\r\n"); - } + StringBuilder nameWithoutUserAnswer = new StringBuilder(); + for (String alternative : alternatives) { + if (!alternative.equals(answer)) { + nameWithoutUserAnswer.append(alternative).append("\r\n"); } - previousOption.setName(nameWithoutUserAnswer.length() > 2 - ? nameWithoutUserAnswer.substring(0, nameWithoutUserAnswer.length() - 2) - : ""); - assessmentDao.saveObject(previousOption); - break; } + previousOption.setName(nameWithoutUserAnswer.length() > 2 + ? nameWithoutUserAnswer.substring(0, nameWithoutUserAnswer.length() - 2) + : ""); + assessmentDao.saveObject(previousOption); + break; } } - assessmentDao.flush(); + return null; + } - //recalculate marks for all lessons in all cases except for reshuffling inside the same container - if (!targetOptionUid.equals(previousOptionUid)) { + @Override + public void recalculateMarksForAllocatedAnswer(Long questionUid, String answer) { + AssessmentQuestion assessmentQuestion = assessmentQuestionDao.getByUid(questionUid); + QbQuestion qbQuestion = assessmentQuestion.getQbQuestion(); + // get all finished user results + List assessmentResults = assessmentResultDao + .getAssessmentResultsByQbQuestionAndAnswer(qbQuestion.getUid(), answer); + //stores userId->lastFinishedAssessmentResult + Map lastFinishedAssessmentResults = new LinkedHashMap<>(); + for (AssessmentResult assessmentResult : assessmentResults) { + Long userId = assessmentResult.getUser().getUserId(); + lastFinishedAssessmentResults.put(userId, assessmentResult); + } - // get all finished user results - List assessmentResults = assessmentResultDao - .getAssessmentResultsByQbQuestionAndAnswer(qbQuestion.getUid(), answer); - //stores userId->lastFinishedAssessmentResult - Map lastFinishedAssessmentResults = new LinkedHashMap<>(); - for (AssessmentResult assessmentResult : assessmentResults) { - Long userId = assessmentResult.getUser().getUserId(); - lastFinishedAssessmentResults.put(userId, assessmentResult); - } + for (AssessmentResult assessmentResult : assessmentResults) { + AssessmentUser user = assessmentResult.getUser(); + float assessmentMark = assessmentResult.getGrade(); + int assessmentMaxMark = assessmentResult.getMaximumGrade(); - for (AssessmentResult assessmentResult : assessmentResults) { - AssessmentUser user = assessmentResult.getUser(); - float assessmentMark = assessmentResult.getGrade(); - int assessmentMaxMark = assessmentResult.getMaximumGrade(); + for (AssessmentQuestionResult questionResult : assessmentResult.getQuestionResults()) { + if (questionResult.getQbQuestion().getUid().equals(qbQuestion.getUid())) { + Float oldQuestionAnswerMark = questionResult.getMark(); + int oldResultMaxMark = questionResult.getMaxMark() == null ? 0 + : questionResult.getMaxMark().intValue(); - for (AssessmentQuestionResult questionResult : assessmentResult.getQuestionResults()) { - if (questionResult.getQbQuestion().getUid().equals(qbQuestion.getUid())) { - Float oldQuestionAnswerMark = questionResult.getMark(); - int oldResultMaxMark = questionResult.getMaxMark() == null ? 0 - : questionResult.getMaxMark().intValue(); + //actually recalculate marks + QuestionDTO questionDto = new QuestionDTO(assessmentQuestion); + questionDto.setMaxMark(oldResultMaxMark); + loadupQuestionResultIntoQuestionDto(questionDto, questionResult); + calculateAnswerMark(assessmentResult.getAssessment().getUid(), user.getUserId(), questionResult, + questionDto); + assessmentQuestionResultDao.saveObject(questionResult); - //actually recalculate marks - QuestionDTO questionDto = new QuestionDTO(assessmentQuestion); - questionDto.setMaxMark(oldResultMaxMark); - loadupQuestionResultIntoQuestionDto(questionDto, questionResult); - calculateAnswerMark(assessmentResult.getAssessment().getUid(), user.getUserId(), questionResult, - questionDto); - assessmentQuestionResultDao.saveObject(questionResult); - - float newQuestionAnswerMark = questionResult.getMark(); - assessmentMark += newQuestionAnswerMark - oldQuestionAnswerMark; - break; - } + float newQuestionAnswerMark = questionResult.getMark(); + assessmentMark += newQuestionAnswerMark - oldQuestionAnswerMark; + break; } - - // store new mark and maxMark if they were changed - AssessmentResult lastFinishedAssessmentResult = lastFinishedAssessmentResults.get(user.getUserId()); - storeAssessmentResultMarkAndMaxMark(assessmentResult, lastFinishedAssessmentResult, assessmentMark, - assessmentMaxMark, user); } - //recalculate marks in all Scratchie activities, that use modified QbQuestion - toolService.recalculateScratchieMarksForVsaQuestion(qbQuestion.getUid()); + // store new mark and maxMark if they were changed + AssessmentResult lastFinishedAssessmentResult = lastFinishedAssessmentResults.get(user.getUserId()); + storeAssessmentResultMarkAndMaxMark(assessmentResult, lastFinishedAssessmentResult, assessmentMark, + assessmentMaxMark, user); } - return Optional.empty(); + //recalculate marks in all Scratchie activities, that use modified QbQuestion + toolService.recalculateScratchieMarksForVsaQuestion(qbQuestion.getUid()); } @Override Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r36716004da333fcc5eb3f776801e3e5278719fd7 -rd295cb9148c3c8cbe2e98de79ae41f7eba704fe9 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 36716004da333fcc5eb3f776801e3e5278719fd7) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision d295cb9148c3c8cbe2e98de79ae41f7eba704fe9) @@ -28,7 +28,6 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import org.lamsfoundation.lams.learningdesign.Grouping; @@ -435,10 +434,14 @@ * @return if present, it contains optionUid of the option group containing duplicate (added there presumably by * another teacher working in parallel) */ - Optional allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, - Long questionResultUid); + Long allocateAnswerToOption(Long questionUid, Long targetOptionUid, Long previousOptionUid, String answer); /** + * Recalculate learners' marks after a VSA answer was allocated as correct or incorrect. + */ + void recalculateMarksForAllocatedAnswer(Long questionUid, String answer); + + /** * For export purposes * * @param contentId Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java =================================================================== diff -u -re6142a9f2ef0dec2fb113f4da5f10ad13b9cf582 -rd295cb9148c3c8cbe2e98de79ae41f7eba704fe9 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision e6142a9f2ef0dec2fb113f4da5f10ad13b9cf582) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision d295cb9148c3c8cbe2e98de79ae41f7eba704fe9) @@ -36,7 +36,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.TimeZone; import java.util.TreeMap; @@ -298,7 +297,9 @@ public String allocateUserAnswer(HttpServletRequest request, HttpServletResponse response, @RequestParam Long questionUid, @RequestParam Long targetOptionUid, @RequestParam Long previousOptionUid, @RequestParam Long questionResultUid) { - Optional optionUid = null; + + AssessmentQuestionResult questionRes = service.getAssessmentQuestionResultByUid(questionResultUid); + String answer = questionRes.getAnswer(); /* * We need to synchronise this operation. * When multiple requests are made to modify the same option, for example to add a VSA answer, @@ -315,14 +316,19 @@ * If teachers allocate answers on different LAMS servers, * we can still get the same problem. We will need a more sophisticated solution then. */ + Long optionUid = null; synchronized (service) { - optionUid = service.allocateAnswerToOption(questionUid, targetOptionUid, previousOptionUid, - questionResultUid); + optionUid = service.allocateAnswerToOption(questionUid, targetOptionUid, previousOptionUid, answer); } + //recalculate marks for all lessons in all cases except for reshuffling inside the same container + if (!targetOptionUid.equals(previousOptionUid)) { + service.recalculateMarksForAllocatedAnswer(questionUid, answer); + } + ObjectNode responseJSON = JsonNodeFactory.instance.objectNode(); - responseJSON.put("isAnswerDuplicated", optionUid.isPresent()); - responseJSON.put("optionUid", optionUid.orElse(-1L)); + responseJSON.put("isAnswerDuplicated", optionUid != null); + responseJSON.put("optionUid", optionUid == null ? -1 : optionUid); response.setContentType("application/json;charset=utf-8"); return responseJSON.toString(); }