summaryrefslogtreecommitdiff
path: root/src/main/TweetShell.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/TweetShell.java')
-rw-r--r--src/main/TweetShell.java217
1 files changed, 217 insertions, 0 deletions
diff --git a/src/main/TweetShell.java b/src/main/TweetShell.java
new file mode 100644
index 0000000..533939b
--- /dev/null
+++ b/src/main/TweetShell.java
@@ -0,0 +1,217 @@
+package main;
+
+import io.OAuthRequester;
+import io.StreamImpl;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+import java.util.Scanner;
+import mining.Stream;
+import mining.TwitterApi;
+import org.json.JSONObject;
+import provider.ExceptionListener;
+import provider.ResultListener;
+
+/**
+ * Provides an interactive shell where requests can be made and displayed.
+ */
+public class TweetShell implements TwitterApi.PinSupplier {
+
+ private final Scanner scanner = new Scanner(System.in);
+
+ public TweetShell() {
+
+ }
+ private TwitterApi api_cached;
+ private Stream stream_cached;
+
+ private TwitterApi getApi() throws IOException {
+ if (api_cached == null) {
+ api_cached = TwitterApi.getOAuth(this);
+ }
+ return api_cached;
+ }
+
+ private Stream getStream() throws IOException {
+ if (stream_cached == null) {
+ OAuthRequester requester = (OAuthRequester) getApi().getRequester();
+ StreamHandler handler = new StreamHandler();
+ stream_cached = new StreamImpl(handler, handler, requester);
+ }
+ return stream_cached;
+ }
+
+ private class StreamHandler implements ResultListener, ExceptionListener {
+
+ @Override
+ public void exceptionGenerated(Exception ex) {
+ System.err.println("Stream closed due to " + ex);
+ }
+
+ @Override
+ public void tweetGenerated(JSONObject obj) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+ @Override
+ public void profileGenerated(JSONObject obj) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+ }
+
+ @Override
+ public String requestPin(String url) throws IOException {
+ System.err.println(url);
+ System.err.println("Please open the above URL and enter PIN:");
+ return scanner.nextLine();
+ }
+
+ private void printPrompt() {
+ if (stream_cached == null) {
+ System.out.print("$ ");
+ } else {
+ System.out.print("€ ");
+ }
+ }
+ /**
+ * Processes commands from stdin until the exit command is received or EOF.
+ */
+ public void process_forever() {
+ System.err.println("Entering interactive shell, type 'help' for help "
+ + "or 'exit' to leave.");
+ // print prompt for reading first command
+ printPrompt();
+ while (scanner.hasNextLine()) {
+ String line = scanner.nextLine().trim();
+ String[] args = line.split("\\s+", 2);
+ if (!args[0].isEmpty()) {
+ // non-empty command, let's see whether it makes sense?
+ if (!execute(args)) {
+ // requested to terminate
+ break;
+ }
+ }
+ // print prompt for reading next line
+ printPrompt();
+ }
+ }
+
+ /**
+ * Executes a command with optional parameters.
+ *
+ * @param args An array with the first argument containing the command with
+ * optional parameters in following arguments.
+ * @return true if more commands are allowed to be executed, false
+ * otherwise.
+ */
+ public boolean execute(String[] args) {
+ try {
+ Command command = Command.fromString(args[0]);
+ String[] params = Arrays.copyOfRange(args, 1, args.length);
+ execute(command, params);
+ } catch (IllegalArgumentException ex) {
+ System.err.println(ex.getMessage());
+ } catch (IOException ex) {
+ System.err.println("Command " + args[0] + " failed with " + ex);
+ ex.printStackTrace();
+ } catch (NoSuchElementException ex) {
+ // thrown by the "exit" command to signal exit
+ return false;
+ }
+ // another satisfied customer, next!
+ return true;
+ }
+
+ enum Command {
+
+ add("Adds a keyword to search", 1),
+ del("Deletes a keyword from search", 1),
+ commit("Activate the stream or apply the stream keyword changes"),
+ close("Close the stream"),
+ test(""),
+ exit("Returns to shell"),
+ help("Get help");
+
+ private final String description;
+ private final int paramCount;
+
+ Command(String description) {
+ this.description = description;
+ this.paramCount = 0;
+ }
+
+ Command(String description, int paramCount) {
+ this.description = description;
+ this.paramCount = paramCount;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public int getParamCount() {
+ return paramCount;
+ }
+
+ public static Command fromString(String command) {
+ for (Command cmd : values()) {
+ if (cmd.name().equals(command)) {
+ return cmd;
+ }
+ }
+ throw new IllegalArgumentException("Unrecognized command. Hint: help");
+ }
+ };
+
+ private final String[] HELP = new String[]{
+ "Interactive TweetShell",
+ "",
+ "Available commands:"
+ };
+
+ private void execute(Command command, String[] params) throws IOException {
+ if (params.length < command.getParamCount()) {
+ throw new IllegalArgumentException("Expected "
+ + command.getParamCount() + " parameters, got only "
+ + params.length);
+ }
+ switch (command) {
+ case add:
+ getStream().watchKeyword(params[0]);
+ break;
+ case del:
+ getStream().unwatchKeyword(params[0]);
+ break;
+ case commit:
+ getStream().commit();
+ break;
+ case close:
+ getStream().close();
+ break;
+ case test:
+ getStream().poll();
+ break;
+ case help:
+ for (String line : HELP) {
+ System.out.println(line);
+ }
+ for (Command cmd : Command.values()) {
+ System.out.printf(" %-10s", cmd.name());
+ if (!cmd.getDescription().isEmpty()) {
+ System.out.print(" " + cmd.getDescription());
+ }
+ if (cmd.getParamCount() == 1) {
+ System.out.print(" (1 arg)");
+ } else if (cmd.getParamCount() > 1) {
+ System.out.printf(" (%d args)", cmd.getParamCount());
+ }
+ System.out.println();
+ }
+ break;
+ case exit:
+ throw new NoSuchElementException();
+ default:
+ throw new AssertionError(command.name());
+ }
+ }
+}