package org.gridkit.jvmtool.stacktrace; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import org.gridkit.jvmtool.codec.stacktrace.ThreadSnapshotExpander; import org.gridkit.jvmtool.event.Event; import org.gridkit.jvmtool.event.EventReader; import org.gridkit.jvmtool.event.UniversalEventWriter; public class ThreadEventCodec { public static UniversalEventWriter createEventWriter(OutputStream os) throws IOException { os.write(StackTraceCodec.MAGIC4); StackTraceEventWriterV4 writer = new StackTraceEventWriterV4(os); return writer; } public static EventReader<Event> createEventReader(InputStream is) throws IOException { byte[] magic = MagicReader.readMagic(is); return createEventReader(magic, is); } public static EventReader<Event> createEventReader(byte[] magic, InputStream is) throws IOException { if (Arrays.equals(magic, StackTraceCodec.MAGIC)) { StackTraceReader lreader = new StackTraceReaderV1(is); EventReader<Event> reader = new LegacyThreadEventReader(lreader); return reader; } if (Arrays.equals(magic, StackTraceCodec.MAGIC2)) { StackTraceReader lreader = new StackTraceReaderV2(is); EventReader<Event> reader = new LegacyThreadEventReader(lreader); return reader; } // MAGIC3 is not used else if (Arrays.equals(magic, StackTraceCodec.MAGIC4)) { EventReader<Event> reader = new StackTraceEventReaderV4(is).morph(new ThreadSnapshotExpander()); return reader; } else { throw new IOException("Unknown magic '" + new String(magic) + "'"); } } }