package jtweet.web;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.oro.text.perl.Perl5Util;
import jtweet.oauth.Configuration;
import jtweet.gae.GCache;
import jtweet.oauth.Utils;
import twitter4j.Paging;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.User;
import com.google.appengine.repackaged.com.google.common.util.Base64;
@SuppressWarnings("serial")
public class JTweetServlet extends HttpServlet {
protected Twitter twitter;
protected Paging paging;
protected String browser;
private String username = null;
private String passwd = null;
private String accessToken = null;
private String accessTokenSecret = null;
public static final String ACCOUNT_COOKIE_NAME = "stay";
public void init_twitter(String id, String passwd, HttpServletRequest req) {
twitter = new Twitter(id, passwd);
if (APIURL.useproxy) {
twitter.setBaseURL(APIURL.url);
}
if (APIURL.usesearchproxy) {
twitter.setSearchBaseURL(APIURL.search_url);
}
twitter.setSource("JTweet");
twitter.setClientURL("http://code.google.com/p/javatweet/");
twitter.setClientVersion("r52");
twitter.setUserAgent(twitter.getSource() + " " + twitter.getClientURL() + " " + twitter.getClientVersion());
paging = new Paging(1, 20);
detectBrowser(req);
}
public void twitterOAuth(String accessToken, String accessTokenSecret, HttpServletRequest req) {
twitter = new Twitter();
twitter.setOAuthConsumer(Configuration.getConsumerKey(), Configuration.getConsumerSecret());
twitter.setOAuthAccessToken(accessToken, accessTokenSecret);
if (APIURL.useproxy) {
twitter.setBaseURL(APIURL.url);
}
if (APIURL.usesearchproxy) {
twitter.setSearchBaseURL(APIURL.search_url);
}
twitter.setSource("JTweet");
twitter.setClientURL("http://code.google.com/p/javatweet/");
twitter.setClientVersion("r52");
twitter.setUserAgent(twitter.getSource() + " " + twitter.getClientURL() + " " + twitter.getClientVersion());
paging = new Paging(1, 20);
detectBrowser(req);
}
protected boolean isLogin(HttpServletRequest req) {
HttpSession session = req.getSession(true);
session.setMaxInactiveInterval(3600);
username = (String) session.getAttribute("username");
passwd = (String) session.getAttribute("passwd");
accessToken = (String) session.getAttribute("accessToken");
accessTokenSecret = (String) session.getAttribute("accessTokenSecret");
if (!Utils.isEmptyOrNull(accessToken) && !Utils.isEmptyOrNull(accessTokenSecret))
return true;
if (!Utils.isEmptyOrNull(passwd)) {
try {
passwd = new String(Base64.decode(passwd), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
} else {
Cookie[] cookies = req.getCookies();
Cookie accountCookie = null;
if (cookies == null)
return false;
for (Cookie cookie : cookies) {
if (cookie.getName().equals(JTweetServlet.ACCOUNT_COOKIE_NAME)) {
accountCookie = cookie;
break;
}
}
if (accountCookie == null || accountCookie.getValue() == null)
return false;
String[] accountString = Encrypt.decodeAccount(accountCookie.getValue());
if (accountString == null)
return false;
username = accountString[0];
passwd = accountString[1];
accessToken = accountString[2];
accessTokenSecret = accountString[3];
String passwd_en;
try {
passwd_en = Base64.encode(passwd.getBytes("UTF-8"));
session.setAttribute("username", username);
session.setAttribute("passwd", passwd_en);
session.setAttribute("accessToken", accessToken);
session.setAttribute("accessTokenSecret", accessTokenSecret);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
session.setAttribute("username", username);
}
return true;
}
protected void redirectLogin(HttpServletRequest req, HttpServletResponse resp) throws IOException {
HttpSession session = req.getSession(true);
session.invalidate();
Cookie cookie = new Cookie(JTweetServlet.ACCOUNT_COOKIE_NAME, null);
cookie.setMaxAge(0);
cookie.setPath("/");
resp.addCookie(cookie);
resp.sendRedirect("/login");
}
public String getUsername() {
return username;
}
public String getPasswd() {
return passwd;
}
public String getAccessToken() {
return accessToken;
}
public String getAccessTokenSecret() {
return accessTokenSecret;
}
public User getTuser() throws TwitterException {
User tuser = (User) GCache.get("user:" + getUsername());
if (null == tuser) {
tuser = twitter.verifyCredentials();
GCache.put("user:" + getUsername(), tuser, 3600);
}
return tuser;
}
public String getBrowser(){
return browser;
}
protected void detectBrowser(HttpServletRequest req){
String _browser = "other";
String UA = req.getHeader("User-Agent");
if (UA == null) {
browser = "other";
} else if (UA.contains("MSIE 6.0")) {
browser = "ie6";
} else if (UA.contains("Opera Mini")){
browser = "operamini";
}else if (UA.contains("MSIE 7.0")) {
browser = "ie7";
}else if(UA.contains("UCWEB")){
browser = "UC";
}else if(UA.contains("Chrome")){
browser = "Chrome";
} else {
browser = "other";
}
}
protected String ShortURL(String text) {
String rst = text;
String url_reg = "m/\\b[a-zA-Z]+:\\/\\/[\\w_.\\-]+\\.[a-zA-Z]{2,6}[\\/\\w\\-~.?=&%#+$*!:;]*\\b/i";
String temp = text;
Perl5Util perl = new Perl5Util();
while (perl.match(url_reg, temp)) {
String url = perl.group(0);
if (url.length() > 30) {
String short_url = ShortURL.getIsgdURL(url);
if (short_url != null)
rst = rst.replace(url, short_url);
/*
* try { rst = rst.replace(url, Bitly.getBitlyURL(url)); } catch
* (JSONException e) { // TODO Auto-generated catch block
* e.printStackTrace(); } catch (IOException e) { // TODO
* Auto-generated catch block e.printStackTrace(); }
*/
}
temp = perl.postMatch();
}
return rst;
}
}