From 9ce4539d2290a64bfaca96abd544f3dc5d22c7a3 Mon Sep 17 00:00:00 2001 From: Steven Hawkins Date: Thu, 3 Apr 2025 08:11:59 -0400 Subject: [PATCH] fix: switching default client scopes to lazy loading (#38553) closes: #38552 Signed-off-by: Steve Hawkins --- .../models/cache/infinispan/RealmAdapter.java | 2 +- .../infinispan/entities/CachedRealm.java | 24 ++++++++----------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmAdapter.java b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmAdapter.java index b9b94030611..39bc4a5bdd6 100755 --- a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmAdapter.java +++ b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmAdapter.java @@ -1610,7 +1610,7 @@ public class RealmAdapter implements CachedRealmModel { @Override public Stream getDefaultClientScopesStream(boolean defaultScope) { if (isUpdated()) return updated.getDefaultClientScopesStream(defaultScope); - List clientScopeIds = defaultScope ? cached.getDefaultDefaultClientScopes() : cached.getOptionalDefaultClientScopes(); + List clientScopeIds = defaultScope ? cached.getDefaultDefaultClientScopes(modelSupplier) : cached.getOptionalDefaultClientScopes(modelSupplier); return clientScopeIds.stream() .map(scope -> cacheSession.getClientScopeById(this, scope)) .filter(Objects::nonNull); diff --git a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/entities/CachedRealm.java b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/entities/CachedRealm.java index f32822fb02b..69580367ace 100755 --- a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/entities/CachedRealm.java +++ b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/entities/CachedRealm.java @@ -165,8 +165,8 @@ public class CachedRealm extends AbstractExtendableRevisioned { private boolean allowUserManagedAccess; protected List defaultGroups; - protected List defaultDefaultClientScopes = new LinkedList<>(); - protected List optionalDefaultClientScopes = new LinkedList<>(); + protected DefaultLazyLoader> defaultDefaultClientScopes; + protected DefaultLazyLoader> optionalDefaultClientScopes; protected boolean internationalizationEnabled; protected Set supportedLocales; protected String defaultLocale; @@ -268,7 +268,10 @@ public class CachedRealm extends AbstractExtendableRevisioned { ClientModel masterAdminClient = model.getMasterAdminClient(); this.masterAdminClient = (masterAdminClient != null) ? masterAdminClient.getId() : null; - cacheClientScopes(model); + defaultDefaultClientScopes = new DefaultLazyLoader<>(realm -> realm.getDefaultClientScopesStream(true).map(ClientScopeModel::getId) + .collect(Collectors.toList()), null); + optionalDefaultClientScopes = new DefaultLazyLoader<>(realm -> realm.getDefaultClientScopesStream(false).map(ClientScopeModel::getId) + .collect(Collectors.toList()), null); internationalizationEnabled = model.isInternationalizationEnabled(); supportedLocales = model.getSupportedLocalesStream().collect(Collectors.toSet()); @@ -326,13 +329,6 @@ public class CachedRealm extends AbstractExtendableRevisioned { realmLocalizationTexts = model.getRealmLocalizationTexts(); } - protected void cacheClientScopes(RealmModel model) { - defaultDefaultClientScopes = model.getDefaultClientScopesStream(true).map(ClientScopeModel::getId) - .collect(Collectors.toList()); - optionalDefaultClientScopes = model.getDefaultClientScopesStream(false).map(ClientScopeModel::getId) - .collect(Collectors.toList()); - } - public String getMasterAdminClient() { return masterAdminClient; } @@ -706,12 +702,12 @@ public class CachedRealm extends AbstractExtendableRevisioned { return defaultGroups; } - public List getDefaultDefaultClientScopes() { - return defaultDefaultClientScopes; + public List getDefaultDefaultClientScopes(Supplier modelSupplier) { + return defaultDefaultClientScopes.get(modelSupplier); } - public List getOptionalDefaultClientScopes() { - return optionalDefaultClientScopes; + public List getOptionalDefaultClientScopes(Supplier modelSupplier) { + return optionalDefaultClientScopes.get(modelSupplier); } public List getAuthenticationFlowList() {