package tests.support; import java.io.IOException; import java.io.OutputStream; /** * An implementation of {@code OutputStream} that stores the written data in a * byte array of fixed size. As a special feature, instances of this class can * be instructed to throw an {@code IOException} whenever a method is called. * This is used to test the {@code IOException} handling of classes that write * to an {@code OutputStream}. */ public class Support_OutputStream extends OutputStream { private static final int DEFAULT_BUFFER_SIZE = 32; private byte[] buffer; private int position; private int size; private boolean throwsException; public Support_OutputStream() { this(DEFAULT_BUFFER_SIZE); } public Support_OutputStream(boolean throwException) { this(DEFAULT_BUFFER_SIZE); throwsException = throwException; } public Support_OutputStream(int bufferSize) { buffer = new byte[bufferSize]; position = 0; size = bufferSize; throwsException = false; } @Override public void close() throws IOException { if (throwsException) { throw new IOException("Exception thrown for testing purposes."); } super.close(); } @Override public void flush() throws IOException { if (throwsException) { throw new IOException("Exception thrown for testing purposes."); } super.flush(); } @Override public void write(byte buffer[]) throws IOException { if (throwsException) { throw new IOException("Exception thrown for testing purposes."); } for (int i = 0; i < buffer.length; i++) { write(buffer[i]); } } @Override public void write(byte buffer[], int offset, int count) throws IOException { if (throwsException) { throw new IOException("Exception thrown for testing purposes."); } if (offset < 0 || count < 0 || (offset + count) > buffer.length) { throw new IndexOutOfBoundsException(); } for (int i = offset; i < offset + count; i++) { write(buffer[i]); } } @Override public void write(int oneByte) throws IOException { if (throwsException) { throw new IOException("Exception thrown for testing purposes."); } if (position < size) { buffer[position] = (byte)(oneByte & 255); position++; } else { throw new IOException("Internal buffer overflow."); } } public byte[] toByteArray() { byte[] toReturn = new byte[position]; System.arraycopy(buffer, 0, toReturn, 0, position); return toReturn; } public String toString() { return new String(buffer, 0, position); } public int size() { return position; } public void setThrowsException(boolean newValue) { throwsException = newValue; } }