From b99aba0bb9ba3226616258d648bb938f75af608a Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 31 Mar 2017 10:19:49 +0200
Subject: [PATCH] OO-2667: hardened the code in score accounting

---
 .../course/run/scoring/ScoreAccounting.java   | 24 +++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java b/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java
index 70ab31756ba..30bbdea5e06 100644
--- a/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java
+++ b/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java
@@ -31,6 +31,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.hibernate.LazyInitializationException;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
@@ -46,6 +48,8 @@ import org.olat.course.nodes.PersistentAssessableCourseNode;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
+import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryService;
 import org.olat.repository.model.RepositoryEntryLifecycle;
 
 /**
@@ -205,8 +209,7 @@ public class ScoreAccounting {
 						if(failedType == null || failedType == FailedEvaluationType.failedAsNotPassed) {
 							passed = Boolean.FALSE;
 						} else if(failedType == FailedEvaluationType.failedAsNotPassedAfterEndDate) {
-							CourseGroupManager cgm = userCourseEnvironment.getCourseEnvironment().getCourseGroupManager();
-							RepositoryEntryLifecycle lifecycle = cgm.getCourseEntry().getLifecycle();
+							RepositoryEntryLifecycle lifecycle = getRepositoryEntryLifecycle();
 							if(lifecycle != null && lifecycle.getValidTo() != null && lifecycle.getValidTo().compareTo(new Date()) < 0) {
 								passed = Boolean.FALSE;
 							}
@@ -239,6 +242,23 @@ public class ScoreAccounting {
 			return se;
 		}
 		
+		private RepositoryEntryLifecycle getRepositoryEntryLifecycle() {
+			CourseGroupManager cgm = userCourseEnvironment.getCourseEnvironment().getCourseGroupManager();
+			try {
+				RepositoryEntryLifecycle lifecycle = cgm.getCourseEntry().getLifecycle();
+				if(lifecycle != null) {
+					lifecycle.getValidTo();//
+				}
+				return lifecycle;
+			} catch (LazyInitializationException e) {
+				//OO-2667: only seen in 1 instance but as it's a critical place, secure the system
+				RepositoryEntry reloadedEntry = CoreSpringFactory.getImpl(RepositoryService.class)
+						.loadByKey(cgm.getCourseEntry().getKey());
+				userCourseEnvironment.getCourseEnvironment().updateCourseEntry(reloadedEntry);
+				return reloadedEntry.getLifecycle();
+			}
+		}
+		
 		private boolean same(AssessmentEvaluation se, AssessmentEntry entry) {
 			boolean same = true;
 			
-- 
GitLab