From 150539368127e61af9d076bd30e3f49d13db4430 Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Fri, 2 May 2014 13:20:31 +0200 Subject: Persist a single set of targets for all streams * Split ResultListener and ExceptionListener implementation, the methods turns out not to be closely related. * Extract CompositeResultListener from Stream, making TweetShell own it, this simplifies code and allows you to have targets even if no stream is instantiated. --- src/main/TweetShell.java | 63 ++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/src/main/TweetShell.java b/src/main/TweetShell.java index fa1fb49..6d9edd1 100644 --- a/src/main/TweetShell.java +++ b/src/main/TweetShell.java @@ -31,6 +31,16 @@ public class TweetShell implements TwitterApi.PinSupplier { private TwitterApi api_cached; private Stream stream_cached; + private final CompositeResultListener resultListeners; + + public TweetShell() { + resultListeners = new CompositeResultListener(); + // by default, store something that counts responses + resultListeners.register(new TweetCounter()); + // and something that prints tweets to console. + resultListeners.register(new StreamHandler()); + // see getPossibleTargets() for more listener types. + } private TwitterApi getApi() throws IOException { if (api_cached == null) { @@ -42,27 +52,23 @@ public class TweetShell implements TwitterApi.PinSupplier { private Stream getStream() throws IOException { if (stream_cached == null) { OAuthRequester requester = (OAuthRequester) getApi().getRequester(); - StreamHandler handler = new StreamHandler(); stream_cached = new StreamImpl(requester); StreamImpl streamObserver = (StreamImpl) stream_cached; - streamObserver.setExceptionListener(handler); - - CompositeResultListener listeners = new CompositeResultListener(); - streamObserver.setResultListener(listeners); - // by default, store something that counts responses - listeners.register(new TweetCounter()); - // and something that prints tweets to console. - listeners.register(handler); + streamObserver.setExceptionListener(new StreamExceptionHandler()); + streamObserver.setResultListener(resultListeners); } return stream_cached; } - private class StreamHandler implements ResultListener, ExceptionListener { + private class StreamExceptionHandler implements ExceptionListener { @Override public void exceptionGenerated(Exception ex) { System.err.println("Stream closed due to " + ex); } + } + + private class StreamHandler implements ResultListener { @Override public void tweetGenerated(JSONObject obj) { @@ -269,13 +275,11 @@ public class TweetShell implements TwitterApi.PinSupplier { case exit: throw new NoSuchElementException(); case target: - StreamImpl stream = (StreamImpl) getStream(); - CompositeResultListener rls; - rls = (CompositeResultListener) stream.getResultListener(); if (params.length > 0) { - configureTargets(rls, params); + configureTargets(params); } else { - ClassEnabledTracker targets = getPossibleTargets(rls); + ClassEnabledTracker targets; + targets = getPossibleTargets(); // print the names of all targets that are enabled System.out.print("Enabled targets:"); for (String name : targets.getNames()) { @@ -290,25 +294,24 @@ public class TweetShell implements TwitterApi.PinSupplier { } /** - * @param stream An instance for which open targets apply to. * @return All targets that can be disabled or enabled. */ - private ClassEnabledTracker getPossibleTargets(CompositeResultListener rls) { + private ClassEnabledTracker getPossibleTargets() { Map> targets = new TreeMap<>(); targets.put("file", DataWriter.class); targets.put("shell", StreamHandler.class); ClassEnabledTracker targetFoo = new ClassEnabledTracker<>(targets); targetFoo.disableAll(); - targetFoo.enableClasses(rls.getRegistered()); + targetFoo.enableClasses(resultListeners.getRegistered()); return targetFoo; } /** * Process enable and disable target parameters. */ - private void configureTargets(CompositeResultListener rls, String[] params) { - ClassEnabledTracker targets = getPossibleTargets(rls); + private void configureTargets(String[] params) { + ClassEnabledTracker targets = getPossibleTargets(); for (String type : params) { String name; @@ -333,20 +336,19 @@ public class TweetShell implements TwitterApi.PinSupplier { } } for (String name : targets.getDisabled()) { - if (disableTarget(rls, targets.getClassByName(name))) { + if (disableTarget(targets.getClassByName(name))) { System.err.println("Disabled " + name); } } for (String name : targets.getEnabled()) { - if (enableTarget(rls, targets.getClassByName(name))) { + if (enableTarget(targets.getClassByName(name))) { System.err.println("Enabled " + name); } } } - private boolean enableTarget(CompositeResultListener rls, - Class rlCls) { - ResultListener oldListener = rls.findListener(rlCls); + private boolean enableTarget(Class rlCls) { + ResultListener oldListener = resultListeners.findListener(rlCls); // don't add it again if already activated if (oldListener != null) { @@ -359,26 +361,25 @@ public class TweetShell implements TwitterApi.PinSupplier { String profilesFilename = config.getProperty(DataWriter.CFG_PROFILE_FILENAME); String tweetsFilename = config.getProperty(DataWriter.CFG_TWEETS_FILENAME); - rls.register(new DataWriter(profilesFilename, tweetsFilename)); + resultListeners.register(new DataWriter(profilesFilename, tweetsFilename)); // save the changes to the config. config.save(); } else if (rlCls == StreamHandler.class) { - rls.register(new StreamHandler()); + resultListeners.register(new StreamHandler()); } return true; } - private boolean disableTarget(CompositeResultListener rls, - Class rlCls) { - ResultListener oldListener = rls.findListener(rlCls); + private boolean disableTarget(Class rlCls) { + ResultListener oldListener = resultListeners.findListener(rlCls); // no need for action if not activated if (oldListener == null) { return false; } - rls.unregister(oldListener); + resultListeners.unregister(oldListener); // do we need to cleanup something? if (oldListener instanceof DataWriter) { ((DataWriter) oldListener).close(); -- cgit v1.2.1