Index: lams_common/src/java/org/lamsfoundation/lams/commonContext.xml =================================================================== diff -u -rf27fea8eb6533208beffced8d55e3544857577e8 -r3f8a54919303711f3b52cdf48b248f102138d9be --- lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision f27fea8eb6533208beffced8d55e3544857577e8) +++ lams_common/src/java/org/lamsfoundation/lams/commonContext.xml (.../commonContext.xml) (revision 3f8a54919303711f3b52cdf48b248f102138d9be) @@ -564,6 +564,7 @@ + Index: lams_common/src/java/org/lamsfoundation/lams/qb/QbUtils.java =================================================================== diff -u -r9012873415698350686bf05ac1ddb1ee5b8fe154 -r3f8a54919303711f3b52cdf48b248f102138d9be --- lams_common/src/java/org/lamsfoundation/lams/qb/QbUtils.java (.../QbUtils.java) (revision 9012873415698350686bf05ac1ddb1ee5b8fe154) +++ lams_common/src/java/org/lamsfoundation/lams/qb/QbUtils.java (.../QbUtils.java) (revision 3f8a54919303711f3b52cdf48b248f102138d9be) @@ -33,9 +33,16 @@ : string.trim(); public static void fillFormWithUserCollections(IQbService qbService, QbQuestionForm form, Long qbQuestionUid) { + QbUtils.fillFormWithUserCollections(qbService, null, form, qbQuestionUid); + } + + public static void fillFormWithUserCollections(IQbService qbService, String toolSignature, QbQuestionForm form, + Long qbQuestionUid) { final boolean isRequestCameFromTool = StringUtils.isNotBlank(form.getSessionMapID()); + boolean isDefaultQuestion = qbService.isQuestionDefaultInTool(qbQuestionUid, toolSignature); Integer userId = QbUtils.getUserId(); - if (isRequestCameFromTool && qbQuestionUid != null) { + + if (isRequestCameFromTool && !isDefaultQuestion && qbQuestionUid != null) { QbQuestion qbQuestion = qbService.getQuestionByUid(qbQuestionUid); boolean isQuestionInUserCollection = qbService.isQuestionInUserCollection(qbQuestion.getQuestionId(), userId); @@ -58,7 +65,7 @@ Collection questionCollections = qbQuestionUid == null ? new LinkedList<>() : qbService.getQuestionCollectionsByUid(qbQuestionUid); Long collectionUid = null; - if (questionCollections.isEmpty()) { + if (isDefaultQuestion || questionCollections.isEmpty()) { //set private collection as default, if question is new or doesn't have associated collection for (QbCollection collection : userCollections) { if (collection.isPersonal()) { Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java =================================================================== diff -u -r9012873415698350686bf05ac1ddb1ee5b8fe154 -r3f8a54919303711f3b52cdf48b248f102138d9be --- lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision 9012873415698350686bf05ac1ddb1ee5b8fe154) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision 3f8a54919303711f3b52cdf48b248f102138d9be) @@ -144,4 +144,6 @@ void prepareQuestionForExport(QbQuestion qbQuestion); int mergeQuestions(long sourceQbQuestionUid, long targetQbQuestionUid); + + boolean isQuestionDefaultInTool(long qbQuestionUid, String toolSignature); } Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java =================================================================== diff -u -r7eef84aca4b6e28ca274dbf4a91631ca484c973e -r3f8a54919303711f3b52cdf48b248f102138d9be --- lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 7eef84aca4b6e28ca274dbf4a91631ca484c973e) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 3f8a54919303711f3b52cdf48b248f102138d9be) @@ -38,6 +38,7 @@ import org.lamsfoundation.lams.qb.model.QbQuestionUnit; import org.lamsfoundation.lams.qb.model.QbToolQuestion; import org.lamsfoundation.lams.tool.service.ILamsCoreToolService; +import org.lamsfoundation.lams.tool.service.ILamsToolService; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; @@ -66,6 +67,8 @@ private ILogEventService logEventService; + private ILamsToolService toolService; + public static final Comparator COLLECTION_NAME_COMPARATOR = Comparator .comparing(QbCollection::getName); @@ -679,6 +682,12 @@ return answersChanged; } + public boolean isQuestionDefaultInTool(long qbQuestionUid, String toolSignature) { + long defaultContentId = toolService.getToolDefaultContentIdBySignature(toolSignature); + Collection qbQuestions = qbDAO.getQuestionsByToolContentId(defaultContentId); + return qbQuestions.stream().anyMatch(q -> q.getUid().equals(qbQuestionUid)); + } + private static Integer getUserId() { HttpSession ss = SessionManager.getSession(); UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); @@ -704,4 +713,8 @@ public void setLogEventService(ILogEventService logEventService) { this.logEventService = logEventService; } + + public void setToolService(ILamsToolService toolService) { + this.toolService = toolService; + } } \ No newline at end of file Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/AuthoringController.java =================================================================== diff -u -r8a10262db418fe16a5ac30cb2123feddea6f162e -r3f8a54919303711f3b52cdf48b248f102138d9be --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 8a10262db418fe16a5ac30cb2123feddea6f162e) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 3f8a54919303711f3b52cdf48b248f102138d9be) @@ -367,6 +367,7 @@ // check whether it is "edit(old Question)" or "add(new Question)" QbQuestion qbQuestion; QaQueContent qaQuestion; + boolean isDefaultQuestion = false; final boolean isAddingQuestion = itemIdx == -1; if (isAddingQuestion) { // add @@ -394,8 +395,18 @@ } else { List rList = new ArrayList<>(qaQuestions); qaQuestion = rList.get(itemIdx); - qbQuestion = qbService.getQuestionByUid(qaQuestion.getQbQuestion().getUid()); + long qbQuestionUid = qaQuestion.getQbQuestion().getUid(); + qbQuestion = qbService.getQuestionByUid(qbQuestionUid); qbService.releaseFromCache(qbQuestion); + + // if it is a default question, do not modify it + // treat it as a new question + isDefaultQuestion = qbService.isQuestionDefaultInTool(qbQuestionUid, QaAppConstants.MY_SIGNATURE); + if (isDefaultQuestion) { + String questionContentFolderID = FileUtil.generateUniqueContentFolderID(); + qbQuestion.setContentFolderId(questionContentFolderID); + qbQuestion.setQuestionId(qbService.generateNextQuestionId()); // generate a new question ID right away, so another user won't "take it" + } } QbQuestion oldQbQuestion = qbQuestion.clone(); @@ -409,7 +420,8 @@ qbQuestion.setMinWordsLimit(form.getMinWordsLimit()); qbQuestion.setFeedback(form.getFeedback()); - int isQbQuestionModified = qbQuestion.isQbQuestionModified(oldQbQuestion); + int isQbQuestionModified = isDefaultQuestion ? IQbService.QUESTION_MODIFIED_ID_BUMP + : qbQuestion.isQbQuestionModified(oldQbQuestion); QbQuestion updatedQuestion = null; switch (isQbQuestionModified) { case IQbService.QUESTION_MODIFIED_VERSION_BUMP: { @@ -438,7 +450,8 @@ //take care about question's collections. add to collection first Long oldCollectionUid = form.getOldCollectionUid(); Long newCollectionUid = form.getNewCollectionUid(); - if (isAddingQuestion || (newCollectionUid != null && !newCollectionUid.equals(oldCollectionUid))) { + if (isAddingQuestion || isDefaultQuestion + || (newCollectionUid != null && !newCollectionUid.equals(oldCollectionUid))) { qbService.addQuestionToCollection(newCollectionUid, updatedQuestion.getQuestionId(), false); } //remove from the old collection, if needed @@ -493,7 +506,7 @@ form.setContentFolderID(qbQuestion.getContentFolderId()); form.setSessionMapID(sessionMapID); - QbUtils.fillFormWithUserCollections(qbService, form, qbQuestion.getUid()); + QbUtils.fillFormWithUserCollections(qbService, QaAppConstants.MY_SIGNATURE, form, qbQuestion.getUid()); request.setAttribute(AttributeNames.PARAM_CONTENT_FOLDER_ID, contentFolderID); return "authoring/newQuestionBox"; Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java =================================================================== diff -u -r8a10262db418fe16a5ac30cb2123feddea6f162e -r3f8a54919303711f3b52cdf48b248f102138d9be --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 8a10262db418fe16a5ac30cb2123feddea6f162e) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 3f8a54919303711f3b52cdf48b248f102138d9be) @@ -373,7 +373,7 @@ request.setAttribute(QbConstants.ATTR_OPTION_LIST, optionList); form.setSessionMapID(sessionMap.getSessionID()); - QbUtils.fillFormWithUserCollections(qbService, form, qbQuestion.getUid()); + QbUtils.fillFormWithUserCollections(qbService, ScratchieConstants.TOOL_SIGNATURE, form, qbQuestion.getUid()); form.setContentFolderID(qbQuestion.getContentFolderId()); request.setAttribute(AttributeNames.PARAM_CONTENT_FOLDER_ID, qbQuestion.getContentFolderId()); @@ -463,6 +463,7 @@ // check whether it is "edit(old Question)" or "add(new Question)" QbQuestion qbQuestion; ScratchieItem item; + boolean isDefaultQuestion = false; final boolean isAddingQuestion = itemIdx == -1; if (isAddingQuestion) { // add qbQuestion = new QbQuestion(); @@ -483,8 +484,18 @@ } else { List rList = new ArrayList<>(itemList); item = rList.get(itemIdx); - qbQuestion = qbService.getQuestionByUid(item.getQbQuestion().getUid()); + long qbQuestionUid = item.getQbQuestion().getUid(); + qbQuestion = qbService.getQuestionByUid(qbQuestionUid); qbService.releaseFromCache(qbQuestion); + + // if it is a default question, do not modify it + // treat it as a new question + isDefaultQuestion = qbService.isQuestionDefaultInTool(qbQuestionUid, ScratchieConstants.TOOL_SIGNATURE); + if (isDefaultQuestion) { + String questionContentFolderID = FileUtil.generateUniqueContentFolderID(); + qbQuestion.setContentFolderId(questionContentFolderID); + qbQuestion.setQuestionId(qbService.generateNextQuestionId()); // generate a new question ID right away, so another user won't "take it" + } } QbQuestion oldQbQuestion = qbQuestion.clone(); @@ -510,7 +521,8 @@ List options = new ArrayList<>(optionList); qbQuestion.setQbOptions(options); - int isQbQuestionModified = qbQuestion.isQbQuestionModified(oldQbQuestion); + int isQbQuestionModified = isDefaultQuestion ? IQbService.QUESTION_MODIFIED_ID_BUMP + : qbQuestion.isQbQuestionModified(oldQbQuestion); QbQuestion updatedQuestion = null; switch (isQbQuestionModified) { case IQbService.QUESTION_MODIFIED_VERSION_BUMP: { @@ -543,7 +555,8 @@ //take care about question's collections. add to collection first Long oldCollectionUid = form.getOldCollectionUid(); Long newCollectionUid = form.getNewCollectionUid(); - if (isAddingQuestion || (newCollectionUid != null && !newCollectionUid.equals(oldCollectionUid))) { + if (isAddingQuestion || isDefaultQuestion + || (newCollectionUid != null && !newCollectionUid.equals(oldCollectionUid))) { qbService.addQuestionToCollection(newCollectionUid, updatedQuestion.getQuestionId(), false); } //remove from the old collection, if needed