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;
|
}
|
}
|