package games.strategy.debug; import java.io.ByteArrayOutputStream; import java.io.PrintStream; /** * Allows data written to a byte output stream to be read * safely friom a seperate thread. * Only readFully() is currently threadSafe for reading. */ class SynchedByteArrayOutputStream extends ByteArrayOutputStream { private final Object lock = new Object(); private final PrintStream m_mirror; SynchedByteArrayOutputStream(final PrintStream mirror) { m_mirror = mirror; } public void write(final byte b) { synchronized (lock) { m_mirror.write(b); super.write(b); lock.notifyAll(); } } @Override public void write(final byte[] b, final int off, final int len) { synchronized (lock) { super.write(b, off, len); m_mirror.write(b, off, len); lock.notifyAll(); } } /** * Read all data written to the stream. * Blocks until data is available. * This is currently the only threadsafe method for reading. */ public String readFully() { synchronized (lock) { if (super.size() == 0) { try { lock.wait(); } catch (final InterruptedException ie) { Thread.currentThread().interrupt(); } } final String s = toString(); reset(); return s; } } }