/**
*
*/
package com.googlecode.flickr2twitter.impl.twitter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;
import twitter4j.http.RequestToken;
import com.googlecode.flickr2twitter.datastore.MyPersistenceManagerFactory;
import com.googlecode.flickr2twitter.datastore.model.GlobalApplicationConfig;
import com.googlecode.flickr2twitter.datastore.model.GlobalSourceApplicationService;
import com.googlecode.flickr2twitter.datastore.model.GlobalTargetApplicationService;
import com.googlecode.flickr2twitter.datastore.model.UserServiceConfig;
import com.googlecode.flickr2twitter.datastore.model.UserSourceServiceConfig;
import com.googlecode.flickr2twitter.datastore.model.UserTargetServiceConfig;
import com.googlecode.flickr2twitter.intf.IServiceAuthorizer;
import com.googlecode.flickr2twitter.org.apache.commons.lang3.StringUtils;
/**
* @author Toby Yu(yuyang226@gmail.com)
*
*/
public abstract class AbstractServiceProviderTwitter<M extends GlobalApplicationConfig, N extends UserServiceConfig>
implements IServiceAuthorizer {
private static final Logger log = LoggerFactory.getLogger(AbstractServiceProviderTwitter.class);
public static final String ID = "twitter";
public static final String DISPLAY_NAME = "Twitter";
public static final String KEY_TOKEN = "oauth_token";
public static final String KEY_TOKEN_SECRET = "secret";
public static final String KEY_OAUTH_VERIFIER = "oauth_verifier";
public static final String KEY_SOURCE = "source";
public static final String CALLBACK_URL = "twittercallback.jsp";
/**
*
*/
public AbstractServiceProviderTwitter() {
super();
}
/*
* (non-Javadoc)
*
* @see com.googlecode.flickr2twitter.intf.IServiceAuthorizer#
* readyAuthorization(java.lang.String, java.util.Map)
*/
@Override
public String readyAuthorization(String userEmail, Map<String, Object> data)
throws Exception {
log.info("User ready for Twitter authorization->{}, data: {}", userEmail, data);
if (data == null || data.containsKey(KEY_TOKEN) == false
|| data.containsKey(KEY_TOKEN_SECRET) == false
|| data.containsKey(KEY_OAUTH_VERIFIER) == false) {
throw new IllegalArgumentException("Invalid data: " + data);
}
StringBuffer buf = new StringBuffer();
GlobalApplicationConfig globalAppConfig = getGlobalApplicationConfig();
log.info("Twitter Global Application Config Data: {}", globalAppConfig);
String consumerId = null;
String consumerSecret = null;
if (globalAppConfig instanceof GlobalSourceApplicationService) {
GlobalSourceApplicationService sourceAppConfig =
(GlobalSourceApplicationService)globalAppConfig;
consumerId = sourceAppConfig.getSourceAppApiKey();
consumerSecret = sourceAppConfig.getSourceAppSecret();
} else {
GlobalTargetApplicationService tagetAppConfig =
(GlobalTargetApplicationService)globalAppConfig;
consumerId = tagetAppConfig.getTargetAppConsumerId();
consumerSecret = tagetAppConfig.getTargetAppConsumerSecret();
}
Twitter twitter = new TwitterFactory().getOAuthAuthorizedInstance(
consumerId,
consumerSecret);
log.info("Initialized Twitter client: {}", twitter);
String token = String.valueOf(data.get(KEY_TOKEN));
String secret = String.valueOf(data.get(KEY_TOKEN_SECRET));
String oauthVerifier = String.valueOf(data.get(KEY_OAUTH_VERIFIER));
RequestToken requestToken = new RequestToken(token, secret);
AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, oauthVerifier);
buf.append(" User Id: " + accessToken.getUserId());
buf.append(" User Screen Name: " + accessToken.getScreenName());
buf.append(" Access Token: " + accessToken.getToken());
buf.append(" Token Secret: " + accessToken.getTokenSecret());
log.info("Twitter User Data: {}", buf);
for (UserServiceConfig service : getUserServiceConfigs(userEmail)) {
String aToken = accessToken.getToken();
boolean duplicate = false;
if (service instanceof UserSourceServiceConfig) {
duplicate = aToken.equals(((UserSourceServiceConfig)service).getServiceAccessToken());
} else {
duplicate = aToken.equals(((UserTargetServiceConfig)service).getServiceAccessToken());
}
if (duplicate == true) {
throw new IllegalArgumentException("Token already registered: "
+ accessToken.getToken());
}
}
UserServiceConfig serviceConfig = createNewUserServiceConfig();
serviceConfig.setServiceProviderId(ID);
serviceConfig.setUserEmail(userEmail);
serviceConfig.setServiceUserId(String.valueOf(accessToken.getUserId()));
serviceConfig.setServiceUserName(accessToken.getScreenName());
serviceConfig.setUserSiteUrl("http://twitter.com/"
+ accessToken.getScreenName());
serviceConfig.setServiceAccessToken(accessToken.getToken());
serviceConfig.setServiceTokenSecret(accessToken.getTokenSecret());
if (serviceConfig instanceof UserSourceServiceConfig) {
UserSourceServiceConfig srcConfig = (UserSourceServiceConfig) serviceConfig;
MyPersistenceManagerFactory.addSourceServiceApp(userEmail, srcConfig);
} else {
UserTargetServiceConfig targetConfig = (UserTargetServiceConfig) serviceConfig;
log.info("Adding new user target config to database->{}", targetConfig);
MyPersistenceManagerFactory.addTargetServiceApp(userEmail, targetConfig);
}
return buf.toString();
}
/*
* (non-Javadoc)
*
* @see com.googlecode.flickr2twitter.intf.IServiceAuthorizer#
* requestAuthorization()
*/
@Override
public Map<String, Object> requestAuthorization(String baseUrl) throws Exception {
Map<String, Object> result = new HashMap<String, Object>();
try {
GlobalApplicationConfig globalAppConfig = getGlobalApplicationConfig();
Twitter twitter = new TwitterFactory().getInstance();
if (globalAppConfig instanceof GlobalSourceApplicationService) {
GlobalSourceApplicationService sourceAppConfig =
(GlobalSourceApplicationService)globalAppConfig;
twitter.setOAuthConsumer(sourceAppConfig.getSourceAppApiKey(),
sourceAppConfig.getSourceAppSecret());
} else {
GlobalTargetApplicationService tagetAppConfig =
(GlobalTargetApplicationService)globalAppConfig;
twitter.setOAuthConsumer(tagetAppConfig.getTargetAppConsumerId(),
tagetAppConfig.getTargetAppConsumerSecret());
}
if (baseUrl.endsWith("/oauth")) {
baseUrl = StringUtils.left(baseUrl, baseUrl.length() - "/oauth".length());
}
String callbackUrl = baseUrl + "/" + globalAppConfig.getAuthPagePath();
RequestToken requestToken = twitter.getOAuthRequestToken(callbackUrl);
log.info("Authentication URL: {}", requestToken.getAuthenticationURL());
log.info("Authorization URL: {}", requestToken.getAuthorizationURL());
result.put("url", requestToken.getAuthorizationURL());
result.put("token", requestToken.getToken());
result.put("secret", requestToken.getTokenSecret());
} catch (TwitterException e) {
throw e;
}
return result;
}
public String getId() {
return ID;
}
protected abstract M getGlobalApplicationConfig();
protected abstract List<N> getUserServiceConfigs(String userEmail);
protected abstract N createNewUserServiceConfig();
}