keycloak-aplcache

Added SocialLoader to social core

12/11/2013 11:44:47 AM

Details

diff --git a/services/src/main/java/org/keycloak/services/FormService.java b/services/src/main/java/org/keycloak/services/FormService.java
index 83aac73..f525bbd 100755
--- a/services/src/main/java/org/keycloak/services/FormService.java
+++ b/services/src/main/java/org/keycloak/services/FormService.java
@@ -25,15 +25,14 @@ import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.services.resources.flows.FormFlows;
+import org.keycloak.social.SocialLoader;
 import org.keycloak.social.SocialProvider;
 
 import javax.ws.rs.core.MultivaluedMap;
 import java.net.URI;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.ServiceLoader;
 
 /**
  * @author <a href="mailto:vrockai@redhat.com">Viliam Rockai</a>
@@ -98,8 +97,7 @@ public interface FormService {
             socialProviders = new LinkedList<SocialProvider>();
             Map<String, String> socialConfig = realm.getSocialConfig();
             if (socialConfig != null) {
-                for (Iterator<SocialProvider> itr = ServiceLoader.load(org.keycloak.social.SocialProvider.class).iterator(); itr.hasNext(); ) {
-                    SocialProvider p = itr.next();
+                for (SocialProvider p : SocialLoader.load()) {
                     if (socialConfig.containsKey(p.getId() + ".key") && socialConfig.containsKey(p.getId() + ".secret")) {
                         socialProviders.add(p);
                     }
diff --git a/services/src/main/java/org/keycloak/services/resources/SocialResource.java b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
index 54dac0d..83fa595 100755
--- a/services/src/main/java/org/keycloak/services/resources/SocialResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
@@ -39,6 +39,7 @@ import org.keycloak.social.AuthCallback;
 import org.keycloak.social.AuthRequest;
 import org.keycloak.social.RequestDetails;
 import org.keycloak.social.SocialConstants;
+import org.keycloak.social.SocialLoader;
 import org.keycloak.social.SocialProvider;
 import org.keycloak.social.SocialProviderConfig;
 import org.keycloak.social.SocialProviderException;
@@ -63,11 +64,9 @@ import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriInfo;
 import java.net.URISyntaxException;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.ServiceLoader;
 import java.util.UUID;
 
 /**
@@ -114,7 +113,7 @@ public class SocialResource {
         Map<String, String[]> queryParams = getQueryParams();
 
         RequestDetails requestData = getRequestDetails(queryParams);
-        SocialProvider provider = getProvider(requestData.getProviderId());
+        SocialProvider provider = SocialLoader.load(requestData.getProviderId());
 
         String realmId = requestData.getClientAttribute("realmId");
 
@@ -179,7 +178,7 @@ public class SocialResource {
                 }
 
                 realm.addSocialLink(user, socialLink);
-            }  else {
+            } else {
                 // Redirect user to registration screen with prefilled data from social provider
                 MultivaluedMap<String, String> formData = fillRegistrationFormWithSocialData(socialUser);
 
@@ -212,13 +211,13 @@ public class SocialResource {
     @GET
     @Path("{realm}/login")
     public Response redirectToProviderAuth(@PathParam("realm") final String realmId,
-            @QueryParam("provider_id") final String providerId, @QueryParam("client_id") final String clientId,
-            @QueryParam("scope") final String scope, @QueryParam("state") final String state,
-            @QueryParam("redirect_uri") final String redirectUri) {
+                                           @QueryParam("provider_id") final String providerId, @QueryParam("client_id") final String clientId,
+                                           @QueryParam("scope") final String scope, @QueryParam("state") final String state,
+                                           @QueryParam("redirect_uri") final String redirectUri) {
         RealmManager realmManager = new RealmManager(session);
         RealmModel realm = realmManager.getRealm(realmId);
 
-        SocialProvider provider = getProvider(providerId);
+        SocialProvider provider = SocialLoader.load(providerId);
         if (provider == null) {
             return Flows.forms(realm, request, uriInfo).setError("Social provider not found").forwardToErrorPage();
         }
@@ -305,11 +304,7 @@ public class SocialResource {
     }
 
     private RequestDetails getRequestDetails(Map<String, String[]> queryParams) {
-        Iterator<SocialProvider> itr = ServiceLoader.load(SocialProvider.class).iterator();
-
-        while (itr.hasNext()) {
-            SocialProvider provider = itr.next();
-
+        for (SocialProvider provider : SocialLoader.load()) {
             if (queryParams.containsKey(provider.getRequestIdParamName())) {
                 String requestId = queryParams.get(provider.getRequestIdParamName())[0];
                 if (socialRequestManager.isRequestId(requestId)) {
@@ -321,19 +316,6 @@ public class SocialResource {
         return null;
     }
 
-    private SocialProvider getProvider(String providerId) {
-        Iterator<SocialProvider> itr = ServiceLoader.load(SocialProvider.class).iterator();
-
-        while (itr.hasNext()) {
-            SocialProvider provider = itr.next();
-            if (provider.getId().equals(providerId)) {
-                return provider;
-            }
-        }
-
-        return null;
-    }
-
     private Map<String, String[]> getQueryParams() {
         Map<String, String[]> queryParams = new HashMap<String, String[]>();
         for (Entry<String, List<String>> e : uriInfo.getQueryParameters().entrySet()) {
diff --git a/social/core/src/main/java/org/keycloak/social/SocialLoader.java b/social/core/src/main/java/org/keycloak/social/SocialLoader.java
new file mode 100644
index 0000000..5dfb44a
--- /dev/null
+++ b/social/core/src/main/java/org/keycloak/social/SocialLoader.java
@@ -0,0 +1,31 @@
+package org.keycloak.social;
+
+import java.util.ServiceLoader;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+public class SocialLoader {
+
+    private SocialLoader() {
+    }
+
+    public static SocialProvider load(String id) {
+        if (id == null) {
+            throw new NullPointerException();
+        }
+
+        for (SocialProvider s : load()) {
+            if (id.equals(s.getId())) {
+                return s;
+            }
+        }
+
+        return null;
+    }
+
+    public static Iterable<SocialProvider> load() {
+        return ServiceLoader.load(SocialProvider.class);
+    }
+
+}