Index: lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java =================================================================== diff -u -r9b18dabfc4198e4a842adda25a39957b6c4be92e -r3190bef4d1c10ac3e955dd0492d6747ae4975629 --- lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java (.../QbQuestion.java) (revision 9b18dabfc4198e4a842adda25a39957b6c4be92e) +++ lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java (.../QbQuestion.java) (revision 3190bef4d1c10ac3e955dd0492d6747ae4975629) @@ -237,11 +237,15 @@ public void clearID() { this.uid = null; - for (QbOption option : qbOptions) { - option.uid = null; + if (qbOptions != null) { + for (QbOption option : qbOptions) { + option.uid = null; + } } - for (QbQuestionUnit unit : units) { - unit.uid = null; + if (units != null) { + for (QbQuestionUnit unit : units) { + unit.uid = null; + } } } Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java =================================================================== diff -u -r2c7b65efc6c0379bb0acf7d04d3b8cb44384c960 -r3190bef4d1c10ac3e955dd0492d6747ae4975629 --- lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision 2c7b65efc6c0379bb0acf7d04d3b8cb44384c960) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision 3190bef4d1c10ac3e955dd0492d6747ae4975629) @@ -3,6 +3,7 @@ import java.math.BigInteger; import java.util.Collection; import java.util.List; +import java.util.UUID; import org.lamsfoundation.lams.qb.dto.QbStatsActivityDTO; import org.lamsfoundation.lams.qb.dto.QbStatsDTO; @@ -37,6 +38,8 @@ */ List getQuestionsByQuestionId(Integer questionId); + QbQuestion getQuestionByUUID(UUID uuid); + /** * @param optionUid * @return QbOption by its uid. Besides, it releases returned object and associated qbQuestion from the cache. Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java =================================================================== diff -u -r2c7b65efc6c0379bb0acf7d04d3b8cb44384c960 -r3190bef4d1c10ac3e955dd0492d6747ae4975629 --- lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 2c7b65efc6c0379bb0acf7d04d3b8cb44384c960) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 3190bef4d1c10ac3e955dd0492d6747ae4975629) @@ -15,6 +15,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; import org.apache.log4j.Logger; @@ -69,6 +70,15 @@ } @Override + public QbQuestion getQuestionByUUID(UUID uuid) { + if (uuid == null) { + return null; + } + List result = qbDAO.findByProperty(QbQuestion.class, "uuid", uuid); + return result.isEmpty() ? null : result.get(0); + } + + @Override public QbOption getOptionByUid(Long optionUid) { QbOption option = qbDAO.find(QbOption.class, optionUid); qbDAO.releaseFromCache(option); @@ -568,6 +578,7 @@ * Cascades in QbToolQuestion, QbQuestion and QbOptions do not seem to work on insert. * New QbQuestions need to be saved step by step. */ + @Override public void insertQuestion(QbQuestion qbQuestion) { if (qbQuestion.getQuestionId() == null) { qbQuestion.setQuestionId(generateNextQuestionId()); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r2c7b65efc6c0379bb0acf7d04d3b8cb44384c960 -r3190bef4d1c10ac3e955dd0492d6747ae4975629 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 2c7b65efc6c0379bb0acf7d04d3b8cb44384c960) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 3190bef4d1c10ac3e955dd0492d6747ae4975629) @@ -2649,8 +2649,16 @@ // we need to save QB questions and options first for (AssessmentQuestion assessmentQuestion : toolContentObj.getQuestions()) { QbQuestion qbQuestion = assessmentQuestion.getQbQuestion(); - qbService.insertQuestion(qbQuestion); - qbService.addQuestionToCollection(publicQbCollectionUid, qbQuestion.getQuestionId(), false); + qbQuestion.clearID(); + + QbQuestion existingQuestion = qbService.getQuestionByUUID(qbQuestion.getUuid()); + if (existingQuestion == null) { + qbService.insertQuestion(qbQuestion); + qbService.addQuestionToCollection(publicQbCollectionUid, qbQuestion.getQuestionId(), false); + } else { + assessmentQuestion.setQbQuestion(existingQuestion); + } + assessmentDao.insert(assessmentQuestion); } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java =================================================================== diff -u -r2c7b65efc6c0379bb0acf7d04d3b8cb44384c960 -r3190bef4d1c10ac3e955dd0492d6747ae4975629 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 2c7b65efc6c0379bb0acf7d04d3b8cb44384c960) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 3190bef4d1c10ac3e955dd0492d6747ae4975629) @@ -26,7 +26,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashSet; @@ -1429,8 +1428,15 @@ // we need to save QB questions and options first for (McQueContent mcQuestion : toolContentObj.getMcQueContents()) { QbQuestion qbQuestion = mcQuestion.getQbQuestion(); - qbService.insertQuestion(qbQuestion); - qbService.addQuestionToCollection(publicQbCollectionUid, qbQuestion.getQuestionId(), false); + qbQuestion.clearID(); + + QbQuestion existingQuestion = qbService.getQuestionByUUID(qbQuestion.getUuid()); + if (existingQuestion == null) { + qbService.insertQuestion(qbQuestion); + qbService.addQuestionToCollection(publicQbCollectionUid, qbQuestion.getQuestionId(), false); + } else { + mcQuestion.setQbQuestion(existingQuestion); + } } mcContentDAO.saveMcContent(toolContentObj); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r2c7b65efc6c0379bb0acf7d04d3b8cb44384c960 -r3190bef4d1c10ac3e955dd0492d6747ae4975629 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 2c7b65efc6c0379bb0acf7d04d3b8cb44384c960) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 3190bef4d1c10ac3e955dd0492d6747ae4975629) @@ -1920,8 +1920,16 @@ // we need to save QB questions and options first for (ScratchieItem scratchieItem : toolContentObj.getScratchieItems()) { QbQuestion qbQuestion = scratchieItem.getQbQuestion(); - qbService.insertQuestion(qbQuestion); - qbService.addQuestionToCollection(publicQbCollectionUid, qbQuestion.getQuestionId(), false); + qbQuestion.clearID(); + + QbQuestion existingQuestion = qbService.getQuestionByUUID(qbQuestion.getUuid()); + if (existingQuestion == null) { + qbService.insertQuestion(qbQuestion); + qbService.addQuestionToCollection(publicQbCollectionUid, qbQuestion.getQuestionId(), false); + } else { + scratchieItem.setQbQuestion(existingQuestion); + } + scratchieDao.insert(scratchieItem); }