diff options
author | Peter Wu <peter@lekensteyn.nl> | 2014-05-02 13:20:31 +0200 |
---|---|---|
committer | Peter Wu <peter@lekensteyn.nl> | 2014-05-02 13:20:31 +0200 |
commit | 150539368127e61af9d076bd30e3f49d13db4430 (patch) | |
tree | 16cfc93eec08e9a69d7e2cba3298bbf0a9755785 /src | |
parent | de41f025c1ddb3fd67eba2035bf763dae34fbc89 (diff) | |
download | TwitterDataAnalytics-150539368127e61af9d076bd30e3f49d13db4430.tar.gz |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/main/TweetShell.java | 63 |
1 files 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<ResultListener> targets = getPossibleTargets(rls); + ClassEnabledTracker<ResultListener> 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<ResultListener> getPossibleTargets(CompositeResultListener rls) { + private ClassEnabledTracker<ResultListener> getPossibleTargets() { Map<String, Class<? extends ResultListener>> targets = new TreeMap<>(); targets.put("file", DataWriter.class); targets.put("shell", StreamHandler.class); ClassEnabledTracker<ResultListener> 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<ResultListener> targets = getPossibleTargets(rls); + private void configureTargets(String[] params) { + ClassEnabledTracker<ResultListener> 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<? extends ResultListener> rlCls) { - ResultListener oldListener = rls.findListener(rlCls); + private boolean enableTarget(Class<? extends ResultListener> 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<? extends ResultListener> rlCls) { - ResultListener oldListener = rls.findListener(rlCls); + private boolean disableTarget(Class<? extends ResultListener> 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(); |