summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-05-02 13:20:31 +0200
committerPeter Wu <peter@lekensteyn.nl>2014-05-02 13:20:31 +0200
commit150539368127e61af9d076bd30e3f49d13db4430 (patch)
tree16cfc93eec08e9a69d7e2cba3298bbf0a9755785
parentde41f025c1ddb3fd67eba2035bf763dae34fbc89 (diff)
downloadTwitterDataAnalytics-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.
-rw-r--r--src/main/TweetShell.java63
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();