From 553f8a6f271c03b8120134ebd68e5bb3e5a647cb Mon Sep 17 00:00:00 2001 From: mposolda Date: Tue, 28 Apr 2015 19:24:05 +0200 Subject: [PATCH] KEYCLOAK-1240 Fix stale cache issue --- .../models/cache/DefaultCacheRealmProvider.java | 13 +++++++++++-- .../org/keycloak/testsuite/model/CacheTest.java | 15 ++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) 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 469973f92c..f73f7529fb 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 getRealms() { - // we don't cache this for now - return getDelegate().getRealms(); + // Retrieve realms from backend + List backendRealms = getDelegate().getRealms(); + + // Return cache delegates to ensure cache invalidated during write operations + List cachedRealms = new LinkedList(); + 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 1237cfa8ca..e16ae053ec 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 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);