/** * */ package com.androidrocks.bex.server.servlet.twitter; import com.androidrocks.bex.client.json.RequestFailure; import com.androidrocks.bex.client.json.TwitterId; import com.androidrocks.bex.server.manager.TypeFactory; import com.androidrocks.bex.server.manager.UserManager; import com.androidrocks.bex.server.manager.FriendManager; import com.androidrocks.bex.server.persistent.BEXFriend; import com.androidrocks.bex.server.persistent.TwitFriend; import com.androidrocks.bex.server.persistent.User; import com.google.gson.Gson; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.http.AccessToken; import twitter4j.http.RequestToken; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.logging.Logger; /** * @author muthu */ public class TWOAuthCallback extends HttpServlet { private static final Logger log = Logger.getLogger(TWOAuthCallback.class .getName()); /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest * , javax.servlet.http.HttpServletResponse) */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doPost(req, resp); } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest * , javax.servlet.http.HttpServletResponse) */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Twitter twitter = new Twitter(); twitter.setOAuthConsumer("DAWQiVMAP98j7BxAD55sw", "M1Ws4JjOC78YJwQLaAwhTXYCdDcMslEnVgwcnOC6w4"); // todo: Obtain RequestToken from session RequestToken requestToken = (RequestToken) req.getSession() .getAttribute("requestToken"); ; try { AccessToken accessToken = twitter.getOAuthAccessToken(requestToken); loginSuccess(req, resp, twitter, accessToken); } catch (TwitterException te) { loginFailure(req, resp, te); } } private void loginFailure(HttpServletRequest req, HttpServletResponse resp, TwitterException te) throws IOException { if (401 == te.getStatusCode()) { log.severe("Unable to get the access token."); log.severe(te.getMessage()); } else { log.severe(te.getMessage()); } // todo: redirect to a failure page // intercept this page in client log.info("Redirecting response to: /twitter/login_failure"); RequestFailure fail = new RequestFailure(); fail.setReason("Unable to get Access Token"); req.getSession().setAttribute("requestFailure", fail); resp.sendRedirect("/twitter/login_failure"); } private void loginSuccess(HttpServletRequest req, HttpServletResponse resp, Twitter twitter, AccessToken accessToken) throws TwitterException, IOException { // persist to the accessToken for future reference. User user = storeAccessToken(twitter.verifyCredentials(), accessToken); // todo: redirect to a success page, with accesstoken in session // intercept this page in client, and fetch accesstoken // req.setAttribute("accessToken", accessToken.getToken()); // req.setAttribute("accessTokenSecret", accessToken.getTokenSecret()); /* * //req.getRequestDispatcher( * "http://books-ex.appspot.com/twitter/login_success").forward(req, // * resp); log .info("Redirecting response to: /twitter/login_success"); * req.getSession().setAttribute("user", user); resp * .sendRedirect("/twitter/login_success"); */ TwitterId twitterId = new TwitterId(); if (null == user) { RequestFailure fail = new RequestFailure(); fail.setReason("User not present in Session"); req.getSession().setAttribute("requestFailure", fail); // resp.sendRedirect("/twitter/login_failure"); resp.sendRedirect("android://books-ex.appspot.com/twitter/login_failure"); } else { twitterId.setScreenName(user.getScreenName()); twitterId.setToken(user.getToken()); Gson gson = new Gson(); req.setAttribute("userId", accessToken.getUserId()); String tid = gson.toJson(twitterId); tid = URLEncoder.encode(tid, Charset.defaultCharset().name()); req.setAttribute("twitterId", tid); resp.sendRedirect("android://books-ex.appspot.com/twitter/login_success?twitterId="+tid); /* try { req.getRequestDispatcher("/twitter_login_success.jsp").forward( req, resp); } catch (ServletException e) { e.printStackTrace(); RequestFailure fail = new RequestFailure(); fail.setReason(e.getMessage()); req.getSession().setAttribute("requestFailure", fail); resp.sendRedirect("/twitter/login_failure"); } */ } } private User storeAccessToken(twitter4j.User jUser, AccessToken accessToken) { // store at.getToken() // store at.getTokenSecret() log.info("Got access token."); log.info("Access token: " + accessToken.getToken()); log.info("Access token secret: " + accessToken.getTokenSecret()); log.info("UserId: " + jUser); User user = new User(); user.setTwitterId(jUser.getId()); user.setScreenName(jUser.getScreenName()); user.setToken(accessToken.getToken()); user.setTokenSecret(accessToken.getTokenSecret()); UserManager.saveUserWithCustomKey(user); // the user has 3 forms.. User, BEXFriend, and TwitFriend.. create them all here. TwitFriend tf = TypeFactory.jUserToTwitFriend(jUser); BEXFriend bf = TypeFactory.twitFriendToBEXFriend(tf); FriendManager.saveBEXFriendWithCustomKey(bf); FriendManager.saveTwitFriendWithCustomKey(tf); return user; } }