package jnpf.fileStorage.dms; import jnpf.exception.DataException; import java.io.ByteArrayOutputStream; import java.util.Arrays; import java.util.Objects; final class DmsBoundedByteArrayOutputStream extends ByteArrayOutputStream { private final long maximumBytes; private final String limitMessage; DmsBoundedByteArrayOutputStream(long maximumBytes, String limitMessage) { super(8192); if (maximumBytes < 0) { throw new IllegalArgumentException("maximumBytes must not be negative"); } this.maximumBytes = maximumBytes; this.limitMessage = limitMessage; } @Override public synchronized void write(int value) { ensureCapacityFor(1); super.write(value); } @Override public synchronized void write(byte[] data, int offset, int length) { Objects.checkFromIndexSize(offset, length, data.length); ensureCapacityFor(length); super.write(data, offset, length); } private void ensureCapacityFor(int additionalBytes) { if ((long) count + additionalBytes > maximumBytes) { throw new DataException(limitMessage); } } synchronized byte[] toByteArrayAndRelease() { byte[] result = count == buf.length ? buf : Arrays.copyOf(buf, count); buf = new byte[0]; count = 0; return result; } }