// BlogBridge -- RSS feed reader, manager, and web based service // Copyright (C) 2002-2006 by R. Pito Salas // // This program is free software; you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free Software Foundation; // either version 2 of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along with this program; // if not, write to the Free Software Foundation, Inc., 59 Temple Place, // Suite 330, Boston, MA 02111-1307 USA // // Contact: R. Pito Salas // mailto:pitosalas@users.sourceforge.net // More information: about BlogBridge // http://www.blogbridge.com // http://sourceforge.net/projects/blogbridge // // $Id$ // package com.salas.bb.twitter; import com.jgoodies.binding.beans.Model; import com.jgoodies.uif.util.ResourceUtils; import com.salas.bb.utils.StringUtils; import oauth.signpost.OAuth; import oauth.signpost.OAuthConsumer; import oauth.signpost.OAuthProvider; import oauth.signpost.basic.DefaultOAuthConsumer; import oauth.signpost.basic.DefaultOAuthProvider; import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; import oauth.signpost.exception.OAuthException; import java.util.prefs.Preferences; /** * Preferences. */ public class TwitterPreferences extends Model { public static final String PROP_TWITTER_ENABLED = "twitter.enabled"; public static final String PROP_TWITTER_SCREEN_NAME = "twitter.screenName"; public static final String PROP_TWITTER_ACCESS_TOKEN = "twitter.access_token"; public static final String PROP_TWITTER_TOKEN_SECRET = "twitter.token_secret"; public static final String PROP_TWITTER_PROFILE_PICS = "twitter.profile.pics"; public static final String PROP_TWITTER_PASTE_LINK = "twitter.paste.link"; public static final String PROP_ENABLED = "enabled"; public static final String PROP_SCREEN_NAME = "screenName"; public static final String PROP_PASSWORD = "password"; public static final String PROP_PROFILE_PICS = "profilePics"; public static final String PROP_PASTE_LINK = "pasteLink"; private boolean enabled; private String screenName; private String password; private String accessToken; private String tokenSecret; private String pinToken; private String pinTokenSecret; private boolean profilePics; private boolean pasteLink; /** * Returns TRUE when the Twitter support is enabled. * * @return TRUE when the Twitter support is enabled. */ public boolean isEnabled() { return enabled; } /** * Enables / disables Twitter support. * * @param enabled TRUE to enable. */ public void setEnabled(boolean enabled) { boolean old = this.enabled; this.enabled = enabled; firePropertyChange(PROP_ENABLED, old, enabled); } /** * Returns TRUE when profile pics should be shown in tooltips. * * @return profile pics enabled. */ public boolean isProfilePics() { return profilePics; } /** * Enables / disables profile pics in tooltips. * * @param profilePics TRUE to show. */ public void setProfilePics(boolean profilePics) { boolean old = this.profilePics; this.profilePics = profilePics; firePropertyChange(PROP_PROFILE_PICS, old, profilePics); } /** * Returns TRUE when automatic link pasting is enabled. * * @return TRUE when automatic link pasting is enabled. */ public boolean isPasteLink() { return pasteLink; } /** * Enables / disables automatic link pasting. * * @param pasteLink TRUE to enable. */ public void setPasteLink(boolean pasteLink) { boolean old = this.pasteLink; this.pasteLink = pasteLink; firePropertyChange(PROP_PASTE_LINK, old, pasteLink); } /** * Returns the Twitter screen name. * * @return screen name. */ public String getScreenName() { return screenName; } /** * Sets the screen name. * * @param screenName name. */ public void setScreenName(String screenName) { String old = this.screenName; this.screenName = screenName; firePropertyChange(PROP_SCREEN_NAME, old, screenName); resetURLDependentActions(); } /** * Returns the access token. * * @return access token. */ public String getAccessToken() { return accessToken; } /** * Sets the access token. * * @param accessToken access token. */ public void setAccessToken(String accessToken) { String old = this.accessToken; this.accessToken = accessToken; firePropertyChange(PROP_TWITTER_ACCESS_TOKEN, old, accessToken); resetURLDependentActions(); } /** * Returns the token secret. * * @return token secret. */ public String getTokenSecret() { return tokenSecret; } /** * Sets the token secret. * * @param tokenSecret token secret. */ public void setTokenSecret(String tokenSecret) { String old = this.tokenSecret; this.tokenSecret = tokenSecret; firePropertyChange(PROP_TWITTER_TOKEN_SECRET, old, tokenSecret); resetURLDependentActions(); } /** * Persists the information about blogs in the preferences map. * * @param prefs map. */ public void store(Preferences prefs) { prefs.putBoolean(PROP_TWITTER_ENABLED, isEnabled()); if (getScreenName() == null) prefs.remove(PROP_TWITTER_SCREEN_NAME); else prefs.put(PROP_TWITTER_SCREEN_NAME, getScreenName()); if (getAccessToken() == null) prefs.remove(PROP_TWITTER_ACCESS_TOKEN); else prefs.put(PROP_TWITTER_ACCESS_TOKEN, getAccessToken()); if (getTokenSecret() == null) prefs.remove(PROP_TWITTER_TOKEN_SECRET); else prefs.put(PROP_TWITTER_TOKEN_SECRET, getTokenSecret()); prefs.putBoolean(PROP_PROFILE_PICS, isProfilePics()); prefs.putBoolean(PROP_PASTE_LINK, isPasteLink()); } /** * Restores the information about blogs from the preferences map. * * @param prefs map. */ public void restore(Preferences prefs) { setEnabled(prefs.getBoolean(PROP_TWITTER_ENABLED, false)); setScreenName(prefs.get(PROP_TWITTER_SCREEN_NAME, null)); setAccessToken(prefs.get(PROP_TWITTER_ACCESS_TOKEN, null)); setTokenSecret(prefs.get(PROP_TWITTER_TOKEN_SECRET, null)); setProfilePics(prefs.getBoolean(PROP_PROFILE_PICS, true)); setPasteLink(prefs.getBoolean(PROP_PASTE_LINK, true)); } /** * Resets actions that depend on URLs after the preferences change. */ private static void resetURLDependentActions() { FollowAction.getInstance().setUserURL(null); ReplyAction.getInstance().setUserURL(null); SubscribeAction.getInstance().setUserURL(null); } /** * Returns TRUE if twitter is authorized. * * @return TRUE if authorized. */ public boolean isAuthorized() { return StringUtils.isNotEmpty(getAccessToken()) && StringUtils.isNotEmpty(getTokenSecret()); } /** * Returns consumer object required to sign the requests. * * @return consumer. */ public OAuthConsumer getConsumer() { OAuthConsumer c = getHttpClientConsumer(); // Init consumer with tokens if available if (getAccessToken() != null && getTokenSecret() != null) { c.setTokenWithSecret(getAccessToken(), getTokenSecret()); } return c; } public static OAuthConsumer getHttpClientConsumer() { String consumerKey = ResourceUtils.getString("twitter.consumer_key"); String consumerSecret = ResourceUtils.getString("twitter.consumer_secret"); return new CommonsHttpOAuthConsumer(consumerKey, consumerSecret); } /** * Returns the default consumer, not initialized with user tokens. * * @return consumer. */ public static OAuthConsumer getDefaultConsumer() { String consumerKey = ResourceUtils.getString("twitter.consumer_key"); String consumerSecret = ResourceUtils.getString("twitter.consumer_secret"); return new DefaultOAuthConsumer(consumerKey, consumerSecret); } public static DefaultOAuthProvider getDefaultProvider() { return new DefaultOAuthProvider( "http://twitter.com/oauth/request_token", "http://twitter.com/oauth/access_token", "http://twitter.com/oauth/authorize"); } public String getAuthURL() { OAuthProvider provider = getDefaultProvider(); OAuthConsumer consumer = getDefaultConsumer(); String authURL = null; try { authURL = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND); pinToken = consumer.getToken(); pinTokenSecret = consumer.getTokenSecret(); } catch (OAuthException e) { // Auth exception } return authURL; } public void acquireAccessTokens(String pin) throws OAuthException { OAuthProvider provider = getDefaultProvider(); OAuthConsumer consumer = getDefaultConsumer(); consumer.setTokenWithSecret(pinToken, pinTokenSecret); pinToken = null; pinTokenSecret = null; provider.retrieveAccessToken(consumer, pin); setAccessToken(consumer.getToken()); setTokenSecret(consumer.getTokenSecret()); setScreenName(provider.getResponseParameters().get("screen_name").first()); } public void unauthorize() { setAccessToken(null); setTokenSecret(null); setScreenName(null); } }