keycloak-aplcache

KEYCLOAK-1369 GUI order attribute of Social providers is reflected

6/1/2015 12:01:57 PM

Details

diff --git a/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/model/AccountFederatedIdentityBean.java b/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/model/AccountFederatedIdentityBean.java
index 1c779ba..1f0290d 100755
--- a/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/model/AccountFederatedIdentityBean.java
+++ b/forms/account-freemarker/src/main/java/org/keycloak/account/freemarker/model/AccountFederatedIdentityBean.java
@@ -9,13 +9,17 @@ import org.keycloak.services.resources.AccountService;
 import org.keycloak.services.Urls;
 
 import javax.ws.rs.core.UriBuilder;
+
 import java.net.URI;
+import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
+ * @author <a href="mailto:velias@redhat.com">Vlastimil Elias</a>
  */
 public class AccountFederatedIdentityBean {
 
@@ -26,11 +30,11 @@ public class AccountFederatedIdentityBean {
     public AccountFederatedIdentityBean(KeycloakSession session, RealmModel realm, UserModel user, URI baseUri, String stateChecker) {
         this.session = session;
         URI accountIdentityUpdateUri = Urls.accountFederatedIdentityUpdate(baseUri, realm.getName());
-        this.identities = new LinkedList<FederatedIdentityEntry>();
 
         List<IdentityProviderModel> identityProviders = realm.getIdentityProviders();
         Set<FederatedIdentityModel> identities = session.users().getFederatedIdentities(user, realm);
 
+        Set<FederatedIdentityEntry> orderedSet = new TreeSet<>(IdentityProviderComparator.INSTANCE);       
         int availableIdentities = 0;
         if (identityProviders != null && !identityProviders.isEmpty()) {
             for (IdentityProviderModel provider : identityProviders) {
@@ -49,10 +53,13 @@ public class AccountFederatedIdentityBean {
                         .queryParam("stateChecker", stateChecker)
                         .build().toString();
 
-                FederatedIdentityEntry entry = new FederatedIdentityEntry(identity, provider.getAlias(), provider.getAlias(), actionUrl);
-                this.identities.add(entry);
+                FederatedIdentityEntry entry = new FederatedIdentityEntry(identity, provider.getAlias(), provider.getAlias(), actionUrl,
+                		  															provider.getConfig() != null ? provider.getConfig().get("guiOrder") : null);
+                orderedSet.add(entry);
             }
         }
+        
+        this.identities = new LinkedList<FederatedIdentityEntry>(orderedSet); 
 
         // Removing last social provider is not possible if you don't have other possibility to authenticate
         this.removeLinkPossible = availableIdentities > 1 || user.getFederationLink() != null || AccountService.isPasswordSet(user);
@@ -81,13 +88,15 @@ public class AccountFederatedIdentityBean {
         private final String providerId;
 		private final String providerName;
         private final String actionUrl;
+        private final String guiOrder;
 
-		public FederatedIdentityEntry(FederatedIdentityModel federatedIdentityModel, String providerId, String providerName, String actionUrl
+		public FederatedIdentityEntry(FederatedIdentityModel federatedIdentityModel, String providerId, String providerName, String actionUrl, String guiOrder
 				) {
             this.federatedIdentityModel = federatedIdentityModel;
             this.providerId = providerId;
             this.providerName = providerName;
             this.actionUrl = actionUrl;
+            this.guiOrder = guiOrder;
         }
 
         public String getProviderId() {
@@ -113,5 +122,43 @@ public class AccountFederatedIdentityBean {
         public String getActionUrl() {
             return actionUrl;
         }
+        
+        public String getGuiOrder() {
+            return guiOrder;
+        }
     }
-}
+    
+	public static class IdentityProviderComparator implements Comparator<FederatedIdentityEntry> {
+
+		public static IdentityProviderComparator INSTANCE = new IdentityProviderComparator();
+
+		private IdentityProviderComparator() {
+
+		}
+
+		@Override
+		public int compare(FederatedIdentityEntry o1, FederatedIdentityEntry o2) {
+
+			int o1order = parseOrder(o1);
+			int o2order = parseOrder(o2);
+
+			if (o1order > o2order)
+				return 1;
+			else if (o1order < o2order)
+				return -1;
+
+			return 1;
+		}
+
+		private int parseOrder(FederatedIdentityEntry ip) {
+			if (ip != null && ip.getGuiOrder() != null) {
+				try {
+					return Integer.parseInt(ip.getGuiOrder());
+				} catch (NumberFormatException e) {
+					// ignore it and use defaulr
+				}
+			}
+			return 10000;
+		}
+	}
+}
\ No newline at end of file