You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2014/03/18 16:20:45 UTC

[1/5] git commit: Upgrade http client module (4.3.1)

Repository: incubator-usergrid
Updated Branches:
  refs/pull/75/head [created] c0d8fed0f
  refs/pull/75/merge [created] 04ca48f81


Upgrade http client module (4.3.1)


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/76bbedfe
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/76bbedfe
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/76bbedfe

Branch: refs/pull/75/head
Commit: 76bbedfe7eae1b0f419cad3962a5472f37f89ee7
Parents: 5a7915c
Author: Sungju Jin <su...@softwaregeeks.org>
Authored: Tue Mar 18 23:17:16 2014 +0900
Committer: Sungju Jin <su...@softwaregeeks.org>
Committed: Tue Mar 18 23:23:03 2014 +0900

----------------------------------------------------------------------
 stack/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/76bbedfe/stack/pom.xml
----------------------------------------------------------------------
diff --git a/stack/pom.xml b/stack/pom.xml
index 3a24790..45d89e1 100644
--- a/stack/pom.xml
+++ b/stack/pom.xml
@@ -259,7 +259,7 @@
       <dependency>
         <groupId>org.apache.httpcomponents</groupId>
         <artifactId>httpclient</artifactId>
-        <version>4.1.3</version>
+        <version>4.3.1</version>
         <exclusions>
           <exclusion>
             <groupId>commons-codec</groupId>


[4/5] git commit: Enhance performance in 3rd party auth module (Connection pooling)

Posted by sn...@apache.org.
Enhance performance in 3rd party auth module (Connection pooling)


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/c0d8fed0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/c0d8fed0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/c0d8fed0

Branch: refs/pull/75/head
Commit: c0d8fed0ff81c03606d2c4450a3261825234af12
Parents: 76bbedf
Author: Sungju Jin <su...@softwaregeeks.org>
Authored: Tue Mar 18 23:19:33 2014 +0900
Committer: Sungju Jin <su...@softwaregeeks.org>
Committed: Tue Mar 18 23:23:17 2014 +0900

----------------------------------------------------------------------
 .../security/providers/AbstractProvider.java    |  14 +--
 .../security/providers/FacebookProvider.java    |  96 ++++++++++----
 .../security/providers/FoursquareProvider.java  |  58 +++++----
 .../providers/PingIdentityProvider.java         |  13 +-
 .../providers/SignInProviderFactory.java        |  12 +-
 .../resources/usergrid-services-context.xml     | 125 +++++++++++--------
 6 files changed, 195 insertions(+), 123 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java
index 05e12a8..d4654fb 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java
@@ -21,11 +21,7 @@ import java.util.Map;
 
 import org.apache.usergrid.management.ManagementService;
 import org.apache.usergrid.persistence.EntityManager;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.api.json.JSONConfiguration;
+import org.springframework.web.client.RestTemplate;
 
 
 /** @author zznate */
@@ -33,15 +29,13 @@ public abstract class AbstractProvider implements SignInAsProvider {
 
     protected EntityManager entityManager;
     protected ManagementService managementService;
-    protected Client client;
+    protected RestTemplate restTemplate;
 
 
-    AbstractProvider( EntityManager entityManager, ManagementService managementService ) {
+    AbstractProvider( EntityManager entityManager, ManagementService managementService, RestTemplate restTemplate) {
         this.entityManager = entityManager;
         this.managementService = managementService;
-        ClientConfig clientConfig = new DefaultClientConfig();
-        clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE );
-        client = Client.create( clientConfig );
+        this.restTemplate = restTemplate;
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java
index fdc8dc2..f1a582c 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java
@@ -17,11 +17,13 @@
 package org.apache.usergrid.security.providers;
 
 
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import javax.ws.rs.core.MediaType;
-
+import com.google.common.base.Preconditions;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.usergrid.management.ManagementService;
@@ -32,6 +34,7 @@ import org.apache.usergrid.persistence.Results;
 import org.apache.usergrid.persistence.entities.User;
 import org.apache.usergrid.security.tokens.exceptions.BadTokenException;
 import org.apache.usergrid.utils.JsonUtils;
+import org.springframework.web.client.RestTemplate;
 
 import static org.apache.usergrid.persistence.Schema.PROPERTY_MODIFIED;
 import static org.apache.usergrid.utils.ListUtils.anyNull;
@@ -51,9 +54,8 @@ public class FacebookProvider extends AbstractProvider {
     private String apiUrl = DEF_API_URL;
     private String pictureUrl = DEF_PICTURE_URL;
 
-
-    FacebookProvider( EntityManager entityManager, ManagementService managementService ) {
-        super( entityManager, managementService );
+    FacebookProvider( EntityManager entityManager, ManagementService managementService, RestTemplate restTemplate) {
+        super( entityManager, managementService, restTemplate );
     }
 
 
@@ -93,38 +95,44 @@ public class FacebookProvider extends AbstractProvider {
 
     @Override
     Map<String, Object> userFromResource( String externalToken ) {
-        return client.resource( apiUrl ).queryParam( "access_token", externalToken )
-                     .accept( MediaType.APPLICATION_JSON ).get( Map.class );
+        return null;
     }
 
+    private FacebookUser getUser( String access_token ) {
+        FacebookUser fb_user = null;
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("access_token", access_token);
+        try {
+            fb_user = restTemplate.getForObject(apiUrl+"?access_token={access_token}", FacebookUser.class, params);
+        } catch (Exception e) {
+        }
+        return fb_user;
+    }
 
     @Override
     public User createOrAuthenticate( String externalToken ) throws BadTokenException {
 
-        Map<String, Object> fb_user = userFromResource( externalToken );
+        FacebookUser fb_user = getUser( externalToken );
+        Preconditions.checkNotNull(fb_user, "Invalid facebook user");
 
-        String fb_user_id = ( String ) fb_user.get( "id" );
-        String fb_user_name = ( String ) fb_user.get( "name" );
-        String fb_user_username = ( String ) fb_user.get( "username" );
-        String fb_user_email = ( String ) fb_user.get( "email" );
         if ( logger.isDebugEnabled() ) {
             logger.debug( JsonUtils.mapToFormattedJsonString( fb_user ) );
         }
 
         User user = null;
 
-        if ( ( fb_user != null ) && !anyNull( fb_user_id, fb_user_name ) ) {
+        if ( ( fb_user != null ) && !anyNull( fb_user.id, fb_user.name ) ) {
 
             Results r = null;
             try {
                 r = entityManager.searchCollection( entityManager.getApplicationRef(), "users",
-                        Query.findForProperty( "facebook.id", fb_user_id ) );
+                        Query.findForProperty( "facebook.id", fb_user.id ) );
             }
             catch ( Exception ex ) {
                 throw new BadTokenException( "Could not lookup user for that Facebook ID", ex );
             }
             if ( r.size() > 1 ) {
-                logger.error( "Multiple users for FB ID: " + fb_user_id );
+                logger.error( "Multiple users for FB ID: " + fb_user.id );
                 throw new BadTokenException( "multiple users with same Facebook ID" );
             }
 
@@ -132,18 +140,18 @@ public class FacebookProvider extends AbstractProvider {
                 Map<String, Object> properties = new LinkedHashMap<String, Object>();
 
                 properties.put( "facebook", fb_user );
-                properties.put( "username", "fb_" + fb_user_id );
-                properties.put( "name", fb_user_name );
-                properties.put( "picture", String.format( pictureUrl, fb_user_id ) );
+                properties.put( "username", "fb_" + fb_user.id );
+                properties.put( "name", fb_user.name );
+                properties.put( "picture", String.format( pictureUrl, fb_user.id ) );
 
-                if ( fb_user_email != null ) {
+                if ( fb_user.email != null ) {
                     try {
                         user = managementService.getAppUserByIdentifier( entityManager.getApplication().getUuid(),
-                                Identifier.fromEmail( fb_user_email ) );
+                                Identifier.fromEmail( fb_user.email ) );
                     }
                     catch ( Exception ex ) {
                         throw new BadTokenException(
-                                "Could not find existing user for this applicaiton for email: " + fb_user_email, ex );
+                                "Could not find existing user for this applicaiton for email: " + fb_user.email, ex );
                     }
                     // if we found the user by email, unbind the properties from above
                     // that will conflict
@@ -160,7 +168,7 @@ public class FacebookProvider extends AbstractProvider {
                         user.setProperty( PROPERTY_MODIFIED, properties.get( PROPERTY_MODIFIED ) );
                     }
                     else {
-                        properties.put( "email", fb_user_email );
+                        properties.put( "email", fb_user.email );
                     }
                 }
                 if ( user == null ) {
@@ -178,12 +186,12 @@ public class FacebookProvider extends AbstractProvider {
                 Map<String, Object> properties = new LinkedHashMap<String, Object>();
 
                 properties.put( "facebook", fb_user );
-                properties.put( "picture", String.format( pictureUrl, fb_user_id ) );
+                properties.put( "picture", String.format( pictureUrl, fb_user.id ) );
                 try {
                     entityManager.updateProperties( user, properties );
                     user.setProperty( PROPERTY_MODIFIED, properties.get( PROPERTY_MODIFIED ) );
                     user.setProperty( "facebook", fb_user );
-                    user.setProperty( "picture", String.format( pictureUrl, fb_user_id ) );
+                    user.setProperty( "picture", String.format( pictureUrl, fb_user.id ) );
                 }
                 catch ( Exception ex ) {
                     throw new BadTokenException( "Could not update user properties", ex );
@@ -196,4 +204,44 @@ public class FacebookProvider extends AbstractProvider {
 
         return user;
     }
+
+    @JsonIgnoreProperties(ignoreUnknown=true)
+    static class FacebookUser {
+        @JsonProperty("id") String id;
+        @JsonProperty("name") String name;
+        @JsonProperty("username") String username;
+        @JsonProperty("email") String email;
+
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getUsername() {
+            return username;
+        }
+
+        public void setUsername(String username) {
+            this.username = username;
+        }
+
+        public String getEmail() {
+            return email;
+        }
+
+        public void setEmail(String email) {
+            this.email = email;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java
index 9c3372f..719c541 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java
@@ -18,11 +18,10 @@ package org.apache.usergrid.security.providers;
 
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import javax.ws.rs.core.MediaType;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.usergrid.management.ManagementService;
@@ -33,11 +32,7 @@ import org.apache.usergrid.persistence.entities.User;
 import org.apache.usergrid.security.tokens.exceptions.BadTokenException;
 import org.apache.usergrid.utils.JsonUtils;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.api.json.JSONConfiguration;
+import org.springframework.web.client.RestTemplate;
 
 import static org.apache.usergrid.utils.ListUtils.anyNull;
 
@@ -52,8 +47,8 @@ public class FoursquareProvider extends AbstractProvider {
     private Logger logger = LoggerFactory.getLogger( FoursquareProvider.class );
 
 
-    FoursquareProvider( EntityManager entityManager, ManagementService managementService ) {
-        super( entityManager, managementService );
+    FoursquareProvider( EntityManager entityManager, ManagementService managementService, RestTemplate restTemplate ) {
+        super( entityManager, managementService, restTemplate );
     }
 
 
@@ -66,8 +61,18 @@ public class FoursquareProvider extends AbstractProvider {
 
     @Override
     Map<String, Object> userFromResource( String externalToken ) {
-        // TODO user extraction
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("oauth_token", externalToken);
+        params.put("v", "20140318");
+        try {
+            String json = restTemplate.getForObject("https://api.foursquare.com/v2/users/self?oauth_token={oauth_token}&v={v}", String.class, params);
+            Map<String, Object> data = (Map<String, Object>) JsonUtils.parse(json);
+            Map<String, Object> response = (Map<String, Object>) data.get("response");
+            Map<String, Object> user = (Map<String, Object>) response.get("user");
+            return user;
+        } catch (Exception e) {
+        }
+        return null;
     }
 
 
@@ -82,17 +87,9 @@ public class FoursquareProvider extends AbstractProvider {
         saveToConfiguration( "foursquareProvider", config );
     }
 
-
     @Override
     public User createOrAuthenticate( String externalToken ) throws BadTokenException {
-        ClientConfig clientConfig = new DefaultClientConfig();
-        clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE );
-        Client client = Client.create( clientConfig );
-        WebResource web_resource = client.resource( "https://api.foursquare.com/v2/users/self" );
-        Map<String, Object> body = web_resource.queryParam( "oauth_token", externalToken ).queryParam( "v", "20120623" )
-                                               .accept( MediaType.APPLICATION_JSON ).get( Map.class );
-
-        Map<String, Object> fq_user = ( Map<String, Object> ) ( ( Map<?, ?> ) body.get( "response" ) ).get( "user" );
+        Map<String, Object> fq_user = userFromResource(externalToken);
 
         String fq_user_id = ( String ) fq_user.get( "id" );
         String fq_user_username = ( String ) fq_user.get( "id" );
@@ -101,17 +98,18 @@ public class FoursquareProvider extends AbstractProvider {
         String fq_user_name = new String( "" );
 
         // Grab the last check-in so we can store that as the user location
-        Map<String, Object> fq_location =
-                ( Map<String, Object> ) ( ( Map<?, ?> ) ( ( Map<?, ?> ) ( ( ArrayList<?> ) ( ( Map<?, ?> ) fq_user
-                        .get( "checkins" ) ).get( "items" ) ).get( 0 ) ).get( "venue" ) ).get( "location" );
-
         Map<String, Double> location = new LinkedHashMap<String, Double>();
-        location.put( "latitude", ( Double ) fq_location.get( "lat" ) );
-        location.put( "longitude", ( Double ) fq_location.get( "lng" ) );
-
-        if ( logger.isDebugEnabled() ) {
-            logger.debug( JsonUtils.mapToFormattedJsonString( location ) );
-        }
+        try {
+            Map<String, Object> fq_location =
+                    ( Map<String, Object> ) ( ( Map<?, ?> ) ( ( Map<?, ?> ) ( ( ArrayList<?> ) ( ( Map<?, ?> ) fq_user
+                            .get("checkins") ).get( "items" ) ).get( 0 ) ).get( "venue" ) ).get( "location" );
+            location.put( "latitude", ( Double ) fq_location.get( "lat" ) );
+            location.put( "longitude", ( Double ) fq_location.get( "lng" ) );
+
+            if ( logger.isDebugEnabled() ) {
+                logger.debug( JsonUtils.mapToFormattedJsonString( location ) );
+            }
+        } catch (Exception e) { }
 
         // Only the first name is guaranteed to be here
         try {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java
index e7ea2b1..bffea26 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java
@@ -23,6 +23,10 @@ import java.util.Map;
 
 import javax.ws.rs.core.MediaType;
 
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.api.json.JSONConfiguration;
 import org.codehaus.jackson.JsonNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,6 +35,7 @@ import org.apache.usergrid.persistence.EntityManager;
 import org.apache.usergrid.persistence.Identifier;
 import org.apache.usergrid.persistence.entities.User;
 import org.apache.usergrid.security.tokens.exceptions.BadTokenException;
+import org.springframework.web.client.RestTemplate;
 
 
 /**
@@ -47,8 +52,8 @@ public class PingIdentityProvider extends AbstractProvider {
     private String clientSecret;
 
 
-    PingIdentityProvider( EntityManager entityManager, ManagementService managementService ) {
-        super( entityManager, managementService );
+    PingIdentityProvider( EntityManager entityManager, ManagementService managementService, RestTemplate restTemplate ) {
+        super( entityManager, managementService, restTemplate );
     }
 
 
@@ -121,7 +126,9 @@ public class PingIdentityProvider extends AbstractProvider {
 
     @Override
     Map<String, Object> userFromResource( String externalToken ) {
-
+        ClientConfig clientConfig = new DefaultClientConfig();
+        clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE );
+        Client client = Client.create(clientConfig);
         JsonNode node = client.resource( apiUrl )
                               .queryParam( "grant_type", "urn:pingidentity.com:oauth2:grant_type:validate_bearer" )
                               .queryParam( "client_secret", clientSecret ).queryParam( "client_id", clientId )

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java
index 56c5f7e..1224433 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java
@@ -21,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.apache.usergrid.management.ManagementService;
 import org.apache.usergrid.persistence.EntityManagerFactory;
 import org.apache.usergrid.persistence.entities.Application;
+import org.springframework.web.client.RestTemplate;
 
 
 /** @author zznate */
@@ -28,23 +29,24 @@ public class SignInProviderFactory {
 
     private EntityManagerFactory emf;
     private ManagementService managementService;
-
+    private RestTemplate restTemplate;
 
     @Autowired
     public void setEntityManagerFactory( EntityManagerFactory emf ) {
         this.emf = emf;
     }
 
-
     @Autowired
     public void setManagementService( ManagementService managementService ) {
         this.managementService = managementService;
     }
 
+    @Autowired
+    public void setRestTemplate(RestTemplate restTemplate) { this.restTemplate = restTemplate; }
 
     public SignInAsProvider facebook( Application application ) {
         FacebookProvider facebookProvider =
-                new FacebookProvider( emf.getEntityManager( application.getUuid() ), managementService );
+                new FacebookProvider( emf.getEntityManager( application.getUuid() ), managementService, restTemplate );
         facebookProvider.configure();
         return facebookProvider;
     }
@@ -52,7 +54,7 @@ public class SignInProviderFactory {
 
     public SignInAsProvider foursquare( Application application ) {
         FoursquareProvider foursquareProvider =
-                new FoursquareProvider( emf.getEntityManager( application.getUuid() ), managementService );
+                new FoursquareProvider( emf.getEntityManager( application.getUuid() ), managementService, restTemplate );
         foursquareProvider.configure();
         return foursquareProvider;
     }
@@ -60,7 +62,7 @@ public class SignInProviderFactory {
 
     public SignInAsProvider pingident( Application application ) {
         PingIdentityProvider pingIdentityProvider =
-                new PingIdentityProvider( emf.getEntityManager( application.getUuid() ), managementService );
+                new PingIdentityProvider( emf.getEntityManager( application.getUuid() ), managementService, restTemplate );
         pingIdentityProvider.configure();
         return pingIdentityProvider;
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/resources/usergrid-services-context.xml
----------------------------------------------------------------------
diff --git a/stack/services/src/main/resources/usergrid-services-context.xml b/stack/services/src/main/resources/usergrid-services-context.xml
index e7e2281..dbed1e1 100644
--- a/stack/services/src/main/resources/usergrid-services-context.xml
+++ b/stack/services/src/main/resources/usergrid-services-context.xml
@@ -16,79 +16,102 @@
     limitations under the License.
 -->
 <beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
-	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
-	xsi:schemaLocation="
-	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
-	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
-	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
+       xsi:schemaLocation="
+http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
+http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
 
-	<context:component-scan base-package="org.apache.usergrid.services"  />
-	
-	
-	<import resource="classpath:/usergrid-core-context.xml" />
+    <context:component-scan base-package="org.apache.usergrid.services"  />
 
-	<!--  scan for security -->
-	<context:component-scan base-package="org.apache.usergrid.security.crypto"  />
 
-	<bean id="realm" class="org.apache.usergrid.security.shiro.Realm">
-		<property name="name" value="realm" />
-	</bean>
+    <import resource="classpath:/usergrid-core-context.xml" />
 
-	<bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
-		<property name="realm" ref="realm" />
-	</bean>
+    <!--  scan for security -->
+    <context:component-scan base-package="org.apache.usergrid.security.crypto"  />
 
-	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
+    <bean id="realm" class="org.apache.usergrid.security.shiro.Realm">
+        <property name="name" value="realm" />
+    </bean>
+
+    <bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
+        <property name="realm" ref="realm" />
+    </bean>
 
-	<bean
-		class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
-		<property name="staticMethod"
-			value="org.apache.shiro.SecurityUtils.setSecurityManager" />
-		<property name="arguments" ref="securityManager" />
-	</bean>
+    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
+
+    <bean
+            class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
+        <property name="staticMethod"
+                  value="org.apache.shiro.SecurityUtils.setSecurityManager" />
+        <property name="arguments" ref="securityManager" />
+    </bean>
 
 
-	<bean id="taskExecutor" class="org.springframework.core.task.SyncTaskExecutor"/>
+    <bean id="taskExecutor" class="org.springframework.core.task.SyncTaskExecutor"/>
 
-	<bean id="tokenService" class="org.apache.usergrid.security.tokens.cassandra.TokenServiceImpl">
+    <bean id="tokenService" class="org.apache.usergrid.security.tokens.cassandra.TokenServiceImpl">
         <property name="cassandraService" ref="cassandraService"/>
         <property name="entityManagerFactory" ref="entityManagerFactory"/>
-            </bean>
+    </bean>
+
+    <bean id="managementService" class="org.apache.usergrid.management.cassandra.ManagementServiceImpl" >
+        <property name="saltProvider" ref="saltProvider"/>
+    </bean>
 
-	<bean id="managementService" class="org.apache.usergrid.management.cassandra.ManagementServiceImpl" >
-		<property name="saltProvider" ref="saltProvider"/>
-	</bean>
-	
-	<bean id="saltProvider" class="org.apache.usergrid.security.salt.NoOpSaltProvider" />
+    <bean id="saltProvider" class="org.apache.usergrid.security.salt.NoOpSaltProvider" />
 
-	<bean id="serviceManagerFactory" class="org.apache.usergrid.services.ServiceManagerFactory">
-		<constructor-arg ref="entityManagerFactory" />
-		<constructor-arg ref="properties" />
-		<constructor-arg ref="schedulerService"/>
+    <bean id="serviceManagerFactory" class="org.apache.usergrid.services.ServiceManagerFactory">
+        <constructor-arg ref="entityManagerFactory" />
+        <constructor-arg ref="properties" />
+        <constructor-arg ref="schedulerService"/>
         <constructor-arg ref="lockManager"/>
         <constructor-arg ref="queueManagerFactory"/>
-	</bean>
+    </bean>
+
+    <bean id="applicationCreator"
+          class="org.apache.usergrid.management.cassandra.ApplicationCreatorImpl">
+        <constructor-arg ref="entityManagerFactory" />
+        <constructor-arg ref="managementService" />
+    </bean>
+
+    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig" factory-method="custom">
+        <property name="socketTimeout" value="3000" />
+        <property name="connectTimeout" value="3000" />
+    </bean>
+
+    <bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />
+
+    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
+        <property name="defaultRequestConfig" ref="requestConfig" />
+        <property name="maxConnTotal" value="100" />
+        <property name="maxConnPerRoute" value="100" />
+    </bean>
 
-	<bean id="applicationCreator"
-		class="org.apache.usergrid.management.cassandra.ApplicationCreatorImpl">
-		<constructor-arg ref="entityManagerFactory" />
-		<constructor-arg ref="managementService" />
-	</bean>
+    <bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />
+
+    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
+        <constructor-arg>
+            <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
+                <property name="httpClient" ref="httpClient"/>
+            </bean>
+        </constructor-arg>
+    </bean>
 
     <bean id="signInProviderFactory" class="org.apache.usergrid.security.providers.SignInProviderFactory">
         <property name="entityManagerFactory" ref="entityManagerFactory"/>
         <property name="managementService" ref="managementService"/>
+        <property name="restTemplate" ref="restTemplate"/>
     </bean>
 
-  <bean id="exportService" class="org.apache.usergrid.management.export.ExportServiceImpl" >
-    <property name="managementService" ref="managementService"/>
-    <property name="emf" ref="entityManagerFactory"/>
-    <property name="sch" ref="schedulerService"/>
-  </bean>
+    <bean id="exportService" class="org.apache.usergrid.management.export.ExportServiceImpl" >
+        <property name="managementService" ref="managementService"/>
+        <property name="emf" ref="entityManagerFactory"/>
+        <property name="sch" ref="schedulerService"/>
+    </bean>
 
-  <bean id="exportJob" class="org.apache.usergrid.management.export.ExportJob" />
+    <bean id="exportJob" class="org.apache.usergrid.management.export.ExportJob" />
 
-  <bean id="s3Export" class="org.apache.usergrid.management.export.S3ExportImpl" />
+    <bean id="s3Export" class="org.apache.usergrid.management.export.S3ExportImpl" />
 
-</beans>
+</beans>
\ No newline at end of file


[2/5] git commit: Upgrade http client module (4.3.1)

Posted by sn...@apache.org.
Upgrade http client module (4.3.1)


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/76bbedfe
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/76bbedfe
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/76bbedfe

Branch: refs/pull/75/merge
Commit: 76bbedfe7eae1b0f419cad3962a5472f37f89ee7
Parents: 5a7915c
Author: Sungju Jin <su...@softwaregeeks.org>
Authored: Tue Mar 18 23:17:16 2014 +0900
Committer: Sungju Jin <su...@softwaregeeks.org>
Committed: Tue Mar 18 23:23:03 2014 +0900

----------------------------------------------------------------------
 stack/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/76bbedfe/stack/pom.xml
----------------------------------------------------------------------
diff --git a/stack/pom.xml b/stack/pom.xml
index 3a24790..45d89e1 100644
--- a/stack/pom.xml
+++ b/stack/pom.xml
@@ -259,7 +259,7 @@
       <dependency>
         <groupId>org.apache.httpcomponents</groupId>
         <artifactId>httpclient</artifactId>
-        <version>4.1.3</version>
+        <version>4.3.1</version>
         <exclusions>
           <exclusion>
             <groupId>commons-codec</groupId>


[5/5] git commit: Merge c0d8fed0ff81c03606d2c4450a3261825234af12 into 5a7915c58e50c56619b24814c074304dcc445440

Posted by sn...@apache.org.
Merge c0d8fed0ff81c03606d2c4450a3261825234af12 into 5a7915c58e50c56619b24814c074304dcc445440


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/04ca48f8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/04ca48f8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/04ca48f8

Branch: refs/pull/75/merge
Commit: 04ca48f81b55614646eea562cab564752549533a
Parents: 5a7915c c0d8fed
Author: Sungju Jin <su...@softwaregeeks.org>
Authored: Tue Mar 18 14:26:31 2014 +0000
Committer: Sungju Jin <su...@softwaregeeks.org>
Committed: Tue Mar 18 14:26:31 2014 +0000

----------------------------------------------------------------------
 stack/pom.xml                                   |   2 +-
 .../security/providers/AbstractProvider.java    |  14 +--
 .../security/providers/FacebookProvider.java    |  96 ++++++++++----
 .../security/providers/FoursquareProvider.java  |  58 +++++----
 .../providers/PingIdentityProvider.java         |  13 +-
 .../providers/SignInProviderFactory.java        |  12 +-
 .../resources/usergrid-services-context.xml     | 125 +++++++++++--------
 7 files changed, 196 insertions(+), 124 deletions(-)
----------------------------------------------------------------------



[3/5] git commit: Enhance performance in 3rd party auth module (Connection pooling)

Posted by sn...@apache.org.
Enhance performance in 3rd party auth module (Connection pooling)


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/c0d8fed0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/c0d8fed0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/c0d8fed0

Branch: refs/pull/75/merge
Commit: c0d8fed0ff81c03606d2c4450a3261825234af12
Parents: 76bbedf
Author: Sungju Jin <su...@softwaregeeks.org>
Authored: Tue Mar 18 23:19:33 2014 +0900
Committer: Sungju Jin <su...@softwaregeeks.org>
Committed: Tue Mar 18 23:23:17 2014 +0900

----------------------------------------------------------------------
 .../security/providers/AbstractProvider.java    |  14 +--
 .../security/providers/FacebookProvider.java    |  96 ++++++++++----
 .../security/providers/FoursquareProvider.java  |  58 +++++----
 .../providers/PingIdentityProvider.java         |  13 +-
 .../providers/SignInProviderFactory.java        |  12 +-
 .../resources/usergrid-services-context.xml     | 125 +++++++++++--------
 6 files changed, 195 insertions(+), 123 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java
index 05e12a8..d4654fb 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/AbstractProvider.java
@@ -21,11 +21,7 @@ import java.util.Map;
 
 import org.apache.usergrid.management.ManagementService;
 import org.apache.usergrid.persistence.EntityManager;
-
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.api.json.JSONConfiguration;
+import org.springframework.web.client.RestTemplate;
 
 
 /** @author zznate */
@@ -33,15 +29,13 @@ public abstract class AbstractProvider implements SignInAsProvider {
 
     protected EntityManager entityManager;
     protected ManagementService managementService;
-    protected Client client;
+    protected RestTemplate restTemplate;
 
 
-    AbstractProvider( EntityManager entityManager, ManagementService managementService ) {
+    AbstractProvider( EntityManager entityManager, ManagementService managementService, RestTemplate restTemplate) {
         this.entityManager = entityManager;
         this.managementService = managementService;
-        ClientConfig clientConfig = new DefaultClientConfig();
-        clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE );
-        client = Client.create( clientConfig );
+        this.restTemplate = restTemplate;
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java
index fdc8dc2..f1a582c 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/FacebookProvider.java
@@ -17,11 +17,13 @@
 package org.apache.usergrid.security.providers;
 
 
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import javax.ws.rs.core.MediaType;
-
+import com.google.common.base.Preconditions;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.annotate.JsonProperty;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.usergrid.management.ManagementService;
@@ -32,6 +34,7 @@ import org.apache.usergrid.persistence.Results;
 import org.apache.usergrid.persistence.entities.User;
 import org.apache.usergrid.security.tokens.exceptions.BadTokenException;
 import org.apache.usergrid.utils.JsonUtils;
+import org.springframework.web.client.RestTemplate;
 
 import static org.apache.usergrid.persistence.Schema.PROPERTY_MODIFIED;
 import static org.apache.usergrid.utils.ListUtils.anyNull;
@@ -51,9 +54,8 @@ public class FacebookProvider extends AbstractProvider {
     private String apiUrl = DEF_API_URL;
     private String pictureUrl = DEF_PICTURE_URL;
 
-
-    FacebookProvider( EntityManager entityManager, ManagementService managementService ) {
-        super( entityManager, managementService );
+    FacebookProvider( EntityManager entityManager, ManagementService managementService, RestTemplate restTemplate) {
+        super( entityManager, managementService, restTemplate );
     }
 
 
@@ -93,38 +95,44 @@ public class FacebookProvider extends AbstractProvider {
 
     @Override
     Map<String, Object> userFromResource( String externalToken ) {
-        return client.resource( apiUrl ).queryParam( "access_token", externalToken )
-                     .accept( MediaType.APPLICATION_JSON ).get( Map.class );
+        return null;
     }
 
+    private FacebookUser getUser( String access_token ) {
+        FacebookUser fb_user = null;
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("access_token", access_token);
+        try {
+            fb_user = restTemplate.getForObject(apiUrl+"?access_token={access_token}", FacebookUser.class, params);
+        } catch (Exception e) {
+        }
+        return fb_user;
+    }
 
     @Override
     public User createOrAuthenticate( String externalToken ) throws BadTokenException {
 
-        Map<String, Object> fb_user = userFromResource( externalToken );
+        FacebookUser fb_user = getUser( externalToken );
+        Preconditions.checkNotNull(fb_user, "Invalid facebook user");
 
-        String fb_user_id = ( String ) fb_user.get( "id" );
-        String fb_user_name = ( String ) fb_user.get( "name" );
-        String fb_user_username = ( String ) fb_user.get( "username" );
-        String fb_user_email = ( String ) fb_user.get( "email" );
         if ( logger.isDebugEnabled() ) {
             logger.debug( JsonUtils.mapToFormattedJsonString( fb_user ) );
         }
 
         User user = null;
 
-        if ( ( fb_user != null ) && !anyNull( fb_user_id, fb_user_name ) ) {
+        if ( ( fb_user != null ) && !anyNull( fb_user.id, fb_user.name ) ) {
 
             Results r = null;
             try {
                 r = entityManager.searchCollection( entityManager.getApplicationRef(), "users",
-                        Query.findForProperty( "facebook.id", fb_user_id ) );
+                        Query.findForProperty( "facebook.id", fb_user.id ) );
             }
             catch ( Exception ex ) {
                 throw new BadTokenException( "Could not lookup user for that Facebook ID", ex );
             }
             if ( r.size() > 1 ) {
-                logger.error( "Multiple users for FB ID: " + fb_user_id );
+                logger.error( "Multiple users for FB ID: " + fb_user.id );
                 throw new BadTokenException( "multiple users with same Facebook ID" );
             }
 
@@ -132,18 +140,18 @@ public class FacebookProvider extends AbstractProvider {
                 Map<String, Object> properties = new LinkedHashMap<String, Object>();
 
                 properties.put( "facebook", fb_user );
-                properties.put( "username", "fb_" + fb_user_id );
-                properties.put( "name", fb_user_name );
-                properties.put( "picture", String.format( pictureUrl, fb_user_id ) );
+                properties.put( "username", "fb_" + fb_user.id );
+                properties.put( "name", fb_user.name );
+                properties.put( "picture", String.format( pictureUrl, fb_user.id ) );
 
-                if ( fb_user_email != null ) {
+                if ( fb_user.email != null ) {
                     try {
                         user = managementService.getAppUserByIdentifier( entityManager.getApplication().getUuid(),
-                                Identifier.fromEmail( fb_user_email ) );
+                                Identifier.fromEmail( fb_user.email ) );
                     }
                     catch ( Exception ex ) {
                         throw new BadTokenException(
-                                "Could not find existing user for this applicaiton for email: " + fb_user_email, ex );
+                                "Could not find existing user for this applicaiton for email: " + fb_user.email, ex );
                     }
                     // if we found the user by email, unbind the properties from above
                     // that will conflict
@@ -160,7 +168,7 @@ public class FacebookProvider extends AbstractProvider {
                         user.setProperty( PROPERTY_MODIFIED, properties.get( PROPERTY_MODIFIED ) );
                     }
                     else {
-                        properties.put( "email", fb_user_email );
+                        properties.put( "email", fb_user.email );
                     }
                 }
                 if ( user == null ) {
@@ -178,12 +186,12 @@ public class FacebookProvider extends AbstractProvider {
                 Map<String, Object> properties = new LinkedHashMap<String, Object>();
 
                 properties.put( "facebook", fb_user );
-                properties.put( "picture", String.format( pictureUrl, fb_user_id ) );
+                properties.put( "picture", String.format( pictureUrl, fb_user.id ) );
                 try {
                     entityManager.updateProperties( user, properties );
                     user.setProperty( PROPERTY_MODIFIED, properties.get( PROPERTY_MODIFIED ) );
                     user.setProperty( "facebook", fb_user );
-                    user.setProperty( "picture", String.format( pictureUrl, fb_user_id ) );
+                    user.setProperty( "picture", String.format( pictureUrl, fb_user.id ) );
                 }
                 catch ( Exception ex ) {
                     throw new BadTokenException( "Could not update user properties", ex );
@@ -196,4 +204,44 @@ public class FacebookProvider extends AbstractProvider {
 
         return user;
     }
+
+    @JsonIgnoreProperties(ignoreUnknown=true)
+    static class FacebookUser {
+        @JsonProperty("id") String id;
+        @JsonProperty("name") String name;
+        @JsonProperty("username") String username;
+        @JsonProperty("email") String email;
+
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getUsername() {
+            return username;
+        }
+
+        public void setUsername(String username) {
+            this.username = username;
+        }
+
+        public String getEmail() {
+            return email;
+        }
+
+        public void setEmail(String email) {
+            this.email = email;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java
index 9c3372f..719c541 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/FoursquareProvider.java
@@ -18,11 +18,10 @@ package org.apache.usergrid.security.providers;
 
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import javax.ws.rs.core.MediaType;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.usergrid.management.ManagementService;
@@ -33,11 +32,7 @@ import org.apache.usergrid.persistence.entities.User;
 import org.apache.usergrid.security.tokens.exceptions.BadTokenException;
 import org.apache.usergrid.utils.JsonUtils;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.api.json.JSONConfiguration;
+import org.springframework.web.client.RestTemplate;
 
 import static org.apache.usergrid.utils.ListUtils.anyNull;
 
@@ -52,8 +47,8 @@ public class FoursquareProvider extends AbstractProvider {
     private Logger logger = LoggerFactory.getLogger( FoursquareProvider.class );
 
 
-    FoursquareProvider( EntityManager entityManager, ManagementService managementService ) {
-        super( entityManager, managementService );
+    FoursquareProvider( EntityManager entityManager, ManagementService managementService, RestTemplate restTemplate ) {
+        super( entityManager, managementService, restTemplate );
     }
 
 
@@ -66,8 +61,18 @@ public class FoursquareProvider extends AbstractProvider {
 
     @Override
     Map<String, Object> userFromResource( String externalToken ) {
-        // TODO user extraction
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("oauth_token", externalToken);
+        params.put("v", "20140318");
+        try {
+            String json = restTemplate.getForObject("https://api.foursquare.com/v2/users/self?oauth_token={oauth_token}&v={v}", String.class, params);
+            Map<String, Object> data = (Map<String, Object>) JsonUtils.parse(json);
+            Map<String, Object> response = (Map<String, Object>) data.get("response");
+            Map<String, Object> user = (Map<String, Object>) response.get("user");
+            return user;
+        } catch (Exception e) {
+        }
+        return null;
     }
 
 
@@ -82,17 +87,9 @@ public class FoursquareProvider extends AbstractProvider {
         saveToConfiguration( "foursquareProvider", config );
     }
 
-
     @Override
     public User createOrAuthenticate( String externalToken ) throws BadTokenException {
-        ClientConfig clientConfig = new DefaultClientConfig();
-        clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE );
-        Client client = Client.create( clientConfig );
-        WebResource web_resource = client.resource( "https://api.foursquare.com/v2/users/self" );
-        Map<String, Object> body = web_resource.queryParam( "oauth_token", externalToken ).queryParam( "v", "20120623" )
-                                               .accept( MediaType.APPLICATION_JSON ).get( Map.class );
-
-        Map<String, Object> fq_user = ( Map<String, Object> ) ( ( Map<?, ?> ) body.get( "response" ) ).get( "user" );
+        Map<String, Object> fq_user = userFromResource(externalToken);
 
         String fq_user_id = ( String ) fq_user.get( "id" );
         String fq_user_username = ( String ) fq_user.get( "id" );
@@ -101,17 +98,18 @@ public class FoursquareProvider extends AbstractProvider {
         String fq_user_name = new String( "" );
 
         // Grab the last check-in so we can store that as the user location
-        Map<String, Object> fq_location =
-                ( Map<String, Object> ) ( ( Map<?, ?> ) ( ( Map<?, ?> ) ( ( ArrayList<?> ) ( ( Map<?, ?> ) fq_user
-                        .get( "checkins" ) ).get( "items" ) ).get( 0 ) ).get( "venue" ) ).get( "location" );
-
         Map<String, Double> location = new LinkedHashMap<String, Double>();
-        location.put( "latitude", ( Double ) fq_location.get( "lat" ) );
-        location.put( "longitude", ( Double ) fq_location.get( "lng" ) );
-
-        if ( logger.isDebugEnabled() ) {
-            logger.debug( JsonUtils.mapToFormattedJsonString( location ) );
-        }
+        try {
+            Map<String, Object> fq_location =
+                    ( Map<String, Object> ) ( ( Map<?, ?> ) ( ( Map<?, ?> ) ( ( ArrayList<?> ) ( ( Map<?, ?> ) fq_user
+                            .get("checkins") ).get( "items" ) ).get( 0 ) ).get( "venue" ) ).get( "location" );
+            location.put( "latitude", ( Double ) fq_location.get( "lat" ) );
+            location.put( "longitude", ( Double ) fq_location.get( "lng" ) );
+
+            if ( logger.isDebugEnabled() ) {
+                logger.debug( JsonUtils.mapToFormattedJsonString( location ) );
+            }
+        } catch (Exception e) { }
 
         // Only the first name is guaranteed to be here
         try {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java
index e7ea2b1..bffea26 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/PingIdentityProvider.java
@@ -23,6 +23,10 @@ import java.util.Map;
 
 import javax.ws.rs.core.MediaType;
 
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.api.json.JSONConfiguration;
 import org.codehaus.jackson.JsonNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,6 +35,7 @@ import org.apache.usergrid.persistence.EntityManager;
 import org.apache.usergrid.persistence.Identifier;
 import org.apache.usergrid.persistence.entities.User;
 import org.apache.usergrid.security.tokens.exceptions.BadTokenException;
+import org.springframework.web.client.RestTemplate;
 
 
 /**
@@ -47,8 +52,8 @@ public class PingIdentityProvider extends AbstractProvider {
     private String clientSecret;
 
 
-    PingIdentityProvider( EntityManager entityManager, ManagementService managementService ) {
-        super( entityManager, managementService );
+    PingIdentityProvider( EntityManager entityManager, ManagementService managementService, RestTemplate restTemplate ) {
+        super( entityManager, managementService, restTemplate );
     }
 
 
@@ -121,7 +126,9 @@ public class PingIdentityProvider extends AbstractProvider {
 
     @Override
     Map<String, Object> userFromResource( String externalToken ) {
-
+        ClientConfig clientConfig = new DefaultClientConfig();
+        clientConfig.getFeatures().put( JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE );
+        Client client = Client.create(clientConfig);
         JsonNode node = client.resource( apiUrl )
                               .queryParam( "grant_type", "urn:pingidentity.com:oauth2:grant_type:validate_bearer" )
                               .queryParam( "client_secret", clientSecret ).queryParam( "client_id", clientId )

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java b/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java
index 56c5f7e..1224433 100644
--- a/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java
+++ b/stack/services/src/main/java/org/apache/usergrid/security/providers/SignInProviderFactory.java
@@ -21,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.apache.usergrid.management.ManagementService;
 import org.apache.usergrid.persistence.EntityManagerFactory;
 import org.apache.usergrid.persistence.entities.Application;
+import org.springframework.web.client.RestTemplate;
 
 
 /** @author zznate */
@@ -28,23 +29,24 @@ public class SignInProviderFactory {
 
     private EntityManagerFactory emf;
     private ManagementService managementService;
-
+    private RestTemplate restTemplate;
 
     @Autowired
     public void setEntityManagerFactory( EntityManagerFactory emf ) {
         this.emf = emf;
     }
 
-
     @Autowired
     public void setManagementService( ManagementService managementService ) {
         this.managementService = managementService;
     }
 
+    @Autowired
+    public void setRestTemplate(RestTemplate restTemplate) { this.restTemplate = restTemplate; }
 
     public SignInAsProvider facebook( Application application ) {
         FacebookProvider facebookProvider =
-                new FacebookProvider( emf.getEntityManager( application.getUuid() ), managementService );
+                new FacebookProvider( emf.getEntityManager( application.getUuid() ), managementService, restTemplate );
         facebookProvider.configure();
         return facebookProvider;
     }
@@ -52,7 +54,7 @@ public class SignInProviderFactory {
 
     public SignInAsProvider foursquare( Application application ) {
         FoursquareProvider foursquareProvider =
-                new FoursquareProvider( emf.getEntityManager( application.getUuid() ), managementService );
+                new FoursquareProvider( emf.getEntityManager( application.getUuid() ), managementService, restTemplate );
         foursquareProvider.configure();
         return foursquareProvider;
     }
@@ -60,7 +62,7 @@ public class SignInProviderFactory {
 
     public SignInAsProvider pingident( Application application ) {
         PingIdentityProvider pingIdentityProvider =
-                new PingIdentityProvider( emf.getEntityManager( application.getUuid() ), managementService );
+                new PingIdentityProvider( emf.getEntityManager( application.getUuid() ), managementService, restTemplate );
         pingIdentityProvider.configure();
         return pingIdentityProvider;
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d8fed0/stack/services/src/main/resources/usergrid-services-context.xml
----------------------------------------------------------------------
diff --git a/stack/services/src/main/resources/usergrid-services-context.xml b/stack/services/src/main/resources/usergrid-services-context.xml
index e7e2281..dbed1e1 100644
--- a/stack/services/src/main/resources/usergrid-services-context.xml
+++ b/stack/services/src/main/resources/usergrid-services-context.xml
@@ -16,79 +16,102 @@
     limitations under the License.
 -->
 <beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
-	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
-	xsi:schemaLocation="
-	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
-	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
-	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
+       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
+       xsi:schemaLocation="
+http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
+http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
 
-	<context:component-scan base-package="org.apache.usergrid.services"  />
-	
-	
-	<import resource="classpath:/usergrid-core-context.xml" />
+    <context:component-scan base-package="org.apache.usergrid.services"  />
 
-	<!--  scan for security -->
-	<context:component-scan base-package="org.apache.usergrid.security.crypto"  />
 
-	<bean id="realm" class="org.apache.usergrid.security.shiro.Realm">
-		<property name="name" value="realm" />
-	</bean>
+    <import resource="classpath:/usergrid-core-context.xml" />
 
-	<bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
-		<property name="realm" ref="realm" />
-	</bean>
+    <!--  scan for security -->
+    <context:component-scan base-package="org.apache.usergrid.security.crypto"  />
 
-	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
+    <bean id="realm" class="org.apache.usergrid.security.shiro.Realm">
+        <property name="name" value="realm" />
+    </bean>
+
+    <bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
+        <property name="realm" ref="realm" />
+    </bean>
 
-	<bean
-		class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
-		<property name="staticMethod"
-			value="org.apache.shiro.SecurityUtils.setSecurityManager" />
-		<property name="arguments" ref="securityManager" />
-	</bean>
+    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
+
+    <bean
+            class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
+        <property name="staticMethod"
+                  value="org.apache.shiro.SecurityUtils.setSecurityManager" />
+        <property name="arguments" ref="securityManager" />
+    </bean>
 
 
-	<bean id="taskExecutor" class="org.springframework.core.task.SyncTaskExecutor"/>
+    <bean id="taskExecutor" class="org.springframework.core.task.SyncTaskExecutor"/>
 
-	<bean id="tokenService" class="org.apache.usergrid.security.tokens.cassandra.TokenServiceImpl">
+    <bean id="tokenService" class="org.apache.usergrid.security.tokens.cassandra.TokenServiceImpl">
         <property name="cassandraService" ref="cassandraService"/>
         <property name="entityManagerFactory" ref="entityManagerFactory"/>
-            </bean>
+    </bean>
+
+    <bean id="managementService" class="org.apache.usergrid.management.cassandra.ManagementServiceImpl" >
+        <property name="saltProvider" ref="saltProvider"/>
+    </bean>
 
-	<bean id="managementService" class="org.apache.usergrid.management.cassandra.ManagementServiceImpl" >
-		<property name="saltProvider" ref="saltProvider"/>
-	</bean>
-	
-	<bean id="saltProvider" class="org.apache.usergrid.security.salt.NoOpSaltProvider" />
+    <bean id="saltProvider" class="org.apache.usergrid.security.salt.NoOpSaltProvider" />
 
-	<bean id="serviceManagerFactory" class="org.apache.usergrid.services.ServiceManagerFactory">
-		<constructor-arg ref="entityManagerFactory" />
-		<constructor-arg ref="properties" />
-		<constructor-arg ref="schedulerService"/>
+    <bean id="serviceManagerFactory" class="org.apache.usergrid.services.ServiceManagerFactory">
+        <constructor-arg ref="entityManagerFactory" />
+        <constructor-arg ref="properties" />
+        <constructor-arg ref="schedulerService"/>
         <constructor-arg ref="lockManager"/>
         <constructor-arg ref="queueManagerFactory"/>
-	</bean>
+    </bean>
+
+    <bean id="applicationCreator"
+          class="org.apache.usergrid.management.cassandra.ApplicationCreatorImpl">
+        <constructor-arg ref="entityManagerFactory" />
+        <constructor-arg ref="managementService" />
+    </bean>
+
+    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig" factory-method="custom">
+        <property name="socketTimeout" value="3000" />
+        <property name="connectTimeout" value="3000" />
+    </bean>
+
+    <bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />
+
+    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
+        <property name="defaultRequestConfig" ref="requestConfig" />
+        <property name="maxConnTotal" value="100" />
+        <property name="maxConnPerRoute" value="100" />
+    </bean>
 
-	<bean id="applicationCreator"
-		class="org.apache.usergrid.management.cassandra.ApplicationCreatorImpl">
-		<constructor-arg ref="entityManagerFactory" />
-		<constructor-arg ref="managementService" />
-	</bean>
+    <bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />
+
+    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
+        <constructor-arg>
+            <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
+                <property name="httpClient" ref="httpClient"/>
+            </bean>
+        </constructor-arg>
+    </bean>
 
     <bean id="signInProviderFactory" class="org.apache.usergrid.security.providers.SignInProviderFactory">
         <property name="entityManagerFactory" ref="entityManagerFactory"/>
         <property name="managementService" ref="managementService"/>
+        <property name="restTemplate" ref="restTemplate"/>
     </bean>
 
-  <bean id="exportService" class="org.apache.usergrid.management.export.ExportServiceImpl" >
-    <property name="managementService" ref="managementService"/>
-    <property name="emf" ref="entityManagerFactory"/>
-    <property name="sch" ref="schedulerService"/>
-  </bean>
+    <bean id="exportService" class="org.apache.usergrid.management.export.ExportServiceImpl" >
+        <property name="managementService" ref="managementService"/>
+        <property name="emf" ref="entityManagerFactory"/>
+        <property name="sch" ref="schedulerService"/>
+    </bean>
 
-  <bean id="exportJob" class="org.apache.usergrid.management.export.ExportJob" />
+    <bean id="exportJob" class="org.apache.usergrid.management.export.ExportJob" />
 
-  <bean id="s3Export" class="org.apache.usergrid.management.export.S3ExportImpl" />
+    <bean id="s3Export" class="org.apache.usergrid.management.export.S3ExportImpl" />
 
-</beans>
+</beans>
\ No newline at end of file