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