Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -re6297db8a5d23d423cb997ba7abc60e8524ab87d -r2c97a0be0070d0fc70b7562940ebde3f423dde29 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision e6297db8a5d23d423cb997ba7abc60e8524ab87d) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 2c97a0be0070d0fc70b7562940ebde3f423dde29) @@ -1488,25 +1488,11 @@ } } - if (!targetOptionUid.equals(-1L)) { - if (targetOption == null) { - // front end provided incorrect target option UID - log.error("Target option with UID " + targetOptionUid + " was not found in question with UID " - + questionUid + " to allocate answer " + answer); - return null; - } - - // append new answer to option - String name = targetOption.getName(); - name += AssessmentEscapeUtils.VSA_ANSWER_DELIMITER + answer; - targetOption.setName(name); - assessmentDao.saveObject(targetOption); - assessmentDao.flush(); - - if (log.isInfoEnabled()) { - log.info("Allocated VS answer \"" + answer + "\" to option " + targetOptionUid + " in question " - + questionUid); - } + if (!targetOptionUid.equals(-1L) && targetOption == null) { + // front end provided incorrect target option UID + log.error("Target option with UID " + targetOptionUid + " was not found in question with UID " + questionUid + + " to allocate answer " + answer); + return null; } // remove from already allocated option @@ -1528,6 +1514,28 @@ } } + if (targetOption != null) { + String name = targetOption.getName(); + + boolean isAnswerAllocated = AssessmentEscapeUtils.isVSAnswerAllocated(name, normalisedAnswer, + isQuestionCaseSensitive); + if (isAnswerAllocated) { + // the answer has been already allocated to the target option + return targetOptionUid; + } + + // append new answer to option + name += AssessmentEscapeUtils.VSA_ANSWER_DELIMITER + answer; + targetOption.setName(name); + assessmentDao.saveObject(targetOption); + assessmentDao.flush(); + + if (log.isInfoEnabled()) { + log.info("Allocated VS answer \"" + answer + "\" to option " + targetOptionUid + " in question " + + questionUid); + } + } + return null; }