/**
* Copyright 2012 Marin Solutions
*/
package com.captaindebug.social.facebookposts.implementation;
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.web.context.request.NativeWebRequest;
/**
* Based upon the Spring idea of an application Context, this class is
* responsible for gluing your application to spring social.
*
* It does this by grouping together the minimum number of the various
* components in the Spring social quick start app
*
* @author Roger
*
*/
public class SocialContext implements ConnectionSignUp, SignInAdapter {
/**
* Use a random number generator to generate IDs to avoid cookie clashes
* between server restarts
*/
private static Random rand;
/**
* Manage cookies - Use cookies to remember state between calls to the
* server(s)
*/
private final UserCookieGenerator userCookieGenerator;
/** Store the user id between calls to the server */
private static final ThreadLocal<String> currentUser = new ThreadLocal<String>();
private final UsersConnectionRepository connectionRepository;
private final Facebook facebook;
public SocialContext(UsersConnectionRepository connectionRepository, UserCookieGenerator userCookieGenerator,
Facebook facebook) {
this.connectionRepository = connectionRepository;
this.userCookieGenerator = userCookieGenerator;
this.facebook = facebook;
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 boolean isSignedIn(HttpServletRequest request, HttpServletResponse response) {
boolean retVal = false;
String userId = userCookieGenerator.readCookieValue(request);
if (isValidId(userId)) {
if (isConnectedFacebookUser(userId)) {
retVal = true;
} else {
userCookieGenerator.removeCookie(response);
}
}
currentUser.set(userId);
return retVal;
}
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;
}
public String getUserId() {
return currentUser.get();
}
public Facebook getFacebook() {
return facebook;
}
}