From c51a87e5330aef29775131c129d4ae480d46d450 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Wed, 22 Jan 2014 08:34:47 +0100
Subject: [PATCH] OO-948: use "putIfAbsent" instead of doInSync for the
 calendar's cache

---
 .../calendar/ICalFileCalendarManager.java       | 17 ++++++-----------
 .../org/olat/core/util/cache/CacheWrapper.java  |  2 ++
 .../infinispan/InfinispanCacheWrapper.java      |  7 +++++++
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java b/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java
index e010140f524..94a7b5c5b2b 100644
--- a/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java
+++ b/src/main/java/org/olat/commons/calendar/ICalFileCalendarManager.java
@@ -164,25 +164,20 @@ public class ICalFileCalendarManager extends BasicManager implements CalendarMan
 		String key = getKeyFor(type, calendarID);
 		Kalendar cal = calendarCache.get(key);
 		if(cal == null) {
-			//o_clusterOK by:cg
-			OLATResourceable calOres = OresHelper.createOLATResourceableType(getKeyFor(type,calendarID));
-			cal = CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync( calOres, new SyncerCallback<Kalendar>() {
-				public Kalendar execute() {
-					return getCalendarFromCache(type, calendarID);
-				}
-			});
+			cal = getCalendarFromCache(type, calendarID);
 		}
 		return cal;
 	}
 
 	private Kalendar getCalendarFromCache(final String callType, final String callCalendarID) {
-		String calKey = getKeyFor(callType,callCalendarID);
-		OLATResourceable calOres = OresHelper.createOLATResourceableType(calKey);		
-		CoordinatorManager.getInstance().getCoordinator().getSyncer().assertAlreadyDoInSyncFor(calOres);
+		String calKey = getKeyFor(callType,callCalendarID);	
 		Kalendar cal = calendarCache.get(calKey);
 		if (cal == null) {
 			cal = loadOrCreateCalendar(callType, callCalendarID);
-			calendarCache.put(calKey, cal);
+			Kalendar cacheCal = calendarCache.putIfAbsent(calKey, cal);
+			if(cacheCal != null) {
+				cal = cacheCal;
+			}
 		}
 		return cal;
 	}
diff --git a/src/main/java/org/olat/core/util/cache/CacheWrapper.java b/src/main/java/org/olat/core/util/cache/CacheWrapper.java
index 17e3697c8cd..207f6d12994 100644
--- a/src/main/java/org/olat/core/util/cache/CacheWrapper.java
+++ b/src/main/java/org/olat/core/util/cache/CacheWrapper.java
@@ -89,6 +89,8 @@ public interface CacheWrapper<U, V extends Serializable> {
 	 */
 	public V put(U key, V value);
 	
+	public V putIfAbsent(U key, V value);
+	
 	/**
 	 * In the case of distributed cache, the list can be partial and
 	 * you must carefully setup your cache.
diff --git a/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheWrapper.java b/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheWrapper.java
index ae9c1f93ec0..26af5fe4de2 100644
--- a/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheWrapper.java
+++ b/src/main/java/org/olat/core/util/cache/infinispan/InfinispanCacheWrapper.java
@@ -102,4 +102,11 @@ public class InfinispanCacheWrapper<U,V extends Serializable> implements CacheWr
 		V oldOne = cache.put(key, value);
 		return oldOne;
 	}
+
+	@Override
+	public V putIfAbsent(U key, V value) {
+		return cache.putIfAbsent(key, value);
+	}
+	
+	
 }
\ No newline at end of file
-- 
GitLab