Index: lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java =================================================================== diff -u -r4e7112f26061bd5120444ea3eb1517acd1c3b88a -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java (.../QbQuestion.java) (revision 4e7112f26061bd5120444ea3eb1517acd1c3b88a) +++ lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java (.../QbQuestion.java) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -177,10 +177,8 @@ //numbering || (oldOption.getNumericalOption() != newOption.getNumericalOption()) || (oldOption.getAcceptedError() != newOption.getAcceptedError()) - //option grade - || (oldOption.getMaxMark() != newOption.getMaxMark()) - //changed correct option - || (oldOption.isCorrect() != newOption.isCorrect())) { + //changed option maxMark (Assessment tool) or correctness of the option (MCQ/Scratchie/Q&A) + || (oldOption.getMaxMark() != newOption.getMaxMark())) { isModificationRequiresNewVersion = true; } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java =================================================================== diff -u -rec62f6f6a9e56cd545c527d2fd530614b3a7e744 -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java (.../AuthoringController.java) (revision ec62f6f6a9e56cd545c527d2fd530614b3a7e744) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -251,9 +251,6 @@ } for (QuestionReference reference : oldReferences) { service.releaseFromCache(reference); -// if (reference.getQuestion() != null) { -// service.releaseFromCache(reference.getQuestion()); -// } } Long uid = assessmentPO.getUid(); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieItemDAO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieItemDAO.java (.../ScratchieItemDAO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieItemDAO.java (.../ScratchieItemDAO.java) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -39,6 +39,4 @@ ScratchieItem getByUid(Long scratchieItemUid); - void releaseItemFromCache(ScratchieItem item); - } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieItemDAOHibernate.java =================================================================== diff -u -rfba7287887f6dd83d3098100af6320cccf1f3e36 -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieItemDAOHibernate.java (.../ScratchieItemDAOHibernate.java) (revision fba7287887f6dd83d3098100af6320cccf1f3e36) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieItemDAOHibernate.java (.../ScratchieItemDAOHibernate.java) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -47,9 +47,4 @@ return (ScratchieItem) this.getObject(ScratchieItem.class, scratchieItemUid); } - @Override - public void releaseItemFromCache(ScratchieItem item) { - getSession().evict(item); - } - } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java =================================================================== diff -u -r23980a8cbd4e0d8d4e0b7ac4ad02e510d5653b75 -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java (.../ScratchieItem.java) (revision 23980a8cbd4e0d8d4e0b7ac4ad02e510d5653b75) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java (.../ScratchieItem.java) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -59,13 +59,7 @@ private String burningQuestion; @Transient private List optionDtos = null; - @Transient - private int qbQuestionModified = IQbService.QUESTION_MODIFIED_NONE; - public ScratchieItem() { - - } - @Override public Object clone() { ScratchieItem item = null; @@ -110,12 +104,4 @@ this.burningQuestion = burningQuestion; } - public int getQbQuestionModified() { - return qbQuestionModified; - } - - public void setQbQuestionModified(int qbQuestionModified) { - this.qbQuestionModified = qbQuestionModified; - } - } \ No newline at end of file Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java =================================================================== diff -u -rf9c66e78afa51f175afcaf22ee81f9b3460afea8 -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision f9c66e78afa51f175afcaf22ee81f9b3460afea8) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -389,11 +389,8 @@ * @param oldItems * @param newItems */ - void recalculateUserAnswers(Scratchie scratchie, Set oldItems, Set newItems, - List deletedItems); + void recalculateUserAnswers(Scratchie scratchie, Set oldItems, Set newItems); - void releaseItemsFromCache(Scratchie scratchie); - void releaseFromCache(Object object); ScratchieConfigItem getConfigItem(String key); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -rf9c66e78afa51f175afcaf22ee81f9b3460afea8 -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision f9c66e78afa51f175afcaf22ee81f9b3460afea8) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -60,7 +60,6 @@ import org.lamsfoundation.lams.qb.model.QbOption; import org.lamsfoundation.lams.qb.model.QbQuestion; import org.lamsfoundation.lams.qb.model.QbToolQuestion; -import org.lamsfoundation.lams.qb.service.IQbService; import org.lamsfoundation.lams.rest.RestTags; import org.lamsfoundation.lams.rest.ToolRestManager; import org.lamsfoundation.lams.tool.ToolCompletionStatus; @@ -210,24 +209,12 @@ @Override public void saveOrUpdateScratchie(Scratchie scratchie) { for (ScratchieItem item : scratchie.getScratchieItems()) { - //update only in case QbQuestion was modified, to prevent updating the same QbQuestions received from SesssionMap - if (item.getQbQuestionModified() != IQbService.QUESTION_MODIFIED_NONE) { - scratchieItemDao.saveObject(item.getQbQuestion()); - } scratchieItemDao.saveObject(item); } scratchieDao.saveObject(scratchie); } @Override - public void releaseItemsFromCache(Scratchie scratchie) { - for (ScratchieItem item : scratchie.getScratchieItems()) { - scratchieItemDao.releaseItemFromCache(item); - scratchieItemDao.releaseFromCache(item.getQbQuestion()); - } - } - - @Override public void releaseFromCache(Object object) { scratchieDao.releaseFromCache(object); } @@ -483,37 +470,33 @@ } @Override - public void recalculateUserAnswers(Scratchie scratchie, Set oldItems, Set newItems, - List deletedItems) { + public void recalculateUserAnswers(Scratchie scratchie, Set oldItems, Set newItems) { // create list of modified questions List modifiedItems = new ArrayList<>(); for (ScratchieItem oldItem : oldItems) { for (ScratchieItem newItem : newItems) { - if (oldItem.getUid().equals(newItem.getUid())) { - + if (oldItem.getDisplayOrder() == newItem.getDisplayOrder()) { boolean isItemModified = false; - // title or description is different - if (!oldItem.getQbQuestion().getName().equals(newItem.getQbQuestion().getName()) || !oldItem - .getQbQuestion().getDescription().equals(newItem.getQbQuestion().getDescription())) { - isItemModified = true; - } + // title or question is different - do nothing // options are different List oldOptions = oldItem.getQbQuestion().getQbOptions(); List newOptions = newItem.getQbQuestion().getQbOptions(); for (QbOption oldOption : oldOptions) { for (QbOption newOption : newOptions) { - if (oldOption.getUid().equals(newOption.getUid())) { + if (oldOption.getDisplayOrder() == newOption.getDisplayOrder()) { - if (!StringUtils.equals(oldOption.getName(), newOption.getName()) - || (oldOption.isCorrect() != newOption.isCorrect())) { + if (oldOption.isCorrect() != newOption.isCorrect()) { isItemModified = true; } } } } + if (oldOptions.size() != newOptions.size()) { + isItemModified = true; + } if (isItemModified) { modifiedItems.add(newItem); @@ -528,15 +511,8 @@ List visitLogsToDelete = new ArrayList<>(); boolean isRecalculateMarks = false; - // remove all scratches for modified and removed items + // remove all scratches for modified items - // [+] if the item was removed - for (ScratchieItem deletedItem : deletedItems) { - List visitLogs = scratchieAnswerVisitDao.getLogsBySessionAndItem(toolSessionId, - deletedItem.getUid()); - visitLogsToDelete.addAll(visitLogs); - } - // [+] if the question is modified for (ScratchieItem modifiedItem : modifiedItems) { List visitLogs = scratchieAnswerVisitDao.getLogsBySessionAndItem(toolSessionId, @@ -872,7 +848,7 @@ for (ScratchieAnswerVisitLog attempt : sessionAttempts) { QbOptionDTO optionDto = optionMap.get(attempt.getQbOption().getUid()); - int[] attempts = optionDto.getAttempts(); + int[] attempts = optionDto == null ? new int[options.size()] : optionDto.getAttempts(); // +1 for corresponding choice attempts[attemptNumber++]++; } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java =================================================================== diff -u -r1f7c5fb422d619e35598ae416565c790d5c76fff -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -28,7 +28,6 @@ import java.net.URLDecoder; import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -42,11 +41,14 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; import org.lamsfoundation.lams.learningdesign.ToolActivity; +import org.lamsfoundation.lams.qb.QbUtils; +import org.lamsfoundation.lams.qb.form.QbQuestionForm; import org.lamsfoundation.lams.qb.model.QbOption; import org.lamsfoundation.lams.qb.model.QbQuestion; import org.lamsfoundation.lams.qb.service.IQbService; @@ -58,11 +60,13 @@ import org.lamsfoundation.lams.tool.scratchie.service.IScratchieService; import org.lamsfoundation.lams.tool.scratchie.util.ScratchieItemComparator; import org.lamsfoundation.lams.tool.scratchie.web.form.ScratchieForm; -import org.lamsfoundation.lams.tool.scratchie.web.form.ScratchieItemForm; import org.lamsfoundation.lams.tool.scratchie.web.form.ScratchiePedagogicalPlannerForm; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.CommonConstants; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; import org.lamsfoundation.lams.web.util.SessionMap; import org.springframework.beans.factory.annotation.Autowired; @@ -85,21 +89,19 @@ @Autowired private IScratchieService scratchieService; - @Autowired private IQbService qbService; - @Autowired + private IUserManagementService userManagementService; + @Autowired @Qualifier("scratchieMessageService") private MessageService messageService; @RequestMapping("/start") private String start(@ModelAttribute("authoringForm") ScratchieForm authoringForm, HttpServletRequest request) throws ServletException { ToolAccessMode mode = WebUtil.readToolAccessModeAuthorDefaulted(request); - request.setAttribute(AttributeNames.ATTR_MODE, mode.toString()); - return starting(authoringForm, request); - + return starting(authoringForm, request, mode); } @RequestMapping("/definelater") @@ -114,12 +116,11 @@ //audit log the teacher has started editing activity in monitor scratchieService.auditLogStartEditingActivityInMonitor(toolContentID); - request.setAttribute(AttributeNames.ATTR_MODE, ToolAccessMode.TEACHER.toString()); - return starting(authoringForm, request); + return starting(authoringForm, request, ToolAccessMode.TEACHER); } - private String starting(@ModelAttribute("authoringForm") ScratchieForm authoringForm, HttpServletRequest request) - throws ServletException { + private String starting(@ModelAttribute("authoringForm") ScratchieForm authoringForm, HttpServletRequest request, + ToolAccessMode mode) throws ServletException { // initial Session Map SessionMap sessionMap = new SessionMap<>(); request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); @@ -131,23 +132,15 @@ authoringForm.setContentFolderID(contentFolderID); // save toolContentID into HTTPSession - Long contentId = new Long(WebUtil.readLongParam(request, ScratchieConstants.PARAM_TOOL_CONTENT_ID)); + Long contentId = WebUtil.readLongParam(request, ScratchieConstants.PARAM_TOOL_CONTENT_ID); sessionMap.put(ScratchieConstants.PARAM_TOOL_CONTENT_ID, contentId); - List items = null; Scratchie scratchie = null; try { scratchie = scratchieService.getScratchieByContentId(contentId); // if scratchie does not exist, try to use default content instead. if (scratchie == null) { scratchie = scratchieService.getDefaultContent(contentId); - if (scratchie.getScratchieItems() != null) { - items = new ArrayList<>(scratchie.getScratchieItems()); - } else { - items = null; - } - } else { - items = scratchieService.getAuthoredItems(scratchie.getUid()); } authoringForm.setScratchie(scratchie); @@ -171,14 +164,10 @@ sessionMap.put(ScratchieConstants.ATTR_IS_PRESET_MARKS_OVERWRITTEN, presetMarksOverwritten); sessionMap.put(ScratchieConstants.ATTR_DEFAULT_PRESET_MARKS, defaultPresetMarks); - // init it to avoid null exception in following handling - if (items == null) { - items = new ArrayList<>(); - } // init scratchie item list SortedSet itemList = getItemList(sessionMap); itemList.clear(); - itemList.addAll(items); + itemList.addAll(scratchie.getScratchieItems()); request.setAttribute(ScratchieConstants.ATTR_ITEM_LIST, itemList); // If there is no order id, set it up @@ -194,7 +183,7 @@ Set confidenceLevelsActivities = scratchieService .getPrecedingConfidenceLevelsActivities(contentId); sessionMap.put(ScratchieConstants.ATTR_CONFIDENCE_LEVELS_ACTIVITIES, confidenceLevelsActivities); - + sessionMap.put(AttributeNames.ATTR_MODE, mode); sessionMap.put(ScratchieConstants.ATTR_RESOURCE_FORM, authoringForm); return "pages/authoring/start"; } @@ -205,9 +194,7 @@ @RequestMapping("/init") private String initPage(@ModelAttribute("authoringForm") ScratchieForm authoringForm, HttpServletRequest request) throws ServletException { - String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession() - .getAttribute(sessionMapID); + SessionMap sessionMap = getSessionMap(request); ScratchieForm existForm = (ScratchieForm) sessionMap.get(ScratchieConstants.ATTR_RESOURCE_FORM); try { @@ -216,10 +203,6 @@ throw new ServletException(e); } - ToolAccessMode mode = WebUtil.readToolAccessModeAuthorDefaulted(request); - authoringForm.setMode(mode.toString()); - request.setAttribute(AttributeNames.ATTR_MODE, mode.toString()); - return "pages/authoring/authoring"; } @@ -229,7 +212,6 @@ @RequestMapping("/update") private String updateContent(@ModelAttribute("authoringForm") ScratchieForm authoringForm, HttpServletRequest request) throws Exception { - // get back sessionMAP SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(authoringForm.getSessionMapID()); @@ -239,11 +221,8 @@ // **********************************Get Scratchie PO********************* Scratchie scratchiePO = scratchieService.getScratchieByContentId(authoringForm.getScratchie().getContentId()); - //allow using old and modified questions and references altogether - Set oldItems = null; - if (mode.isTeacher()) { - oldItems = (scratchiePO == null) ? new HashSet<>() : scratchiePO.getScratchieItems(); - } + //allow using old and modified questions together + Set oldItems = (scratchiePO == null) ? new HashSet<>() : scratchiePO.getScratchieItems(); if (scratchiePO == null) { // new Scratchie, create it. @@ -253,7 +232,9 @@ } else { // copyProperties() below sets scratchiePO's items to empty collection // but the items still exist in Hibernate cache, so we need to evict them now - scratchieService.releaseItemsFromCache(scratchiePO); + for (ScratchieItem item : oldItems) { + scratchieService.releaseFromCache(item); + } scratchiePO.getScratchieItems().clear(); Long uid = scratchiePO.getUid(); PropertyUtils.copyProperties(scratchiePO, scratchie); @@ -272,35 +253,11 @@ Set items = new LinkedHashSet<>(); SortedSet newItems = getItemList(sessionMap); Iterator iter = newItems.iterator(); - int maxQuestionId = qbService.generateNextQuestionId(); while (iter.hasNext()) { ScratchieItem item = iter.next(); if (item != null) { item.setToolContentId(scratchiePO.getContentId()); - removeNewLineCharacters(item); items.add(item); - // modification status was already set in AuthoringController#saveItem() - switch (item.getQbQuestionModified()) { - case IQbService.QUESTION_MODIFIED_VERSION_BUMP: { - // new version of the old question gets created - QbQuestion qbQuestion = item.getQbQuestion().clone(); - item.setQbQuestion(qbQuestion); - qbQuestion.clearID(); - qbQuestion.setVersion(qbService.getMaxQuestionVersion(qbQuestion.getQuestionId()) + 1); - qbQuestion.setCreateDate(new Date()); - } - break; - case IQbService.QUESTION_MODIFIED_ID_BUMP: { - // new question gets created - QbQuestion qbQuestion = item.getQbQuestion().clone(); - item.setQbQuestion(qbQuestion); - qbQuestion.clearID(); - qbQuestion.setVersion(1); - qbQuestion.setQuestionId(maxQuestionId); - qbQuestion.setCreateDate(new Date()); - } - break; - } } } scratchiePO.setScratchieItems(items); @@ -311,12 +268,12 @@ authoringForm.setScratchie(scratchiePO); //recalculate results in case content is edited from monitoring - List deletedItems = getDeletedItemList(sessionMap); if (mode.isTeacher()) { - scratchieService.recalculateUserAnswers(scratchiePO, oldItems, newItems, deletedItems); + scratchieService.recalculateUserAnswers(scratchiePO, oldItems, newItems); } - // delete items from database. + // delete items from database + List deletedItems = getDeletedItemList(sessionMap); iter = deletedItems.iterator(); while (iter.hasNext()) { ScratchieItem item = iter.next(); @@ -336,15 +293,12 @@ * Ajax call, will add one more input line for new resource item instruction. */ @RequestMapping("/addItem") - private String addItem(@ModelAttribute("scratchieItemForm") ScratchieItemForm scratchieItemForm, + private String addItem(@ModelAttribute("scratchieItemForm") QbQuestionForm form, HttpServletRequest request) { - - String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession() - .getAttribute(sessionMapID); + SessionMap sessionMap = getSessionMap(request); String contentFolderID = (String) sessionMap.get(AttributeNames.PARAM_CONTENT_FOLDER_ID); - scratchieItemForm.setSessionMapID(sessionMapID); - scratchieItemForm.setContentFolderID(contentFolderID); + form.setSessionMapID(sessionMap.getSessionID()); + form.setContentFolderID(contentFolderID); List optionList = new ArrayList<>(); for (int i = 0; i < ScratchieConstants.INITIAL_OPTIONS_NUMBER; i++) { @@ -353,6 +307,8 @@ optionList.add(option); } request.setAttribute(ScratchieConstants.ATTR_OPTION_LIST, optionList); + + QbUtils.fillFormWithUserCollections(qbService, form, null); request.setAttribute(AttributeNames.PARAM_CONTENT_FOLDER_ID, contentFolderID); return "pages/authoring/parts/additem"; @@ -362,34 +318,31 @@ * Display edit page for existed scratchie item. */ @RequestMapping("/editItem") - private String editItem(@ModelAttribute("scratchieItemForm") ScratchieItemForm scratchieItemForm, + private String editItem(@ModelAttribute("scratchieItemForm") QbQuestionForm form, HttpServletRequest request) { - // get back sessionMAP - String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession() - .getAttribute(sessionMapID); + SessionMap sessionMap = getSessionMap(request); String contentFolderID = (String) sessionMap.get(AttributeNames.PARAM_CONTENT_FOLDER_ID); - int itemIdx = NumberUtils.toInt(request.getParameter(ScratchieConstants.PARAM_ITEM_INDEX), -1); - ScratchieItem item = null; - if (itemIdx != -1) { - SortedSet itemList = getItemList(sessionMap); - List rList = new ArrayList<>(itemList); - item = rList.get(itemIdx); - if (item != null) { - scratchieItemForm.setTitle(item.getQbQuestion().getName()); - scratchieItemForm.setDescription(item.getQbQuestion().getDescription()); - if (itemIdx >= 0) { - scratchieItemForm.setItemIndex(new Integer(itemIdx).toString()); - } + int itemIdx = WebUtil.readIntParam(request, ScratchieConstants.PARAM_ITEM_INDEX); + SortedSet itemList = getItemList(sessionMap); + List rList = new ArrayList<>(itemList); + ScratchieItem item = rList.get(itemIdx); + QbQuestion qbQuestion = item.getQbQuestion(); - List optionList = item.getQbQuestion().getQbOptions(); - request.setAttribute(ScratchieConstants.ATTR_OPTION_LIST, optionList); - - scratchieItemForm.setContentFolderID(contentFolderID); - } + form.setTitle(qbQuestion.getName()); + form.setDescription(qbQuestion.getDescription()); + if (itemIdx >= 0) { + form.setItemIndex(String.valueOf(itemIdx)); } + + List optionList = qbQuestion.getQbOptions(); + request.setAttribute(ScratchieConstants.ATTR_OPTION_LIST, optionList); + + form.setContentFolderID(contentFolderID); + form.setSessionMapID(sessionMap.getSessionID()); + QbUtils.fillFormWithUserCollections(qbService, form, qbQuestion.getUid()); + request.setAttribute(AttributeNames.PARAM_CONTENT_FOLDER_ID, contentFolderID); return "pages/authoring/parts/additem"; } @@ -416,17 +369,8 @@ maxSeq = last.getDisplayOrder() + 1; } item.setDisplayOrder(maxSeq); - item.setQbQuestionModified(IQbService.QUESTION_MODIFIED_NONE); itemList.add(item); - // evict everything manually as we do not use DTOs, just real entities - // without eviction changes would be saved immediately into DB -// scratchieService.releaseFromCache(item); -// scratchieService.releaseFromCache(item); -// scratchieService.releaseFromCache(item.getQbQuestion()); - -// request.setAttribute("qbQuestionModified", item.getQbQuestionModified()); - // set session map ID so that itemlist.jsp can get sessionMAP request.setAttribute(ScratchieConstants.ATTR_SESSION_MAP_ID, sessionMapID); return "pages/authoring/parts/itemlist"; @@ -439,59 +383,94 @@ * persisted. */ @RequestMapping(value = "/saveItem", method = RequestMethod.POST) - private String saveItem(@ModelAttribute("scratchieItemForm") ScratchieItemForm scratchieItemForm, + private String saveItem(@ModelAttribute("scratchieItemForm") QbQuestionForm form, HttpServletRequest request) { - SessionMap sessionMap = (SessionMap) request.getSession() - .getAttribute(scratchieItemForm.getSessionMapID()); - // check whether it is "edit(old Question)" or "add(new Question)" + .getAttribute(form.getSessionMapID()); SortedSet itemList = getItemList(sessionMap); - int itemIdx = NumberUtils.toInt(scratchieItemForm.getItemIndex(), -1); - ScratchieItem item = null; - - if (itemIdx == -1) { // add - item = new ScratchieItem(); - QbQuestion qbQuestion = new QbQuestion(); + int itemIdx = NumberUtils.toInt(form.getItemIndex(), -1); + + // check whether it is "edit(old Question)" or "add(new Question)" + QbQuestion qbQuestion; + ScratchieItem item; + final boolean isAddingQuestion = itemIdx == -1; + if (isAddingQuestion) { // add + qbQuestion = new QbQuestion(); qbQuestion.setType(QbQuestion.TYPE_MULTIPLE_CHOICE); - item.setQbQuestion(qbQuestion); + + item = new ScratchieItem(); int maxSeq = 1; if (itemList != null && itemList.size() > 0) { ScratchieItem last = itemList.last(); maxSeq = last.getDisplayOrder() + 1; } item.setDisplayOrder(maxSeq); itemList.add(item); - } else { // edit + + // edit + } else { List rList = new ArrayList<>(itemList); item = rList.get(itemIdx); + qbQuestion = qbService.getQuestionByUid(item.getQbQuestion().getUid()); + qbService.releaseFromCache(qbQuestion); } - QbQuestion baseLine = item.getQbQuestion().clone(); + QbQuestion oldQbQuestion = qbQuestion.clone(); // evict everything manually as we do not use DTOs, just real entities // without eviction changes would be saved immediately into DB - scratchieService.releaseFromCache(item); - scratchieService.releaseFromCache(baseLine); - scratchieService.releaseFromCache(item.getQbQuestion()); + scratchieService.releaseFromCache(oldQbQuestion); - item.getQbQuestion().setName(scratchieItemForm.getTitle()); - item.getQbQuestion().setDescription(scratchieItemForm.getDescription()); + qbQuestion.setName(form.getTitle()); + qbQuestion.setDescription(form.getDescription()); // set options Set optionList = getOptionsFromRequest(request, true); - List options = new ArrayList<>(); - int orderId = 0; - for (QbOption option : optionList) { - option.setDisplayOrder(orderId++); - options.add(option); - } - item.getQbQuestion().setQbOptions(options); + List options = new ArrayList<>(optionList); + qbQuestion.setQbOptions(options); - int isQbQuestionModified = item.getQbQuestion().isQbQuestionModified(baseLine); - item.setQbQuestionModified(isQbQuestionModified); + int isQbQuestionModified = qbQuestion.isQbQuestionModified(oldQbQuestion); + QbQuestion updatedQuestion = null; + switch (isQbQuestionModified) { + case IQbService.QUESTION_MODIFIED_VERSION_BUMP: { + // new version of the old question gets created + updatedQuestion = qbQuestion.clone(); + updatedQuestion.clearID(); + updatedQuestion.setVersion(qbService.getMaxQuestionVersion(qbQuestion.getQuestionId()) + 1); + updatedQuestion.setCreateDate(new Date()); + } + break; + case IQbService.QUESTION_MODIFIED_ID_BUMP: { + // new question gets created + updatedQuestion = qbQuestion.clone(); + updatedQuestion.clearID(); + updatedQuestion.setQuestionId(qbService.generateNextQuestionId()); + updatedQuestion.setVersion(1); + updatedQuestion.setCreateDate(new Date()); + } + break; + case IQbService.QUESTION_MODIFIED_NONE: { + // save the old question anyway, as it may contain some minor changes (like title or description change) + updatedQuestion = qbQuestion; + } + break; + } + userManagementService.save(updatedQuestion); + item.setQbQuestion(updatedQuestion); request.setAttribute("qbQuestionModified", isQbQuestionModified); + + //take care about question's collections. add to collection first + Long oldCollectionUid = form.getOldCollectionUid(); + Long newCollectionUid = form.getNewCollectionUid(); + if (isAddingQuestion || !newCollectionUid.equals(oldCollectionUid)) { + qbService.addQuestionToCollection(newCollectionUid, updatedQuestion.getQuestionId(), false); + } + //remove from the old collection, if needed + if (!isAddingQuestion && !newCollectionUid.equals(oldCollectionUid)) { + qbService.removeQuestionFromCollectionByQuestionId(oldCollectionUid, updatedQuestion.getQuestionId(), false); + } // set session map ID so that itemlist.jsp can get sessionMAP - request.setAttribute(ScratchieConstants.ATTR_SESSION_MAP_ID, scratchieItemForm.getSessionMapID()); + request.setAttribute(ScratchieConstants.ATTR_SESSION_MAP_ID, form.getSessionMapID()); return "pages/authoring/parts/itemlist"; } @@ -506,11 +485,7 @@ */ @RequestMapping("/removeItem") private String removeItem(HttpServletRequest request) { - - String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); - request.setAttribute(ScratchieConstants.ATTR_SESSION_MAP_ID, sessionMapID); - SessionMap sessionMap = (SessionMap) request.getSession() - .getAttribute(sessionMapID); + SessionMap sessionMap = getSessionMap(request); SortedSet itemList = getItemList(sessionMap); int itemIndex = NumberUtils.toInt(request.getParameter(ScratchieConstants.PARAM_ITEM_INDEX), -1); @@ -558,10 +533,7 @@ } private String switchItem(HttpServletRequest request, boolean up) { - String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); - request.setAttribute(ScratchieConstants.ATTR_SESSION_MAP_ID, sessionMapID); - SessionMap sessionMap = (SessionMap) request.getSession() - .getAttribute(sessionMapID); + SessionMap sessionMap = getSessionMap(request); SortedSet itemList = getItemList(sessionMap); int itemIndex = NumberUtils.toInt(request.getParameter(ScratchieConstants.PARAM_ITEM_INDEX), -1); @@ -744,6 +716,7 @@ * @param request * @return */ + @SuppressWarnings("unchecked") private SortedSet getItemList(SessionMap sessionMap) { SortedSet list = (SortedSet) sessionMap.get(ScratchieConstants.ATTR_ITEM_LIST); if (list == null) { @@ -759,22 +732,12 @@ * @param request * @return */ + @SuppressWarnings("unchecked") private List getDeletedItemList(SessionMap sessionMap) { - return getListFromSession(sessionMap, ScratchieConstants.ATTR_DELETED_ITEM_LIST); - } - - /** - * Get java.util.List from HttpSession by given name. - * - * @param request - * @param name - * @return - */ - private List getListFromSession(SessionMap sessionMap, String name) { - List list = (List) sessionMap.get(name); + List list = (List) sessionMap.get(ScratchieConstants.ATTR_DELETED_ITEM_LIST); if (list == null) { - list = new ArrayList(); - sessionMap.put(name, list); + list = new ArrayList<>(); + sessionMap.put(ScratchieConstants.ATTR_DELETED_ITEM_LIST, list); } return list; } @@ -854,22 +817,11 @@ } return paramMap; } - - /** - * Removes redundant new line characters from options left by CKEditor (otherwise it will break Javascript in - * monitor) - */ - private void removeNewLineCharacters(ScratchieItem item) { - Collection options = item.getQbQuestion().getQbOptions(); - if (options != null) { - for (QbOption option : options) { - String optionDescription = option.getName(); - if (optionDescription != null) { - optionDescription = optionDescription.replaceAll("[\n\r\f]", ""); - option.setName(optionDescription); - } - } - - } + + @SuppressWarnings("unchecked") + private SessionMap getSessionMap(HttpServletRequest request) { + String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); + request.setAttribute(ScratchieConstants.ATTR_SESSION_MAP_ID, sessionMapID); + return (SessionMap) request.getSession().getAttribute(sessionMapID); } } \ No newline at end of file Fisheye: Tag 06d090eefddaafa108bcd8614d47d3d92f946210 refers to a dead (removed) revision in file `lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/form/ScratchieItemForm.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_scratchie/web/pages/authoring/authoring.jsp =================================================================== diff -u -rd064905749470c0f9d9ffd8b7d8614529d533a88 -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_tool_scratchie/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision d064905749470c0f9d9ffd8b7d8614529d533a88) +++ lams_tool_scratchie/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -1,6 +1,8 @@ <%@ include file="/common/taglibs.jsp"%> <%@ page import="org.lamsfoundation.lams.tool.scratchie.ScratchieConstants"%> + + Index: lams_tool_scratchie/web/pages/authoring/basic.jsp =================================================================== diff -u -rd064905749470c0f9d9ffd8b7d8614529d533a88 -r06d090eefddaafa108bcd8614d47d3d92f946210 --- lams_tool_scratchie/web/pages/authoring/basic.jsp (.../basic.jsp) (revision d064905749470c0f9d9ffd8b7d8614529d533a88) +++ lams_tool_scratchie/web/pages/authoring/basic.jsp (.../basic.jsp) (revision 06d090eefddaafa108bcd8614d47d3d92f946210) @@ -4,6 +4,8 @@ + + - - + + +