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 m_tweetIdSet; /** * the buffer of profile ids that already exist. */ private final Set 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()); } }