From a22cae083eef1fd774fbd4a2480e8c8af366c1e7 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 2 Feb 2016 08:59:16 +0100
Subject: [PATCH] OO-1873: optimize the synchronized statement in the course
 node factory

---
 .../olat/course/nodes/CourseNodeFactory.java  | 26 ++++++++++++++-----
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java
index 4cd2375a1c0..675156d733b 100644
--- a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java
+++ b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java
@@ -35,6 +35,7 @@ import java.util.Map;
 
 import org.olat.NewControllerFactory;
 import org.olat.core.CoreSpringFactory;
+import org.olat.core.configuration.PreWarm;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.logging.OLog;
@@ -51,7 +52,7 @@ import org.olat.repository.handlers.RepositoryHandlerFactory;
  * @author Mike Stock
  * @author guido
  */
-public class CourseNodeFactory {
+public class CourseNodeFactory implements PreWarm {
 	
 	private static final OLog log = Tracing.createLoggerFor(CourseNodeFactory.class);
 
@@ -73,6 +74,12 @@ public class CourseNodeFactory {
 		return INSTANCE;
 	}
 
+	@Override
+	public void run() {
+		getAllCourseNodeConfigurations();
+	}
+
+
 	/**
 	 * @return the list of enabled aliases
 	 */
@@ -88,13 +95,18 @@ public class CourseNodeFactory {
 		return alias;
 	}
 
-	private synchronized Map<String,CourseNodeConfiguration> getAllCourseNodeConfigurations() {
+	private Map<String,CourseNodeConfiguration> getAllCourseNodeConfigurations() {
 		if(allCourseNodeConfigurations == null) {
-			allCourseNodeConfigurations = new HashMap<String, CourseNodeConfiguration>();
-			Map<String, CourseNodeConfiguration> courseNodeConfigurationMap = CoreSpringFactory.getBeansOfType(CourseNodeConfiguration.class);
-			Collection<CourseNodeConfiguration> courseNodeConfigurationValues = courseNodeConfigurationMap.values();
-			for (CourseNodeConfiguration courseNodeConfiguration : courseNodeConfigurationValues) {
-				allCourseNodeConfigurations.put(courseNodeConfiguration.getAlias(), courseNodeConfiguration);
+			synchronized(INSTANCE) {
+				if(allCourseNodeConfigurations == null) {
+					Map<String, CourseNodeConfiguration> configurationMap = new HashMap<>();
+					Map<String, CourseNodeConfiguration> courseNodeConfigurationMap = CoreSpringFactory.getBeansOfType(CourseNodeConfiguration.class);
+					Collection<CourseNodeConfiguration> courseNodeConfigurationValues = courseNodeConfigurationMap.values();
+					for (CourseNodeConfiguration courseNodeConfiguration : courseNodeConfigurationValues) {
+						configurationMap.put(courseNodeConfiguration.getAlias(), courseNodeConfiguration);
+					}
+					allCourseNodeConfigurations = Collections.unmodifiableMap(configurationMap);
+				}
 			}
 		}
 		return allCourseNodeConfigurations;
-- 
GitLab