/* * Copyright 2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.social.connect.web; import static org.junit.Assert.*; import java.util.List; import java.util.Map.Entry; import java.util.Set; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.social.connect.ApiAdapter; import org.springframework.social.connect.Connection; import org.springframework.social.connect.ConnectionValues; import org.springframework.social.connect.UserProfile; import org.springframework.social.connect.support.OAuth1ConnectionFactory; import org.springframework.social.connect.support.OAuth2Connection; import org.springframework.social.connect.support.OAuth2ConnectionFactory; import org.springframework.social.oauth1.AuthorizedRequestToken; import org.springframework.social.oauth1.OAuth1Operations; import org.springframework.social.oauth1.OAuth1Parameters; import org.springframework.social.oauth1.OAuth1ServiceProvider; import org.springframework.social.oauth1.OAuth1Version; import org.springframework.social.oauth1.OAuthToken; import org.springframework.social.oauth2.AccessGrant; import org.springframework.social.oauth2.GrantType; import org.springframework.social.oauth2.OAuth2Operations; import org.springframework.social.oauth2.OAuth2Parameters; import org.springframework.social.oauth2.OAuth2ServiceProvider; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.context.request.ServletWebRequest; public class ConnectSupportTest { @Test public void buildOAuthUrl_OAuth10() { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10), request); assertEquals("https://serviceprovider.com/oauth/authorize?oauth_callback=http://somesite.com/connect/someprovider", url); } @Test public void buildOAuthUrl_OAuth10_withContextPath() { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/appname/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10), request); assertEquals("https://serviceprovider.com/oauth/authorize?oauth_callback=http://somesite.com/appname/connect/someprovider", url); } @Test public void buildOAuthUrl_OAuth10_withApplicationUrl() throws Exception { ConnectSupport support = new ConnectSupport(); support.setApplicationUrl("https://someothersite.com:1234"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10), request); assertEquals("https://serviceprovider.com/oauth/authorize?oauth_callback=https://someothersite.com:1234/connect/someprovider", url); } @Test public void buildOAuthUrl_OAuth10_withApplicationUrlAndNonDefaultServletPath() throws Exception { ConnectSupport support = new ConnectSupport(); support.setApplicationUrl("http://somehost:8080/spring-social-showcase"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/foo"); mockRequest.setPathInfo("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10), request); assertEquals("https://serviceprovider.com/oauth/authorize?oauth_callback=http://somehost:8080/spring-social-showcase/foo/connect/someprovider", url); } @Test public void buildOAuthUrl_OAuth10_withApplicationUrlHavingDeepPath() throws Exception { ConnectSupport support = new ConnectSupport(); support.setApplicationUrl("http://ec2.instance.com:8080/spring-social/showcase"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10), request); assertEquals("https://serviceprovider.com/oauth/authorize?oauth_callback=http://ec2.instance.com:8080/spring-social/showcase/connect/someprovider", url); } @Test public void buildOAuthUrl_OAuth10_useAuthenticateUrl() { ConnectSupport support = new ConnectSupport(); support.setUseAuthenticateUrl(true); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10), request); assertEquals("https://serviceprovider.com/oauth/authenticate?oauth_callback=http://somesite.com/connect/someprovider", url); } @Test public void buildOAuthUrl_OAuth10_withAdditionalParameters() { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); MultiValueMap<String, String> additionalParameters = new LinkedMultiValueMap<String, String>(); additionalParameters.set("display", "popup"); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10), request, additionalParameters); assertEquals("https://serviceprovider.com/oauth/authorize?display=popup&oauth_callback=http://somesite.com/connect/someprovider", url); } @Test public void buildOAuthUrl_OAuth10a() { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10_REVISION_A), request); assertEquals("https://serviceprovider.com/oauth/authorize", url); } @Test public void buildOAuthUrl_OAuth10a_withApplicationUrl() throws Exception { ConnectSupport support = new ConnectSupport(); support.setApplicationUrl("https://someothersite.com:1234"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10_REVISION_A), request); assertEquals("https://serviceprovider.com/oauth/authorize", url); } @Test public void buildOAuthUrl_OAuth10a_useAuthenticateUrl() { ConnectSupport support = new ConnectSupport(); support.setUseAuthenticateUrl(true); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10_REVISION_A), request); assertEquals("https://serviceprovider.com/oauth/authenticate", url); } @Test public void buildOAuthUrl_OAuth10a_withAdditionalParameters() { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); MultiValueMap<String, String> additionalParameters = new LinkedMultiValueMap<String, String>(); additionalParameters.set("display", "popup"); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10_REVISION_A), request, additionalParameters); assertEquals("https://serviceprovider.com/oauth/authorize?display=popup", url); } @Test public void buildOAuthUrl_OAuth10a_withAdditionalParametersFromRequest() { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); mockRequest.addParameter("condiment", "ketchup"); ServletWebRequest request = new ServletWebRequest(mockRequest); MultiValueMap<String, String> additionalParameters = new LinkedMultiValueMap<String, String>(); additionalParameters.set("display", "popup"); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10_REVISION_A), request, additionalParameters); assertEquals("https://serviceprovider.com/oauth/authorize?display=popup&condiment=ketchup", url); } @Test public void buildOAuthUrl_OAuth2() { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth2ConnectionFactory(), request); assertEquals("https://serviceprovider.com/oauth/authorize?redirect_uri=http://somesite.com/connect/someprovider&state=STATE", url); } @Test public void buildOAuthUrl_OAuth2_withContextPath() throws Exception { ConnectSupport support = new ConnectSupport(); support.setApplicationUrl("https://someothersite.com:1234"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/appname/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth2ConnectionFactory(), request); assertEquals("https://serviceprovider.com/oauth/authorize?redirect_uri=https://someothersite.com:1234/appname/connect/someprovider&state=STATE", url); } @Test public void buildOAuthUrl_OAuth2_withApplicationUrl() throws Exception { ConnectSupport support = new ConnectSupport(); support.setApplicationUrl("https://someothersite.com:1234"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth2ConnectionFactory(), request); assertEquals("https://serviceprovider.com/oauth/authorize?redirect_uri=https://someothersite.com:1234/connect/someprovider&state=STATE", url); } @Test public void buildOAuthUrl_OAuth2_withApplicationUrlAndNonDefaultServletPath() throws Exception { ConnectSupport support = new ConnectSupport(); support.setApplicationUrl("https://someothersite.com:1234/spring-social-showcase"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/foo"); mockRequest.setPathInfo("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth2ConnectionFactory(), request); assertEquals("https://serviceprovider.com/oauth/authorize?redirect_uri=https://someothersite.com:1234/spring-social-showcase/foo/connect/someprovider&state=STATE", url); } @Test public void buildOAuthUrl_OAuth2_withApplicationUrlHavingDeepPath() throws Exception { ConnectSupport support = new ConnectSupport(); support.setApplicationUrl("http://ec2.instance.com:8080/spring-social/showcase"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth2ConnectionFactory(), request); assertEquals("https://serviceprovider.com/oauth/authorize?redirect_uri=http://ec2.instance.com:8080/spring-social/showcase/connect/someprovider&state=STATE", url); } @Test public void buildOAuthUrl_OAuth2_useAuthenticateUrl() throws Exception { ConnectSupport support = new ConnectSupport(); support.setUseAuthenticateUrl(true); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); TestOAuth2ConnectionFactory connectionFactory = new TestOAuth2ConnectionFactory(); String url = support.buildOAuthUrl(connectionFactory, request); assertEquals("https://serviceprovider.com/oauth/authenticate?redirect_uri=http://somesite.com/connect/someprovider&state=STATE", url); } @Test public void buildOAuthUrl_OAuth2_withAdditionalParameters() throws Exception { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); TestOAuth2ConnectionFactory connectionFactory = new TestOAuth2ConnectionFactory(); MultiValueMap<String, String> additionalParameters = new LinkedMultiValueMap<String, String>(); additionalParameters.set("display", "popup"); String url = support.buildOAuthUrl(connectionFactory, request, additionalParameters); assertEquals("https://serviceprovider.com/oauth/authorize?display=popup&redirect_uri=http://somesite.com/connect/someprovider&state=STATE", url); } @Test public void buildOAuthUrl_OAuth2_withAdditionalParametersFromRequest() throws Exception { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); mockRequest.addParameter("condiment", "ketchup"); ServletWebRequest request = new ServletWebRequest(mockRequest); TestOAuth2ConnectionFactory connectionFactory = new TestOAuth2ConnectionFactory(); MultiValueMap<String, String> additionalParameters = new LinkedMultiValueMap<String, String>(); additionalParameters.set("display", "popup"); String url = support.buildOAuthUrl(connectionFactory, request, additionalParameters); assertEquals("https://serviceprovider.com/oauth/authorize?display=popup&condiment=ketchup&redirect_uri=http://somesite.com/connect/someprovider&state=STATE", url); } private static class PortAwareMockHttpServletRequest extends MockHttpServletRequest { @Override public StringBuffer getRequestURL() { StringBuffer url = new StringBuffer(getScheme()); url.append("://").append(getServerName()); int port = getServerPort(); // only add the port if not 80 or 443. // could consider scheme when deciding on the port, but this is fine for this test. if (port != 80 && port != 443) { url.append(':').append(port); } url.append(getRequestURI()); return url; } } @Test public void completeConnection_OAuth1() { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.addParameter("oauth_verifier", "verifier"); mockRequest.getSession().setAttribute("oauthToken", new OAuthToken("requestToken", "requestTokenSecret")); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); Connection<?> connection = support.completeConnection(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10_REVISION_A), request); assertEquals("TestUser", connection.getDisplayName()); assertEquals("http://someprovider.com/images/testuser.jpg", connection.getImageUrl()); assertEquals("http://someprovider.com/testuser", connection.getProfileUrl()); } @Test public void completeConnection_OAuth2() { ConnectSupport support = new ConnectSupport(); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.addParameter("code", "authorization-grant"); mockRequest.addParameter("state", "STATE"); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setRequestURI("/connect/someprovider"); mockRequest.getSession().setAttribute("oauth2State", "STATE"); ServletWebRequest request = new ServletWebRequest(mockRequest); Connection<?> connection = support.completeConnection(new TestOAuth2ConnectionFactory(), request); assertEquals("TestUser", connection.getDisplayName()); assertEquals("http://someprovider.com/images/testuser.jpg", connection.getImageUrl()); assertEquals("http://someprovider.com/testuser", connection.getProfileUrl()); } @Test public void buildOAuthUrl_OAuth10_withCallbackUrl() throws Exception { ConnectSupport support = new ConnectSupport(); support.setCallbackUrl("https://overridingcallbackurl.com:4321"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10), request); assertEquals("https://serviceprovider.com/oauth/authorize?oauth_callback=https://overridingcallbackurl.com:4321", url); } @Test public void buildOAuthUrl_OAuth10a_withCallbackUrl() throws Exception { ConnectSupport support = new ConnectSupport(); support.setCallbackUrl("https://overridingcallbackurl.com:4321"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth1ConnectionFactory(OAuth1Version.CORE_10_REVISION_A), request); assertEquals("https://serviceprovider.com/oauth/authorize", url); } @Test public void buildOAuthUrl_OAuth2_withCallbackUrl() throws Exception { ConnectSupport support = new ConnectSupport(); support.setCallbackUrl("https://overridingcallbackurl.com:4321"); MockHttpServletRequest mockRequest = new PortAwareMockHttpServletRequest(); mockRequest.setScheme("http"); mockRequest.setServerName("somesite.com"); mockRequest.setServletPath("/connect/someprovider"); ServletWebRequest request = new ServletWebRequest(mockRequest); String url = support.buildOAuthUrl(new TestOAuth2ConnectionFactory(), request); assertEquals("https://serviceprovider.com/oauth/authorize?redirect_uri=https://overridingcallbackurl.com:4321&state=STATE", url); } // private helpers private static class TestOAuth1ConnectionFactory extends OAuth1ConnectionFactory<TestApi> { public TestOAuth1ConnectionFactory(OAuth1Version version) { super("someprovider", new TestOAuth1ServiceProvider(version), new TestApiAdapter()); } } private static class TestOAuth1ServiceProvider implements OAuth1ServiceProvider<TestApi> { private final OAuth1Version version; public TestOAuth1ServiceProvider(OAuth1Version version) { this.version = version; } public OAuth1Operations getOAuthOperations() { return new OAuth1Operations() { public OAuth1Version getVersion() { return version; } public OAuthToken fetchRequestToken(String callbackUrl, MultiValueMap<String, String> additionalParameters) { return new OAuthToken("requestTokenValue", "requestTokenSecret"); } public String buildAuthorizeUrl(String requestToken, OAuth1Parameters params) { String additionalParametersQuery = additionalParametersQuery(params, false); return "https://serviceprovider.com/oauth/authorize" + additionalParametersQuery; } public String buildAuthenticateUrl(String requestToken, OAuth1Parameters params) { String additionalParametersQuery = additionalParametersQuery(params, false); return "https://serviceprovider.com/oauth/authenticate" + additionalParametersQuery; } public OAuthToken exchangeForAccessToken(AuthorizedRequestToken requestToken, MultiValueMap<String, String> additionalParameters) { assertEquals("requestToken", requestToken.getValue()); assertEquals("requestTokenSecret", requestToken.getSecret()); assertNull(additionalParameters); return new OAuthToken("accessToken", "accessTokenSecret"); } }; } public TestApi getApi(String accessToken, String secret) { return null; } } private static class TestOAuth2ConnectionFactory extends OAuth2ConnectionFactory<TestApi> { private static final TestApiAdapter API_ADAPTER = new TestApiAdapter(); private static final TestOAuth2ServiceProvider SERVICE_PROVIDER = new TestOAuth2ServiceProvider(); public TestOAuth2ConnectionFactory() { super("someprovider", SERVICE_PROVIDER, API_ADAPTER); } // @Override // public boolean supportsStateParameter() { // return false; // } @Override public Connection<TestApi> createConnection(AccessGrant accessGrant) { return new OAuth2Connection<TestApi>("someprovider", "providerUserId", accessGrant.getAccessToken(), accessGrant.getRefreshToken(), accessGrant.getExpireTime(), SERVICE_PROVIDER, API_ADAPTER); } @Override public String generateState() { return "STATE"; } } private static class TestOAuth2ServiceProvider implements OAuth2ServiceProvider<TestApi> { public OAuth2Operations getOAuthOperations() { return new OAuth2Operations() { public String buildAuthorizeUrl(GrantType grantType, OAuth2Parameters params) { return "https://serviceprovider.com/oauth/authorize" + additionalParametersQuery(params, false); } public String buildAuthenticateUrl(GrantType grantType, OAuth2Parameters params) { return "https://serviceprovider.com/oauth/authenticate" + additionalParametersQuery(params, false); } public String buildAuthorizeUrl(OAuth2Parameters params) { return "https://serviceprovider.com/oauth/authorize" + additionalParametersQuery(params, false); } public String buildAuthenticateUrl(OAuth2Parameters params) { return "https://serviceprovider.com/oauth/authenticate" + additionalParametersQuery(params, false); } public AccessGrant exchangeForAccess(String authorizationGrant, String redirectUri, MultiValueMap<String, String> additionalParameters) { assertEquals("authorization-grant", authorizationGrant); assertEquals("http://somesite.com/connect/someprovider", redirectUri); assertNull(additionalParameters); return new AccessGrant("access-token"); } public AccessGrant exchangeCredentialsForAccess(String username, String password, MultiValueMap<String, String> additionalParameters) { return null; } @Deprecated public AccessGrant refreshAccess(String refreshToken, String scope, MultiValueMap<String, String> additionalParameters) { return null; } public AccessGrant refreshAccess(String refreshToken, MultiValueMap<String, String> additionalParameters) { return null; } public AccessGrant authenticateClient() { return null; } public AccessGrant authenticateClient(String scope) { return null; } }; } public TestApi getApi(final String accessToken) { return null; } } public interface TestApi { } private static class TestApiAdapter implements ApiAdapter<TestApi> { public boolean test(TestApi api) { return true; } public void setConnectionValues(TestApi api, ConnectionValues values) { values.setDisplayName("TestUser"); values.setImageUrl("http://someprovider.com/images/testuser.jpg"); values.setProfileUrl("http://someprovider.com/testuser"); values.setProviderUserId("testuser"); } public UserProfile fetchUserProfile(TestApi api) { return null; } public void updateStatus(TestApi api, String message) { } } private static String additionalParametersQuery(MultiValueMap<String, String> additionalParameters, boolean existingParameters) { if(additionalParameters == null) { return ""; } char delimiter = existingParameters ? '&' : '?'; StringBuffer buffer = new StringBuffer(); Set<Entry<String, List<String>>> entrySet = additionalParameters.entrySet(); for (Entry<String, List<String>> entry : entrySet) { String key = entry.getKey(); List<String> values = entry.getValue(); for (String value : values) { buffer.append(delimiter).append(key).append("=").append(value); delimiter = '&'; } } return buffer.toString(); } }