From d5ca4e34c1804c4c777d12dfcd719084b9bc7885 Mon Sep 17 00:00:00 2001 From: David Benson Date: Mon, 25 Mar 2019 08:41:09 -0700 Subject: [PATCH] Add tool to replay (uncompressed) journal files. --- ChangeLog | 3 + pom.xml | 6 +- .../java/org/lwes/emitter/ReplayJournal.java | 66 +++++++++++++++++++ 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/lwes/emitter/ReplayJournal.java diff --git a/ChangeLog b/ChangeLog index dbcb89a..54d5892 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +* Fri Mar 22 2019 Dave Benson 2.2.2 +- add ReplayJournal program mostly to use in testing emitters + * Fri Jan 11 2019 Dave Benson 2.2.1 - support for registration of new EmitterGroup to support plugins that render to alternate targets (which aren't necessarily diff --git a/pom.xml b/pom.xml index 133ffcc..75bf3d0 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.lwes lwes-java jar - 2.2.1 + 2.2.2 lwes-java Lightweight event system, java implementation http://lwes.org @@ -161,8 +161,8 @@ maven-compiler-plugin 2.3.2 - 1.5 - 1.5 + 1.6 + 1.6 diff --git a/src/main/java/org/lwes/emitter/ReplayJournal.java b/src/main/java/org/lwes/emitter/ReplayJournal.java new file mode 100644 index 0000000..9e79b76 --- /dev/null +++ b/src/main/java/org/lwes/emitter/ReplayJournal.java @@ -0,0 +1,66 @@ +package org.lwes.emitter; + +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import org.kohsuke.args4j.Option; +import org.lwes.Event; +import org.lwes.EventFactory; +import org.lwes.emitter.EmitterGroupBuilder; +import org.lwes.emitter.EmitterGroup; +import java.io.FileReader; +import java.io.FileInputStream; +import java.io.BufferedInputStream; +import java.util.Properties; + + +public class ReplayJournal { + + @Option(name = "-i", usage = "journal file", required = true, metaVar = "FILE") + String inputFilename; + + @Option(name = "-n", usage = "repeat count", metaVar = "COUNT") + int repeatCount = 1; + + @Option(name = "-sleep", usage = "milliseconds to sleep between events", metaVar = "MILLISECONDS") + int sleepMillis = 0; + + @Option(name = "-group", usage = "event emitter group name", required = true) + String groupName; + + @Option(name = "-properties", usage = "properties file", required = true) + String propertiesFilename; + + public static EventFactory factory = new EventFactory(); + + private void run() throws Exception { + Properties props = new Properties(); + props.load(new FileReader(propertiesFilename)); + EmitterGroup group = EmitterGroupBuilder.createGroup(props, groupName, factory); + byte[] header = new byte[22]; + for (int i = 0; repeatCount < 0 || i < repeatCount; i++) { + FileInputStream file = new FileInputStream(inputFilename); + BufferedInputStream input = new BufferedInputStream(file); + while (input.read(header) == 22) { + int size = (((int)header[0] << 8) & 0xff00) + | (((int)header[1] << 0) & 0x00ff); + byte[] eventData = new byte[size]; + if (input.read(eventData) != eventData.length) { + throw new RuntimeException("bad journal"); + } + Event event = factory.createEvent(eventData, false); + group.emitToGroup(event); + if (sleepMillis != 0) + Thread.sleep(sleepMillis); + } + } + System.err.println("no more data: returning"); + } + + public static void main(String[] args) throws Exception { + ReplayJournal replayer = new ReplayJournal(); + CmdLineParser parser = new CmdLineParser(replayer); + parser.parseArgument(args); + replayer.run(); + } +} +