From 5825c737e7076e76f8f9dbfa7ee4a81d94d68566 Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Sun, 15 Mar 2020 14:01:25 +0100 Subject: [PATCH] OO-4578: catch duplicate user efficiency statement persistence --- .../manager/EfficiencyStatementManager.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java index 65c10223ca3..2bd5faa8ba2 100644 --- a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java +++ b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java @@ -34,7 +34,10 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import javax.persistence.PersistenceException; + import org.apache.logging.log4j.Logger; +import org.hibernate.exception.ConstraintViolationException; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.IdentityRef; import org.olat.core.commons.persistence.DB; @@ -220,7 +223,7 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx efficiencyProperty.setShortTitle(courseEnv.getRunStructure().getRootNode().getShortTitle()); efficiencyProperty.setTitle(courseEnv.getRunStructure().getRootNode().getLongTitle()); fillEfficiencyStatement(efficiencyStatement, lastModifications, efficiencyProperty); - dbInstance.getCurrentEntityManager().persist(efficiencyProperty); + efficiencyProperty = persistOrLoad(efficiencyProperty, repoEntry, assessedIdentity); if (debug) { log.debug("creating new efficiency statement property::{} for id::{} repoEntry:: {}", efficiencyProperty.getKey(), assessedIdentity.getKey() , repoEntry.getKey()); @@ -254,6 +257,23 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(ace, courseOres); } + private UserEfficiencyStatementImpl persistOrLoad(UserEfficiencyStatementImpl efficiencyProperty, RepositoryEntry entry, Identity identity) { + try { + dbInstance.commit(); + dbInstance.getCurrentEntityManager().persist(efficiencyProperty); + dbInstance.commit(); + } catch(PersistenceException e) { + if(e.getCause() instanceof ConstraintViolationException) { + log.warn("", e); + dbInstance.rollback(); + efficiencyProperty = getUserEfficiencyStatementFull(entry, identity); + } else { + log.error("", e); + } + } + return efficiencyProperty; + } + public void fillEfficiencyStatement(EfficiencyStatement efficiencyStatement, AssessmentNodesLastModified lastModifications, UserEfficiencyStatementImpl efficiencyProperty) { if(lastModifications != null) { if(lastModifications.getLastUserModified() != null -- GitLab