summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaurice Laveaux <m.laveaux@student.tue.nl>2014-04-30 12:20:15 +0200
committerMaurice Laveaux <m.laveaux@student.tue.nl>2014-04-30 12:20:15 +0200
commit1527c87edbc8f5824f460c3b2c452db50f7e0640 (patch)
tree6a2b7589dce291beda42e59f8dc3f5b6d9f3e501
parent375458f918bd53ae08b1dd0234ec09f85e056930 (diff)
downloadTwitterDataAnalytics-1527c87edbc8f5824f460c3b2c452db50f7e0640.tar.gz
Create a class that implements ProfileListener and TweetListener.
* Creates tweets.txt and profiles.txt when they don't exist. * Read these files to store a set of ids. * Consumes new tweets and profiles and writes if the ids are not found.
-rw-r--r--src/io/OutputStream.java130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/io/OutputStream.java b/src/io/OutputStream.java
new file mode 100644
index 0000000..5a92c59
--- /dev/null
+++ b/src/io/OutputStream.java
@@ -0,0 +1,130 @@
+package io;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Scanner;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.json.JSONException;
+import org.json.JSONObject;
+import provider.ProfileListener;
+import provider.TweetListener;
+
+/**
+ * This class writes the output data into seperate files.
+ *
+ * @author Maurice Laveaux
+ */
+public class OutputStream implements ProfileListener, TweetListener {
+
+ /**
+ * The writer for the tweet stream.
+ */
+ private final FileWriter m_tweetWriter;
+
+ /**
+ * the writer for the profile stream.
+ */
+ private final FileWriter m_profileWriter;
+
+ /**
+ * the buffer of tweet ids that already exist.
+ */
+ private final Set<Long> m_tweetIdSet;
+
+ /**
+ * the buffer of profile ids that already exist.
+ */
+ private final Set<Long> m_profileIdSet;
+
+ private static final String profilesName = "profiles.txt";
+ private static final String tweetsName = "tweets.txt";
+
+ /**
+ * Opens a stream to every single file that data will be streamed to.
+ */
+ public OutputStream() {
+ try {
+ m_profileIdSet = readIds(profilesName);
+ m_profileWriter = new FileWriter(profilesName, true);
+
+ m_tweetIdSet = readIds(tweetsName);
+ m_tweetWriter = new FileWriter(tweetsName, true);
+ } catch (IOException ex) {
+ // This should not happen.
+ throw new RuntimeException(ex.getMessage());
+ }
+ }
+
+ @Override
+ public void profileGenerated(JSONObject obj) {
+ writeObject(obj, m_profileWriter, m_profileIdSet);
+ }
+
+ @Override
+ public void tweetGenerated(JSONObject obj) {
+ writeObject(obj, m_tweetWriter, m_tweetIdSet);
+ }
+
+ /**
+ * Read the current existing tweetName and profileName filenames and fill
+ * the existing id set.
+ *
+ * @param filename The file to parse
+ * @return The set of ids
+ */
+ private Set readIds(String filename) throws IOException {
+ try {
+ Scanner reader = new Scanner(new File(filename));
+
+ // TODO: Read the file JSON objects and parse the ids.
+ Set idSet = new HashSet();
+
+ // parse each line into a JSONObject, read the id and add it to
+ // the set of ids.
+ while(reader.hasNext()) {
+ JSONObject obj = new JSONObject(reader.nextLine());
+ long id = obj.getLong("id");
+ idSet.add(id);
+ }
+
+ return idSet;
+ } catch (FileNotFoundException ex) {
+ // File does not exist, so create one.
+ File file = new File(filename);
+ // Return value should always be true.
+ file.createNewFile();
+ } catch (JSONException ex) {
+ getLogger().log(Level.SEVERE, null, ex);
+ }
+
+ // return the empty set.
+ return new HashSet();
+ }
+
+ private void writeObject(JSONObject obj, FileWriter writer, Set idSet) {
+ try {
+ long id = obj.getLong("id");
+
+ if (!idSet.contains(id)) {
+ // Write a single profile into the profile file.
+ try {
+ writer.write(obj.toString() + "\n");
+ idSet.add(id);
+ } catch (IOException ex) {
+ getLogger().log(Level.SEVERE, null, ex);
+ }
+ }
+ } catch (JSONException ex) {
+ getLogger().log(Level.SEVERE, null, ex);
+ }
+ }
+
+ private Logger getLogger() {
+ return Logger.getLogger(OutputStream.class.getName());
+ }
+}