/**
* =============================================================================
*
* ORCID (R) Open Source
* http://orcid.org
*
* Copyright (c) 2012-2014 ORCID, Inc.
* Licensed under an MIT-Style License (MIT)
* http://orcid.org/open-source-license
*
* This copyright and license information (including a link to the full license)
* shall be included in its entirety in all copies or substantial portion of
* the software.
*
* =============================================================================
*/
package org.orcid.frontend.spring.web.social.config;
import java.util.Calendar;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.social.connect.Connection;
import org.springframework.social.connect.ConnectionRepository;
import org.springframework.social.connect.ConnectionSignUp;
import org.springframework.social.connect.UsersConnectionRepository;
import org.springframework.social.connect.web.SignInAdapter;
import org.springframework.social.facebook.api.Facebook;
import org.springframework.social.google.api.Google;
import org.springframework.web.context.request.NativeWebRequest;
/**
* @author Shobhit Tyagi
*/
public class SocialContext implements ConnectionSignUp, SignInAdapter {
private static Random rand;
private final UserCookieGenerator userCookieGenerator;
private static final ThreadLocal<String> currentUser = new ThreadLocal<String>();
private final UsersConnectionRepository connectionRepository;
private final Facebook facebook;
private final Google google;
public SocialContext(UsersConnectionRepository connectionRepository, UserCookieGenerator userCookieGenerator,
Facebook facebook, Google google) {
this.connectionRepository = connectionRepository;
this.userCookieGenerator = userCookieGenerator;
this.facebook = facebook;
this.google = google;
rand = new Random(Calendar.getInstance().getTimeInMillis());
}
@Override
public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {
userCookieGenerator.addCookie(userId, request.getNativeResponse(HttpServletResponse.class));
return null;
}
@Override
public String execute(Connection<?> connection) {
return Long.toString(rand.nextLong());
}
public SocialType isSignedIn(HttpServletRequest request, HttpServletResponse response) {
SocialType connectionType = null;
String userId = userCookieGenerator.readCookieValue(request);
if (isValidId(userId)) {
if (isConnectedFacebookUser(userId)) {
connectionType = SocialType.FACEBOOK;
} else if(isConnectedGoogleUser(userId)) {
connectionType = SocialType.GOOGLE;
} else {
userCookieGenerator.removeCookie(response);
}
}
currentUser.set(userId);
return connectionType;
}
private boolean isValidId(String id) {
return isNotNull(id) && (id.length() > 0);
}
private boolean isNotNull(Object obj) {
return obj != null;
}
private boolean isConnectedFacebookUser(String userId) {
ConnectionRepository connectionRepo = connectionRepository.createConnectionRepository(userId);
Connection<Facebook> facebookConnection = connectionRepo.findPrimaryConnection(Facebook.class);
return facebookConnection != null;
}
private boolean isConnectedGoogleUser(String userId) {
ConnectionRepository connectionRepo = connectionRepository.createConnectionRepository(userId);
Connection<Google> googleConnection = connectionRepo.findPrimaryConnection(Google.class);
return googleConnection != null;
}
public String getUserId() {
return currentUser.get();
}
public Facebook getFacebook() {
return facebook;
}
public Google getGoogle() {
return google;
}
}