keycloak-aplcache

Merge pull request #1190 from mposolda/master KEYCLOAK-1240

4/28/2015 3:44:26 PM

Details

diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java
index 469973f..f73f752 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/DefaultCacheRealmProvider.java
@@ -15,6 +15,7 @@ import org.keycloak.models.cache.entities.CachedRole;
 
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -196,8 +197,16 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
 
     @Override
     public List<RealmModel> getRealms() {
-        // we don't cache this for now
-        return getDelegate().getRealms();
+        // Retrieve realms from backend
+        List<RealmModel> backendRealms = getDelegate().getRealms();
+
+        // Return cache delegates to ensure cache invalidated during write operations
+        List<RealmModel> cachedRealms = new LinkedList<RealmModel>();
+        for (RealmModel realm : backendRealms) {
+            RealmModel cached = session.realms().getRealm(realm.getId());
+            cachedRealms.add(cached);
+        }
+        return cachedRealms;
     }
 
     @Override
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/CacheTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/CacheTest.java
index 1237cfa..e16ae05 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/model/CacheTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/model/CacheTest.java
@@ -1,5 +1,7 @@
 package org.keycloak.testsuite.model;
 
+import java.util.List;
+
 import org.junit.Assert;
 import org.junit.ClassRule;
 import org.junit.Test;
@@ -32,7 +34,17 @@ public class CacheTest {
         {
             // update realm, then get an AppModel and change it.  The AppModel would not be a cache adapter
             KeycloakSession session = kc.startSession();
-            RealmModel realm = session.realms().getRealmByName("test");
+
+            // KEYCLOAK-1240 - obtain the realm via session.realms().getRealms()
+            RealmModel realm = null;
+            List<RealmModel> realms = session.realms().getRealms();
+            for (RealmModel current : realms) {
+                if ("test".equals(current.getName())) {
+                    realm = current;
+                    break;
+                }
+            }
+
             Assert.assertTrue(realm instanceof org.keycloak.models.cache.RealmAdapter);
             realm.setAccessCodeLifespanLogin(200);
             ClientModel testApp = realm.getClientByClientId("test-app");
@@ -44,6 +56,7 @@ public class CacheTest {
         {
             KeycloakSession session = kc.startSession();
             RealmModel realm = session.realms().getRealmByName("test");
+            Assert.assertEquals(200, realm.getAccessCodeLifespanLogin());
             ClientModel testApp = session.realms().getClientById(appId, realm);
             Assert.assertFalse(testApp.isEnabled());
             kc.stopSession(session, true);