keycloak-aplcache

Merge pull request #1984 from mstruk/providers-init Prevent

1/7/2016 8:57:12 AM

Details

diff --git a/services/src/main/java/org/keycloak/provider/ProviderManager.java b/services/src/main/java/org/keycloak/provider/ProviderManager.java
index 6246d83..3f250da 100644
--- a/services/src/main/java/org/keycloak/provider/ProviderManager.java
+++ b/services/src/main/java/org/keycloak/provider/ProviderManager.java
@@ -3,6 +3,7 @@ package org.keycloak.provider;
 import org.jboss.logging.Logger;
 
 import java.util.HashMap;
+import java.util.IdentityHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -52,10 +53,17 @@ public class ProviderManager {
         List<ProviderFactory> factories = cache.get(spi.getName());
         if (factories == null) {
             factories = new LinkedList<ProviderFactory>();
+            IdentityHashMap factoryClasses = new IdentityHashMap();
             for (ProviderLoader loader : loaders) {
                 List<ProviderFactory> f = loader.load(spi);
                 if (f != null) {
-                    factories.addAll(f);
+                    for (ProviderFactory pf: f) {
+                        // make sure there are no duplicates
+                        if (!factoryClasses.containsKey(pf.getClass())) {
+                            factories.add(pf);
+                            factoryClasses.put(pf.getClass(), pf);
+                        }
+                    }
                 }
             }
         }