keycloak-memoizeit

KEYCLOAK-8555 queried only realms with user storage provider

10/12/2018 6:39:49 PM

Details

diff --git a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmCacheSession.java b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmCacheSession.java
index ccb4ad7..e781c6f 100755
--- a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmCacheSession.java
+++ b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmCacheSession.java
@@ -452,12 +452,22 @@ public class RealmCacheSession implements CacheRealmProvider {
     static String getRealmByNameCacheKey(String name) {
         return "realm.query.by.name." + name;
     }
+    
+    @Override
+    public List<RealmModel> getRealmsWithProviderType(Class<?> type) {
+        // Retrieve realms from backend
+        List<RealmModel> backendRealms = getRealmDelegate().getRealmsWithProviderType(type);
+        return getRealms(backendRealms);
+    }
 
     @Override
     public List<RealmModel> getRealms() {
         // Retrieve realms from backend
         List<RealmModel> backendRealms = getRealmDelegate().getRealms();
+        return getRealms(backendRealms);
+    }
 
+    private List<RealmModel> getRealms(List<RealmModel> backendRealms) {
         // Return cache delegates to ensure cache invalidated during write operations
         List<RealmModel> cachedRealms = new LinkedList<RealmModel>();
         for (RealmModel realm : backendRealms) {
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java
index 7fa765d..6fbf1c0 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/RealmEntity.java
@@ -51,6 +51,7 @@ import java.util.Set;
 @NamedQueries({
         @NamedQuery(name="getAllRealmIds", query="select realm.id from RealmEntity realm"),
         @NamedQuery(name="getRealmIdByName", query="select realm.id from RealmEntity realm where realm.name = :name"),
+        @NamedQuery(name="getRealmIdsWithProviderType", query="select distinct c.realm.id from ComponentEntity c where c.providerType = :providerType"),
 })
 public class RealmEntity {
     @Id
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java
index da2df69..cf5835a 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java
@@ -92,10 +92,21 @@ public class JpaRealmProvider implements RealmProvider {
         RealmAdapter adapter = new RealmAdapter(session, em, realm);
         return adapter;
     }
+    
+    @Override
+    public List<RealmModel> getRealmsWithProviderType(Class<?> providerType) {
+        TypedQuery<String> query = em.createNamedQuery("getRealmIdsWithProviderType", String.class);
+        query.setParameter("providerType", providerType.getName());
+        return getRealms(query);
+    }
 
     @Override
     public List<RealmModel> getRealms() {
         TypedQuery<String> query = em.createNamedQuery("getAllRealmIds", String.class);
+        return getRealms(query);
+    }
+
+    private List<RealmModel> getRealms(TypedQuery<String> query) {
         List<String> entities = query.getResultList();
         List<RealmModel> realms = new ArrayList<RealmModel>();
         for (String id : entities) {
diff --git a/model/jpa/src/main/resources/META-INF/jpa-changelog-4.6.0.xml b/model/jpa/src/main/resources/META-INF/jpa-changelog-4.6.0.xml
index 3569849..c902a8e 100644
--- a/model/jpa/src/main/resources/META-INF/jpa-changelog-4.6.0.xml
+++ b/model/jpa/src/main/resources/META-INF/jpa-changelog-4.6.0.xml
@@ -23,5 +23,11 @@
             <where>NAME LIKE 'group.resource.%'</where>
         </update>
     </changeSet>
+    
+    <changeSet author="gideonray@gmail.com" id="4.6.0-KEYCLOAK-8555">
+        <createIndex tableName="COMPONENT" indexName="IDX_COMPONENT_PROVIDER_TYPE">
+            <column name="PROVIDER_TYPE" type="VARCHAR(255)"/>
+        </createIndex>
+    </changeSet>
  
 </databaseChangeLog>
diff --git a/server-spi/src/main/java/org/keycloak/models/RealmProvider.java b/server-spi/src/main/java/org/keycloak/models/RealmProvider.java
index 5542953..3423b51 100755
--- a/server-spi/src/main/java/org/keycloak/models/RealmProvider.java
+++ b/server-spi/src/main/java/org/keycloak/models/RealmProvider.java
@@ -77,6 +77,7 @@ public interface RealmProvider extends Provider, ClientProvider {
 
 
     List<RealmModel> getRealms();
+    List<RealmModel> getRealmsWithProviderType(Class<?> type);
     boolean removeRealm(String id);
     void close();
 
diff --git a/services/src/main/java/org/keycloak/services/managers/UserStorageSyncManager.java b/services/src/main/java/org/keycloak/services/managers/UserStorageSyncManager.java
index 90d102a..a7d0e32 100755
--- a/services/src/main/java/org/keycloak/services/managers/UserStorageSyncManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/UserStorageSyncManager.java
@@ -58,7 +58,7 @@ public class UserStorageSyncManager {
 
             @Override
             public void run(KeycloakSession session) {
-                List<RealmModel> realms = session.realms().getRealms();
+                List<RealmModel> realms = session.realms().getRealmsWithProviderType(UserStorageProvider.class);
                 for (final RealmModel realm : realms) {
                     List<UserStorageProviderModel> providers = realm.getUserStorageProviders();
                     for (final UserStorageProviderModel provider : providers) {