Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r3310e8d45579c49d0261682c33ec7d24d0bc65dc -rc145f7087c6e9364a2886db4decbecb02b775ec9 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 3310e8d45579c49d0261682c33ec7d24d0bc65dc) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision c145f7087c6e9364a2886db4decbecb02b775ec9) @@ -848,20 +848,10 @@ // refresh latest answers from DB QbOption qbOption = qbService.getOptionByUid(optionDto.getUid()); optionDto.setName(qbOption.getName()); + boolean isAnswerAllocated = AssessmentEscapeUtils.isVSAnswerAllocated(qbOption.getName(), + normalisedQuestionAnswer, isQuestionCaseSensitive); - Collection optionAnswers = AssessmentEscapeUtils.normaliseVSOption(optionDto.getName()); - boolean isAnswerMatchedCurrentOption = false; - for (String optionAnswer : optionAnswers) { - - // check is item unraveled - if (isQuestionCaseSensitive ? normalisedQuestionAnswer.equals(optionAnswer) - : normalisedQuestionAnswer.equalsIgnoreCase(optionAnswer)) { - isAnswerMatchedCurrentOption = true; - break; - } - } - - if (isAnswerMatchedCurrentOption) { + if (isAnswerAllocated) { mark = optionDto.getMaxMark() * maxMark; questionResult.setQbOption(qbOption); break; @@ -1433,18 +1423,13 @@ continue; } - boolean isAnswerAllocated = false; - String normalisedAnswer = AssessmentEscapeUtils.normaliseVSAnswer(answer); + + boolean isAnswerAllocated = false; for (QbOption option : qbQuestion.getQbOptions()) { - Collection alternatives = AssessmentEscapeUtils.normaliseVSOption(option.getName()); - for (String alternative : alternatives) { - if (isQuestionCaseSensitive ? normalisedAnswer.equals(alternative) - : normalisedAnswer.equalsIgnoreCase(alternative)) { - isAnswerAllocated = true; - break; - } - } + String name = option.getName(); + isAnswerAllocated = AssessmentEscapeUtils.isVSAnswerAllocated(name, normalisedAnswer, + isQuestionCaseSensitive); if (isAnswerAllocated) { break; } @@ -1476,15 +1461,19 @@ AssessmentQuestion assessmentQuestion = assessmentQuestionDao.getByUid(questionUid); QbQuestion qbQuestion = assessmentQuestion.getQbQuestion(); String normalisedAnswer = AssessmentEscapeUtils.normaliseVSAnswer(answer); + if (normalisedAnswer == null) { + return null; + } //adding if (previousOptionUid.equals(-1L)) { //search for duplicates and, if found, return false QbOption targetOption = null; for (QbOption option : qbQuestion.getQbOptions()) { String name = option.getName(); - Collection alternatives = AssessmentEscapeUtils.normaliseVSOption(name); - if (alternatives.contains(normalisedAnswer)) { + boolean isAnswerAllocated = AssessmentEscapeUtils.isVSAnswerAllocated(name, normalisedAnswer, + qbQuestion.isCaseSensitive()); + if (isAnswerAllocated) { return option.getUid(); } if (option.getUid().equals(targetOptionUid)) { Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java =================================================================== diff -u -r3310e8d45579c49d0261682c33ec7d24d0bc65dc -rc145f7087c6e9364a2886db4decbecb02b775ec9 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java (.../AssessmentEscapeUtils.java) (revision 3310e8d45579c49d0261682c33ec7d24d0bc65dc) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java (.../AssessmentEscapeUtils.java) (revision c145f7087c6e9364a2886db4decbecb02b775ec9) @@ -22,6 +22,7 @@ package org.lamsfoundation.lams.tool.assessment.util; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -370,12 +371,21 @@ } public static String normaliseVSAnswer(String answer) { - return answer == null ? null : answer.replaceAll(VSA_ANSWER_NORMALISE_JAVA_REG_EXP, ""); + return StringUtils.isBlank(answer) ? null : answer.replaceAll(VSA_ANSWER_NORMALISE_JAVA_REG_EXP, ""); } public static Set normaliseVSOption(String option) { - return option == null ? Set.of() - : Stream.of(option.split(VSA_ANSWER_DELIMITER)).collect(Collectors - .mapping(answer -> AssessmentEscapeUtils.normaliseVSAnswer(answer), Collectors.toSet())); + return StringUtils.isBlank(option) ? Set.of() + : Stream.of(option.split(VSA_ANSWER_DELIMITER)) + .collect(Collectors.mapping(answer -> AssessmentEscapeUtils.normaliseVSAnswer(answer), + Collectors.toCollection(LinkedHashSet::new))); } + + public static boolean isVSAnswerAllocated(String option, String answer, boolean isCaseSensitive) { + if (StringUtils.isBlank(option) || StringUtils.isBlank(answer)) { + return false; + } + return AssessmentEscapeUtils.normaliseVSOption(option).stream() + .anyMatch(s -> isCaseSensitive ? s.equals(answer) : s.equalsIgnoreCase(answer)); + } } \ No newline at end of file