keycloak-uncached

Details

diff --git a/server-spi/src/main/java/org/keycloak/models/KeycloakSessionFactory.java b/server-spi/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
index 3aa15d8..0028ae7 100755
--- a/server-spi/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
+++ b/server-spi/src/main/java/org/keycloak/models/KeycloakSessionFactory.java
@@ -20,8 +20,10 @@ package org.keycloak.models;
 import org.keycloak.provider.Provider;
 import org.keycloak.provider.ProviderEventManager;
 import org.keycloak.provider.ProviderFactory;
+import org.keycloak.provider.Spi;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
@@ -30,6 +32,8 @@ import java.util.List;
 public interface KeycloakSessionFactory extends ProviderEventManager {
     KeycloakSession create();
 
+    Set<Spi> getSpis();
+
     <T extends Provider> ProviderFactory<T> getProviderFactory(Class<T> clazz);
 
     <T extends Provider> ProviderFactory<T> getProviderFactory(Class<T> clazz, String id);
diff --git a/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java b/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java
index 3ca473b..90b495c 100755
--- a/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java
+++ b/services/src/main/java/org/keycloak/services/DefaultKeycloakSessionFactory.java
@@ -40,6 +40,7 @@ public class DefaultKeycloakSessionFactory implements KeycloakSessionFactory {
 
     private static final ServicesLogger logger = ServicesLogger.ROOT_LOGGER;
 
+    private Set<Spi> spis = new HashSet<>();
     private Map<Class<? extends Provider>, String> provider = new HashMap<Class<? extends Provider>, String>();
     private Map<Class<? extends Provider>, Map<String, ProviderFactory>> factoriesMap = new HashMap<Class<? extends Provider>, Map<String, ProviderFactory>>();
     protected CopyOnWriteArrayList<ProviderEventListener> listeners = new CopyOnWriteArrayList<ProviderEventListener>();
@@ -80,6 +81,8 @@ public class DefaultKeycloakSessionFactory implements KeycloakSessionFactory {
 
     protected void loadSPIs(ProviderManager pm, ServiceLoader<Spi> load) {
         for (Spi spi : load) {
+            spis.add(spi);
+
             Map<String, ProviderFactory> factories = new HashMap<String, ProviderFactory>();
             factoriesMap.put(spi.getProviderClass(), factories);
 
@@ -139,6 +142,11 @@ public class DefaultKeycloakSessionFactory implements KeycloakSessionFactory {
     }
 
     @Override
+    public Set<Spi> getSpis() {
+        return spis;
+    }
+
+    @Override
     public <T extends Provider> ProviderFactory<T> getProviderFactory(Class<T> clazz) {
          return getProviderFactory(clazz, provider.get(clazz));
     }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/info/ServerInfoAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/info/ServerInfoAdminResource.java
index 4454ccb..3ea8fd1 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/info/ServerInfoAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/info/ServerInfoAdminResource.java
@@ -95,10 +95,7 @@ public class ServerInfoAdminResource {
     private void setProviders(ServerInfoRepresentation info) {
         LinkedHashMap<String, SpiInfoRepresentation> spiReps = new LinkedHashMap<>();
 
-        List<Spi> spis = new LinkedList<>();
-        for (Spi spi : ServiceLoader.load(Spi.class)) {
-            spis.add(spi);
-        }
+        List<Spi> spis = new LinkedList<>(session.getKeycloakSessionFactory().getSpis());
         Collections.sort(spis, new Comparator<Spi>() {
             @Override
             public int compare(Spi s1, Spi s2) {