Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java =================================================================== diff -u -r804dca72fa2ac638a9d3e2e66054d82688951c31 -red8e4fb944665c1f48832c59b95944c5b5875a78 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision 804dca72fa2ac638a9d3e2e66054d82688951c31) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java (.../IScratchieService.java) (revision ed8e4fb944665c1f48832c59b95944c5b5875a78) @@ -408,7 +408,7 @@ * @param oldItems * @param newItems */ - void recalculateUserAnswers(Scratchie scratchie, Set oldItems, Set newItems); + void recalculateUserAnswers(Scratchie scratchie, Set oldItems, Set newItems, String oldPresetMarks); void releaseFromCache(Object object); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r9d224a0b8b713a8cdf888122ee257989be6a5e32 -red8e4fb944665c1f48832c59b95944c5b5875a78 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 9d224a0b8b713a8cdf888122ee257989be6a5e32) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision ed8e4fb944665c1f48832c59b95944c5b5875a78) @@ -516,32 +516,36 @@ } @Override - public void recalculateUserAnswers(Scratchie scratchie, Set oldItems, Set newItems) { + public void recalculateUserAnswers(Scratchie scratchie, Set oldItems, Set newItems, + String oldPresetMarks) { // create list of modified questions List modifiedItems = new ArrayList<>(); for (ScratchieItem oldItem : oldItems) { for (ScratchieItem newItem : newItems) { if (oldItem.getDisplayOrder() == newItem.getDisplayOrder()) { - boolean isItemModified = false; // title or question is different - do nothing // options are different List oldOptions = oldItem.getQbQuestion().getQbOptions(); List newOptions = newItem.getQbQuestion().getQbOptions(); + boolean isItemModified = oldOptions.size() != newOptions.size(); + for (QbOption oldOption : oldOptions) { + if (isItemModified) { + break; + } + for (QbOption newOption : newOptions) { if (oldOption.getDisplayOrder() == newOption.getDisplayOrder()) { if (oldOption.isCorrect() != newOption.isCorrect()) { isItemModified = true; + break; } } } } - if (oldOptions.size() != newOptions.size()) { - isItemModified = true; - } if (isItemModified) { modifiedItems.add(newItem); @@ -554,7 +558,9 @@ for (ScratchieSession session : sessionList) { Long toolSessionId = session.getSessionId(); List visitLogsToDelete = new ArrayList<>(); - boolean isRecalculateMarks = false; + String newPresetMarks = scratchie.getPresetMarks(); + boolean isRecalculateMarks = oldPresetMarks == null ? newPresetMarks != null + : newPresetMarks == null || !oldPresetMarks.equals(newPresetMarks); // remove all scratches for modified items Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java =================================================================== diff -u -r92525f17be9db4e57a8551ff92d004f319fb4b73 -red8e4fb944665c1f48832c59b95944c5b5875a78 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 92525f17be9db4e57a8551ff92d004f319fb4b73) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision ed8e4fb944665c1f48832c59b95944c5b5875a78) @@ -248,13 +248,15 @@ //allow using old and modified questions together Set oldItems = (scratchiePO == null) ? new HashSet<>() : new HashSet<>(scratchiePO.getScratchieItems()); + String oldPresetMarks = null; if (scratchiePO == null) { // new Scratchie, create it. scratchiePO = scratchie; scratchiePO.setCreated(new Timestamp(new Date().getTime())); scratchiePO.setUpdated(new Timestamp(new Date().getTime())); } else { + oldPresetMarks = scratchiePO.getPresetMarks(); // copyProperties() below sets scratchiePO's items to empty collection // but the items still exist in Hibernate cache, so we need to evict them now for (ScratchieItem item : oldItems) { @@ -294,7 +296,7 @@ //recalculate results in case content is edited from monitoring if (mode.isTeacher()) { - scratchieService.recalculateUserAnswers(scratchiePO, oldItems, newItems); + scratchieService.recalculateUserAnswers(scratchiePO, oldItems, newItems, oldPresetMarks); } // delete items from database