Index: lams_common/src/java/org/lamsfoundation/lams/qb/QbUtils.java =================================================================== diff -u -reebd98dce318486b1b04b5d683404622517af1e8 -rb0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e --- lams_common/src/java/org/lamsfoundation/lams/qb/QbUtils.java (.../QbUtils.java) (revision eebd98dce318486b1b04b5d683404622517af1e8) +++ lams_common/src/java/org/lamsfoundation/lams/qb/QbUtils.java (.../QbUtils.java) (revision b0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e) @@ -90,14 +90,21 @@ } public static String normaliseVSAnswer(String answer) { - return StringUtils.isBlank(answer) ? null : answer.replaceAll(VSA_ANSWER_NORMALISE_JAVA_REG_EXP, ""); + if (StringUtils.isBlank(answer)) { + return null; + } + String normalisedAnswer = answer.replaceAll(VSA_ANSWER_NORMALISE_JAVA_REG_EXP, ""); + if (StringUtils.isBlank(normalisedAnswer)) { + return null; + } + return normalisedAnswer; } public static Set normaliseVSOption(String option) { return StringUtils.isBlank(option) ? Set.of() : Stream.of(option.split(VSA_ANSWER_DELIMITER)).filter(StringUtils::isNotBlank) - .collect(Collectors.mapping(answer -> QbUtils.normaliseVSAnswer(answer), - Collectors.toCollection(LinkedHashSet::new))); + .map(answer -> QbUtils.normaliseVSAnswer(answer)).filter(StringUtils::isNotBlank) + .collect(Collectors.toCollection(LinkedHashSet::new)); } public static boolean isVSAnswerAllocated(String option, String normalisedAnswer, boolean isCaseSensitive) { @@ -115,11 +122,11 @@ * is an accumulator for unallocated answers so they do not appear in VSA allocation UI twice */ public static boolean isVSAnswerAllocated(QbQuestion qbQuestion, String answer, Set notAllocatedAnswers) { - if (StringUtils.isBlank(answer)) { + String normalisedAnswer = QbUtils.normaliseVSAnswer(answer); + if (StringUtils.isBlank(normalisedAnswer)) { return false; } - String normalisedAnswer = QbUtils.normaliseVSAnswer(answer); boolean isQuestionCaseSensitive = qbQuestion.isCaseSensitive(); boolean isAnswerAllocated = false; Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java =================================================================== diff -u -ra75227caf7b39b015d53b73a473bc23738a04bdd -rb0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e --- lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision a75227caf7b39b015d53b73a473bc23738a04bdd) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision b0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e) @@ -816,7 +816,7 @@ public Long allocateVSAnswerToOption(Long toolQuestionUid, Long targetOptionUid, Long previousOptionUid, String answer) { String normalisedAnswer = QbUtils.normaliseVSAnswer(answer); - if (normalisedAnswer == null) { + if (normalisedAnswer == null && previousOptionUid.equals(-1L)) { return null; } answer = answer.strip(); @@ -862,7 +862,7 @@ Set nameWithoutUserAnswer = new LinkedHashSet<>(List.of(alternatives)); nameWithoutUserAnswer.remove(answer); name = nameWithoutUserAnswer.isEmpty() ? "" - : nameWithoutUserAnswer.stream().filter(StringUtils::isNotBlank) + : nameWithoutUserAnswer.stream().filter(a -> QbUtils.normaliseVSAnswer(a) != null) .collect(Collectors.joining(QbUtils.VSA_ANSWER_DELIMITER)); previousOption.setName(name); qbDAO.update(previousOption); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -re86ecac93af30898767242820d67e55fa14c9600 -rb0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision e86ecac93af30898767242820d67e55fa14c9600) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision b0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e) @@ -1437,7 +1437,7 @@ for (AssessmentQuestionResult questionResult : allQuestionResults) { String answer = questionResult.getAnswer(); - if (StringUtils.isBlank(answer)) { + if (QbUtils.normaliseVSAnswer(answer) == null) { continue; } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -rf6247c953cc7bf9a17d4025ea8e8728ae55c11ed -rb0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision f6247c953cc7bf9a17d4025ea8e8728ae55c11ed) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision b0a4fbc85e1574ef3efe06a1020b84e2d7c7a75e) @@ -629,7 +629,7 @@ List visitLogs = scratchieAnswerVisitDao.getVsaLogsByItem(item.getUid()); for (ScratchieAnswerVisitLog visitLog : visitLogs) { String answer = visitLog.getAnswer(); - if (StringUtils.isBlank(answer)) { + if (QbUtils.normaliseVSAnswer(answer) == null) { continue; }