cleaning out the code that's responsible for acquiriing the first request token
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user