cleaning out the code that's responsible for acquiriing the first request token

This commit is contained in:
Josh Long
2010-08-29 00:54:29 +00:00
parent 2b903d1210
commit b8ed5eeffd
4 changed files with 89 additions and 71 deletions

View File

@@ -42,7 +42,7 @@ abstract public class AbstractOAuthAccessTokenBasedFactoryBean<T> implements Ini
protected OAuthConfiguration configuration; protected OAuthConfiguration configuration;
protected final Object monitor = new Object(); protected final Object monitor = new Object();
protected volatile T twitter; protected volatile T twitter;
protected volatile AccessTokenInitialRequestProcessListener accessTokenInitialRequestProcessListener; // protected volatile AccessTokenInitialRequestProcessListener accessTokenInitialRequestProcessListener;
protected volatile boolean initialized = false; protected volatile boolean initialized = false;
/** /**
@@ -84,20 +84,20 @@ abstract public class AbstractOAuthAccessTokenBasedFactoryBean<T> implements Ini
*/ */
public void afterPropertiesSet() throws Exception { public void afterPropertiesSet() throws Exception {
synchronized (this.monitor) { synchronized (this.monitor) {
if (this.accessTokenInitialRequestProcessListener == null) { /*if (this.accessTokenInitialRequestProcessListener == null) {
accessTokenInitialRequestProcessListener = new ConsoleBasedAccessTokenInitialRequestProcessListener(); accessTokenInitialRequestProcessListener = new ConsoleBasedAccessTokenInitialRequestProcessListener();
} }*/
Assert.notNull(this.configuration.getConsumerKey(), "'consumerKey' mustn't be null"); Assert.notNull(this.configuration.getConsumerKey(), "'consumerKey' mustn't be null");
Assert.notNull(this.configuration.getConsumerSecret(), "'consumerSecret' mustn't be null"); Assert.notNull(this.configuration.getConsumerSecret(), "'consumerSecret' mustn't be null");
AccessToken accessTokenObj; AccessToken accessTokenObj=null;
establishTwitterObject(accessTokenObj);
if (StringUtils.hasText(this.configuration.getAccessToken()) && StringUtils.hasText(this.configuration.getAccessTokenSecret())) { if (StringUtils.hasText(this.configuration.getAccessToken()) && StringUtils.hasText(this.configuration.getAccessTokenSecret())) {
accessTokenObj = new AccessToken(this.configuration.getAccessToken(), this.configuration.getAccessTokenSecret()); accessTokenObj = new AccessToken(this.configuration.getAccessToken(), this.configuration.getAccessTokenSecret());
} else { } /*else {
accessTokenObj = initialAuthorizationWizard(); // accessTokenObj = initialAuthorizationWizard();
} }*/
establishTwitterObject(accessTokenObj); establishTwitterObject(accessTokenObj);
@@ -107,11 +107,11 @@ abstract public class AbstractOAuthAccessTokenBasedFactoryBean<T> implements Ini
} }
} }
@SuppressWarnings("unused") /*@SuppressWarnings("unused")
public void setAccessTokenInitialRequestProcessListener(AccessTokenInitialRequestProcessListener accessTokenInitialRequestProcessListener) { public void setAccessTokenInitialRequestProcessListener(AccessTokenInitialRequestProcessListener accessTokenInitialRequestProcessListener) {
this.accessTokenInitialRequestProcessListener = accessTokenInitialRequestProcessListener; this.accessTokenInitialRequestProcessListener = accessTokenInitialRequestProcessListener;
} }
*/
public abstract void establishTwitterObject(AccessToken accessToken) public abstract void establishTwitterObject(AccessToken accessToken)
throws Exception; throws Exception;
@@ -154,6 +154,7 @@ abstract public class AbstractOAuthAccessTokenBasedFactoryBean<T> implements Ini
* @return returns the freshly created {@link twitter4j.http.AccessToken} object from the service * @return returns the freshly created {@link twitter4j.http.AccessToken} object from the service
* @throws Exception for just about any deviation from the expected * @throws Exception for just about any deviation from the expected
*/ */
/*
private AccessToken initialAuthorizationWizard() throws Exception { private AccessToken initialAuthorizationWizard() throws Exception {
Assert.notNull(this.accessTokenInitialRequestProcessListener, "'accessTokenInitialRequestProcessListener' can't be null"); Assert.notNull(this.accessTokenInitialRequestProcessListener, "'accessTokenInitialRequestProcessListener' can't be null");
@@ -170,6 +171,7 @@ abstract public class AbstractOAuthAccessTokenBasedFactoryBean<T> implements Ini
return null; return null;
} }
*/
/** /**
* Responsibility of subclasses to call this because we cant dereference the generic type appropriately. The responsibility is * Responsibility of subclasses to call this because we cant dereference the generic type appropriately. The responsibility is

View File

@@ -19,12 +19,23 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils; import org.apache.commons.lang.SystemUtils;
import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.core.io.FileSystemResource;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken; import twitter4j.http.AccessToken;
import twitter4j.http.RequestToken;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
@@ -36,33 +47,74 @@ import java.util.Properties;
* @author Josh Long * @author Josh Long
*/ */
public class ConsoleBasedAccessTokenInitialRequestProcessListener implements AccessTokenInitialRequestProcessListener { public class ConsoleBasedAccessTokenInitialRequestProcessListener implements AccessTokenInitialRequestProcessListener {
public String openUrlAndReturnPin(String urlToOpen) public String openUrlAndReturnPin(String urlToOpen)
throws Exception { throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Open the following URL and grant access to your account:"); System.out.println("Open the following URL and grant access to your account:");
System.out.println(urlToOpen); System.out.println(urlToOpen);
System.out.print("Enter the PIN(if aviailable) or just hit enter.[PIN]:"); System.out.print("Enter the PIN(if aviailable) or just hit enter.[PIN]:");
return StringUtils.trim(br.readLine()); return StringUtils.trim(br.readLine());
} }
public void persistReturnedAccessToken(AccessToken accessToken) public void persistReturnedAccessToken(AccessToken accessToken)
throws Exception { throws Exception {
Map<String, String> output = new HashMap<String, String>(); Map<String, String> output = new HashMap<String, String>();
output.put(OAuthConfigurationFactoryBean.WELL_KNOWN_CONSUMER_ACCESS_TOKEN, accessToken.getToken()); output.put(OAuthConfigurationFactoryBean.WELL_KNOWN_CONSUMER_ACCESS_TOKEN, accessToken.getToken());
output.put(OAuthConfigurationFactoryBean.WELL_KNOWN_CONSUMER_ACCESS_TOKEN_SECRET, accessToken.getTokenSecret()); output.put(OAuthConfigurationFactoryBean.WELL_KNOWN_CONSUMER_ACCESS_TOKEN_SECRET, accessToken.getTokenSecret());
File accessTokenCreds = new File(SystemUtils.getJavaIoTmpDir(), "twitter-accesstoken.properties"); File accessTokenCreds = new File(SystemUtils.getJavaIoTmpDir(), "twitter-accesstoken.properties");
FileOutputStream fileOutputStream = new FileOutputStream(accessTokenCreds); FileOutputStream fileOutputStream = new FileOutputStream(accessTokenCreds);
Properties props = new Properties(); Properties props = new Properties();
props.putAll(output); props.putAll(output);
props.store(fileOutputStream, "oauth-access-token"); props.store(fileOutputStream, "oauth-access-token");
IOUtils.closeQuietly(fileOutputStream); IOUtils.closeQuietly(fileOutputStream);
System.out.println("The oauth accesstoken credentials have been written to " + accessTokenCreds.getAbsolutePath()); System.out.println("The oauth accesstoken credentials have been written to " + accessTokenCreds.getAbsolutePath());
} }
public void failure(Throwable t) { public void failure(Throwable t) {
System.err.println("Exception occurred when trying to retrieve credentials: " + ExceptionUtils.getFullStackTrace(t)); System.err.println("Exception occurred when trying to retrieve credentials: " + ExceptionUtils.getFullStackTrace(t));
} }
public static void main(String[] args) throws Exception {
File twitterProps = new File(SystemUtils.getUserHome(), "Desktop/twitter.properties");
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new FileSystemResource(twitterProps));
propertiesFactoryBean.afterPropertiesSet() ;
Properties props = propertiesFactoryBean.getObject();
String key = StringUtils.trim(props.getProperty("twitter.oauth.consumerKey"));
String secret = StringUtils.trim( props.getProperty("twitter.oauth.consumerSecret") ) ;
ConsoleBasedAccessTokenInitialRequestProcessListener consoleBasedAccessTokenInitialRequestProcessListener = new ConsoleBasedAccessTokenInitialRequestProcessListener();
Twitter twitter = new TwitterFactory().getOAuthAuthorizedInstance( key, secret);
RequestToken requestToken = twitter.getOAuthRequestToken();
AccessToken accessToken = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (null == accessToken) {
String pin = consoleBasedAccessTokenInitialRequestProcessListener.openUrlAndReturnPin(requestToken.getAuthorizationURL());
try {
if (pin.length() > 0) {
accessToken = twitter.getOAuthAccessToken(requestToken, pin);
} else {
accessToken = twitter.getOAuthAccessToken();
}
} catch (TwitterException te) {
if (401 == te.getStatusCode()) {
System.out.println("Unable to get the access token.");
} else {
te.printStackTrace();
}
}
}
consoleBasedAccessTokenInitialRequestProcessListener.persistReturnedAccessToken(accessToken);
}
} }

View File

@@ -15,19 +15,11 @@
*/ */
package org.springframework.integration.twitter.oauth; package org.springframework.integration.twitter.oauth;
import org.apache.commons.lang.SystemUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.core.io.FileSystemResource;
import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Twitter; import twitter4j.Twitter;
import twitter4j.TwitterFactory; import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken; import twitter4j.http.AccessToken;
import twitter4j.http.RequestToken; import twitter4j.http.RequestToken;
import java.io.File;
import java.util.Properties;
public class OAuthAccessTokenBasedTwitterFactoryBean extends AbstractOAuthAccessTokenBasedFactoryBean<Twitter> { public class OAuthAccessTokenBasedTwitterFactoryBean extends AbstractOAuthAccessTokenBasedFactoryBean<Twitter> {
protected OAuthAccessTokenBasedTwitterFactoryBean(OAuthConfiguration configuration) { protected OAuthAccessTokenBasedTwitterFactoryBean(OAuthConfiguration configuration) {
@@ -66,22 +58,5 @@ public class OAuthAccessTokenBasedTwitterFactoryBean extends AbstractOAuthAccess
return Twitter.class; return Twitter.class;
} }
public static void main(String[] args) throws Throwable {
File propsFile = new File(new File(SystemUtils.getUserHome(), "Desktop"), "twitter.properties");
FileSystemResource fileSystemResource = new FileSystemResource(propsFile);
Properties properties = fromResource(fileSystemResource);
OAuthConfigurationFactoryBean oAuthConfigurationFactoryBean = new OAuthConfigurationFactoryBean();
oAuthConfigurationFactoryBean.bootstrapFromProperties(properties);
OAuthConfiguration configuration = oAuthConfigurationFactoryBean.getObject();
Twitter twitter = configuration.getTwitter();
System.out.println("Used the " + OAuthAccessTokenBasedTwitterFactoryBean.class.getName() + " and arrived at " + ToStringBuilder.reflectionToString(twitter));
ResponseList<Status> friendsTimeline = twitter.getFriendsTimeline();
System.out.println("Friends' timeline " + friendsTimeline);
Thread.sleep(10000);
}
} }

View File

@@ -40,14 +40,6 @@ public class OAuthConfiguration {
this.accessTokenSecret = accessTokenSecret; this.accessTokenSecret = accessTokenSecret;
} }
/** package friendly */
/* void setAsyncTwitter(AsyncTwitter asyncTwitter) {
this.asyncTwitter = asyncTwitter;
}*/
/**
* package friendly
*/
void setTwitter(Twitter twitter) { void setTwitter(Twitter twitter) {
this.twitter = twitter; this.twitter = twitter;
} }
@@ -59,10 +51,7 @@ public class OAuthConfiguration {
return twitter; return twitter;
} }
/*
public AsyncTwitter getAsyncTwitter() {
return asyncTwitter;
}*/
public String getConsumerKey() { public String getConsumerKey() {
return consumerKey; return consumerKey;