/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2010-2011 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* http://glassfish.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package com.sun.jersey.samples.oauth.twitterclient;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.oauth.client.OAuthClientFilter;
import com.sun.jersey.oauth.signature.OAuthParameters;
import com.sun.jersey.oauth.signature.OAuthSecrets;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.List;
import java.util.Properties;
/** Simple command-line application that uses Jersey OAuth client library to authenticate
* with Twitter.
*
* @author martin.matula@oracle.com
*/
public class App {
private static final BufferedReader IN = new BufferedReader(new InputStreamReader(System.in));
private static final String FRIENDS_TIMELINE_URI = "http://api.twitter.com/1/statuses/friends_timeline.xml";
private static final Properties PROPERTIES = new Properties();
private static final String PROPERTIES_FILE_NAME = "twitterclient.properties";
private static final String PROPERTY_CONSUMER_KEY = "consumerKey";
private static final String PROPERTY_CONSUMER_SECRET = "consumerSecret";
private static final String PROPERTY_TOKEN = "token";
private static final String PROPERTY_TOKEN_SECRET = "tokenSecret";
public static void main(String[] args) throws Exception {
// retrieve consumer key/secret and token/secret from the property file
// or system properties
loadSettings();
// create a new Jersey client
Client client = Client.create();
// create a new auth handler
OAuthClientFilter.AuthHandler authHandler = new OAuthClientFilter.AuthHandler() {
@Override
public void authorized(String token, String tokenSecret) {
// we received an authorized access token - store it for future runs
PROPERTIES.setProperty(PROPERTY_TOKEN, token);
PROPERTIES.setProperty(PROPERTY_TOKEN_SECRET, tokenSecret);
}
@Override
public String authorize(URI authorizationUri) {
try {
// we don't have an authorized access token
// ask user to provide authorization and return the generated
// verifier code
System.out.println("Enter the following URI into a web browser and authorize me:");
System.out.println(authorizationUri);
System.out.print("Enter the authorization code: ");
return IN.readLine();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
};
// create a new OAuth client filter passing the needed info as well as the AuthHandler
OAuthClientFilter filter = new OAuthClientFilter(
client.getProviders(),
new OAuthParameters().consumerKey(PROPERTIES.getProperty(PROPERTY_CONSUMER_KEY))
.token(PROPERTIES.getProperty(PROPERTY_TOKEN)),
new OAuthSecrets().consumerSecret(PROPERTIES.getProperty(PROPERTY_CONSUMER_SECRET))
.tokenSecret(PROPERTIES.getProperty(PROPERTY_TOKEN_SECRET)),
"http://twitter.com/oauth/request_token",
"http://twitter.com/oauth/access_token",
"http://twitter.com/oauth/authorize",
authHandler);
// Add filter to the client
client.addFilter(filter);
// make requests to protected resources
// (no need to care about the authorization flow)
do {
List<Status> statuses = client.resource(FRIENDS_TIMELINE_URI)
.get(new GenericType<List<Status>>() {});
for (Status s : statuses) {
System.out.println(s.getText());
System.out.println("[posted by " + s.getUser().getName() + " at " + s.getCreatedAt() + "]");
}
System.out.println();
System.out.println("Please hit Enter to refresh, or enter a non-empty line to quit.");
} while (IN.readLine().equals(""));
// persist the current consumer key/secret and token/secret for future use
storeSettings();
}
private static void loadSettings() {
FileInputStream st = null;
try {
st = new FileInputStream(PROPERTIES_FILE_NAME);
PROPERTIES.load(st);
} catch (IOException e) {
// ignore
} finally {
if (st != null) {
try {
st.close();
} catch (IOException ex) {
// ignore
}
}
}
for (String name : new String[] {PROPERTY_CONSUMER_KEY, PROPERTY_CONSUMER_SECRET,
PROPERTY_TOKEN, PROPERTY_TOKEN_SECRET}) {
String value = System.getProperty(name);
if (value != null) {
PROPERTIES.setProperty(name, value);
}
}
if (PROPERTIES.getProperty(PROPERTY_CONSUMER_KEY) == null
|| PROPERTIES.getProperty(PROPERTY_CONSUMER_SECRET) == null) {
System.out.println("No consumerKey and/or consumerSecret found in twitterclient.properties file. "
+ "You have to provide these as system properties.");
System.exit(1);
}
}
private static void storeSettings() {
FileOutputStream st = null;
try {
st = new FileOutputStream(PROPERTIES_FILE_NAME);
PROPERTIES.store(st, null);
} catch (IOException e) {
// ignore
} finally {
try {
st.close();
} catch (IOException ex) {
// ignore
}
}
}
}