From 1594e845a2ddfbc6816f1d08fce9546eec3d715f Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Thu, 24 Apr 2014 19:55:03 +0200 Subject: Main is a command line program now Test with: ./run.sh --- run.sh | 31 ++++++++++++ src/main/Main.java | 143 +++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 165 insertions(+), 9 deletions(-) create mode 100755 run.sh diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..3a92d1f --- /dev/null +++ b/run.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# You should build the jar file with `ant jar`, then run this script + +if [ -z "$CA" ]; then + CA=/tmp/cap/.keystore +fi + +# Proxy parameters from +# http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#Customization +proxy_options() { + # Do not add proxy options if there is no CA or no_proxy env is set + if [ -z "$CA" ] || [ -n "$no_proxy" ]; then + return + fi + + echo -Dhttps.proxyHost=localhost + echo -Dhttps.proxyPort=8008 + echo -Djavax.net.ssl.trustStore=$CA +} + +# Exit on errors +set -e + +# Change dir to project +cd "$(dirname "$(readlink -f "$0")")" + +jar=dist/TwitterDataAnalytics.jar +# Build jar if missing +[ -e "$jar" ] || ant jar + +java $(proxy_options) -jar "$jar" "$@" diff --git a/src/main/Main.java b/src/main/Main.java index 20bbec9..a62232a 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -1,25 +1,150 @@ package main; import java.io.IOException; +import java.util.Arrays; +import java.util.Scanner; import mining.TwitterApi; import org.json.JSONException; import org.json.JSONObject; /** - * + * Class for manually testing the Twitter API. */ public class Main { + /** + * Command and parameters without options. + */ + private Command command; + private String[] params; + /** + * Whether to use the Bearer method or OAuth-signed requests. + */ + private boolean useBearer = true; + private TwitterApi api_cached; + + public Main(String[] args) throws IOException { + // parse options and command and return the parameters. + parseGlobalOptions(args); + } + + private TwitterApi getApi() throws IOException { + if (api_cached == null) { + if (useBearer) { + api_cached = TwitterApi.getAppOnly(); + } else { + api_cached = TwitterApi.getOAuth(new ConsolePinSupplier()); + } + } + return api_cached; + } + + private String getParam(int index, String name) { + if (index >= params.length) { + System.err.println("Missing parameter: " + name); + System.exit(1); + } + return params[index]; + } + + private void parseGlobalOptions(String[] args) { + int firstParam = -1; + /* parse global options */ + for (int i = 0; i < args.length; i++) { + if ("--oauth".equals(args[i])) { + useBearer = false; + } else if (args[i].startsWith("-")) { + throw new IllegalArgumentException("Invalid option: " + args[i]); + } else { + /* not an option, must be a command */ + command = Command.fromString(args[i]); + firstParam = i + 1; + break; + } + } + if (firstParam == -1) { + throw new IllegalArgumentException("Missing command, use \"help\""); + } + params = Arrays.copyOfRange(args, firstParam, args.length); + } + public static void main(String[] args) throws IOException { - TwitterApi api = TwitterApi.getAppOnly(); try { - JSONObject profile = api.build("users/show") - .param("screen_name", "Lekensteyn") - .request(); - System.out.println(profile.toString(4)); - } catch (JSONException ex) { - /* cannot happen */ - throw new RuntimeException(ex); + Main main = new Main(args); + main.execute(); + } catch (IllegalArgumentException ex) { + System.err.println(ex.getMessage()); + System.exit(1); + } + } + + enum Command { + + user, + help; + + public static Command fromString(String command) { + for (Command cmd : values()) { + if (cmd.name().equals(command)) { + return cmd; + } + } + throw new IllegalArgumentException("Unrecognized command "); + } + }; + + private final static String[] HELP = { + "Global options:", + " --oauth Use OAuth (PIN) instead of Bearer tokens", + "", + "Available commands:" + }; + + public void execute() throws IOException { + TwitterApi.Builder req = null; + /* build a request for commands */ + switch (command) { + case user: + req = getApi().build("users/show"); + req.param("screen_name", getParam(0, "screen name")); + break; + case help: + for (String line : HELP) { + System.out.println(line); + } + for (Command cmd : Command.values()) { + System.out.println(" " + cmd.name()); + } + break; + default: + throw new AssertionError(command.name()); + } + if (req != null) { + System.err.println("Executing: " + req.toString()); + JSONObject result = req.request(); + try { + System.out.println(result.toString(4)); + } catch (JSONException ex) { + /* cannot happen */ + System.err.println("Warning: got JSON exception: " + ex); + System.out.println(result); + } + } + } + + private static class ConsolePinSupplier implements TwitterApi.PinSupplier { + + private final Scanner scanner; + + public ConsolePinSupplier() { + scanner = new Scanner(System.in); + } + + @Override + public String requestPin(String url) throws IOException { + System.out.println(url); + System.err.println("Please open the above URL and enter PIN:"); + return scanner.nextLine(); } } } -- cgit v1.2.1