package de.ugoe.cs.eventbench; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Collection; import java.util.List; import de.ugoe.cs.eventbench.data.IReplayable; import de.ugoe.cs.eventbench.data.ReplayableEvent; import de.ugoe.cs.util.StringTools; import de.ugoe.cs.util.console.Console; /** *

* This class provides the functionality to generate replay files from sequences * if {@link ReplayableEvent}s. *

* * @author Steffen Herbold * @version 1.0 */ public class ReplayGenerator { /** *

* {@link IReplayDecorator} to be used. If this field is {@code null}, no * decorator is used. Default: {@code null} *

*/ private IReplayDecorator decorator = null; /** *

* Id of the current session. The starting id is 1. *

*/ int sessionId = 1; /** *

* Creates a replay file that contains multiple event sequences. *

* * @param sequences * collection of event sequences from which the sessions are * generated * @param filename * name and path of the replay file */ public void createLogfileMultipleSessions( Collection>> sequences, String filename) { OutputStreamWriter writer = openReplayFile(filename); if (writer != null) { try { decorator = sequences.iterator().next().get(0).getReplayDecorator(); if (decorator != null) { writer.write(decorator.getHeader()); } for (List> actions : sequences) { writeSession(actions, writer); } if (decorator != null) { writer.write(decorator.getFooter()); } decorator = null; writer.close(); } catch (IOException e) { Console.printerrln("Unable to write replay file " + filename); } } } /** *

* Creates a replay file that from a single event sequence. *

* * @param actions * event sequence from which the sessions are generated * @param filename * name and path of the replay file */ public void createLogfileSingleSession(List> actions, String filename) { OutputStreamWriter writer = openReplayFile(filename); if (writer != null) { try { actions.get(0).getReplayDecorator(); if (decorator != null) { writer.write(decorator.getHeader()); } writeSession(actions, writer); if (decorator != null) { writer.write(decorator.getFooter()); } decorator = null; writer.close(); } catch (IOException e) { Console.printerrln("Unable to write replay file " + filename); } } } /** *

* Helper function that opens the replay file for writing. *

* * @param filename * name and path of the replay file * @return {@link OutputStreamWriter} that writes to the replay file */ private OutputStreamWriter openReplayFile(String filename) { File file = new File(filename); boolean fileCreated; try { fileCreated = file.createNewFile(); if (!fileCreated) { Console.traceln("Created logfile " + filename); } else { Console.traceln("Overwrote existing logfile " + filename); } } catch (IOException e) { Console.printerrln("Unable to create file " + filename); Console.printStacktrace(e); } OutputStreamWriter writer = null; try { writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-16"); } catch (IOException e) { Console.printerrln("Unable to open file for writing (read-only file):" + filename); Console.printStacktrace(e); } return writer; } /** *

* Helper function that adds an event sequence to the replay. *

* * @param actions * event sequences to be added * @param writer * {@link OutputStreamWriter} to which the replay is added * @throws IOException * thrown if there is a problem writing to writer */ private void writeSession(List> actions, OutputStreamWriter writer) throws IOException { if (decorator != null) { writer.write(decorator.getSessionHeader(sessionId)); } for (ReplayableEvent currentAction : actions) { List replayables = currentAction .getReplayMessages(); for (IReplayable replayble : replayables) { writer.write(replayble.getReplay() + StringTools.ENDLINE); writer.flush(); } } if (decorator != null) { writer.write(decorator.getSessionFooter(sessionId)); } sessionId++; } }