Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java =================================================================== diff -u -rbdd3abc4e8371ce227cb000d5aac58fdb45077a5 -r7eab6b4371036949ed61a387bc7706473895f567 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision bdd3abc4e8371ce227cb000d5aac58fdb45077a5) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 7eab6b4371036949ed61a387bc7706473895f567) @@ -1152,8 +1152,18 @@ // Criterion gets automatically created and there must be only one. List criteria = ratingService.getCriteriasByToolContentId(assessment.getContentId()); if (criteria.size() >= 2) { - throw new IllegalArgumentException("There can be only one criterion for an Assessment activity. " - + "If other criteria are introduced, the criterion for rating other groups' answers needs to become uniquely identifiable."); + try { + for (int criterionIndex = 1; criterionIndex < criteria.size(); criterionIndex++) { + RatingCriteria criterion = criteria.get(criterionIndex); + Long criterionId = criterion.getRatingCriteriaId(); + userManagementService.delete(criterion); + log.warn("Removed a duplicate criterion ID " + criterionId + " for Assessment tool content ID " + + assessment.getContentId()); + } + } catch (Exception e) { + log.warn("Ignoring error while deleting a duplicate criterion for Assessment tool content ID " + + assessment.getContentId() + ": " + e.getMessage()); + } } ToolActivityRatingCriteria criterion = null; if (criteria.isEmpty()) { Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java =================================================================== diff -u -r0b845931db55d90f0dcabc0b33cce5c7df688153 -r7eab6b4371036949ed61a387bc7706473895f567 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision 0b845931db55d90f0dcabc0b33cce5c7df688153) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision 7eab6b4371036949ed61a387bc7706473895f567) @@ -420,9 +420,14 @@ Map itemRatingDtoMap = null; if (dokumaran.isGalleryWalkStarted()) { if (!dokumaran.isGalleryWalkReadOnly()) { - // it should have been creating on lesson create, + // it should have been created on lesson create, // but in case Live Edit added Gallery Walk, we need to add it now, but just once - createGalleryWalkRatingCriterion(dokumaran.getContentId()); + try { + createGalleryWalkRatingCriterion(dokumaran.getContentId()); + } catch (Exception e) { + log.warn("Ignoring error while processing Dokumaran Gallery Walk criteria for tool content ID " + + dokumaran.getContentId()); + } } // Item IDs are DokumaranSession session IDs, i.e. a single Etherpad @@ -519,13 +524,27 @@ private List createGalleryWalkRatingCriterion(long toolContentId) { List criteria = ratingService.getCriteriasByToolContentId(toolContentId); + if (criteria.size() >= 2) { + criteria = ratingService.getCriteriasByToolContentId(toolContentId); // Dokumaran currently supports only one place for ratings. // It is rating other groups' pads on results page. // Criterion gets automatically created and there must be only one. - throw new IllegalArgumentException("There can be only one criterion for a Dokumaran activity. " - + "If other criteria are introduced, the criterion for rating other groups' answers needs to become uniquely identifiable."); + try { + for (int criterionIndex = 1; criterionIndex < criteria.size(); criterionIndex++) { + RatingCriteria criterion = criteria.get(criterionIndex); + Long criterionId = criterion.getRatingCriteriaId(); + dokumaranDao.delete(criterion); + log.warn("Removed a duplicate criterion ID " + criterionId + " for Dokumaran tool content ID " + + toolContentId); + } + } catch (Exception e) { + log.warn("Ignoring error while deleting a duplicate criterion for Dokumaran tool content ID " + + toolContentId + ": " + e.getMessage()); + } + return criteria; } + if (criteria.isEmpty()) { ToolActivityRatingCriteria criterion = (ToolActivityRatingCriteria) RatingCriteria .getRatingCriteriaInstance(RatingCriteria.TOOL_ACTIVITY_CRITERIA_TYPE); Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningController.java =================================================================== diff -u -r53041ab71ac581668c14bdf40f65be5ea5f26961 -r7eab6b4371036949ed61a387bc7706473895f567 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningController.java (.../LearningController.java) (revision 53041ab71ac581668c14bdf40f65be5ea5f26961) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningController.java (.../LearningController.java) (revision 7eab6b4371036949ed61a387bc7706473895f567) @@ -59,6 +59,7 @@ import org.lamsfoundation.lams.web.util.AttributeNames; import org.lamsfoundation.lams.web.util.SessionMap; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; @@ -203,7 +204,14 @@ } if (dokumaran.isGalleryWalkStarted()) { - List groupList = dokumaranService.getSummary(dokumaran.getContentId(), user.getUserId()); + List groupList = null; + try { + groupList = dokumaranService.getSummary(dokumaran.getContentId(), user.getUserId()); + } catch (HibernateOptimisticLockingFailureException e) { + log.warn("Ignoring error caused probably by creating Gallery Walk criteria", e); + // simply run the transaction again + groupList = dokumaranService.getSummary(dokumaran.getContentId(), user.getUserId()); + } request.setAttribute(DokumaranConstants.ATTR_SUMMARY_LIST, groupList); if (currentUserDto == null) {