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) {