aQute.lib.io.LimitedDataInput Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of biz.aQute.bnd Show documentation
Show all versions of biz.aQute.bnd Show documentation
This command line utility is the Swiss army knife of OSGi. It provides you with a breadth of tools to understand and manage OSGi based systems. This project basically uses bndlib.
package aQute.lib.io;
import static java.util.Objects.requireNonNull;
import java.io.DataInput;
import java.io.EOFException;
import java.io.IOException;
import java.nio.ByteBuffer;
public class LimitedDataInput implements DataInput {
private final DataInput in;
private int remaining;
public static DataInput wrap(DataInput in, int size) {
requireNonNull(in);
if (size < 0) {
throw new IllegalArgumentException("size must be non-negative");
}
if (in instanceof ByteBufferDataInput bbin) {
ByteBuffer slice = bbin.slice(size);
return ByteBufferDataInput.wrap(slice);
}
return new LimitedDataInput(in, size);
}
private LimitedDataInput(DataInput in, int size) {
this.in = in;
this.remaining = size;
}
private void consume(int n) throws IOException {
if (n - remaining > 0) {
throw new EOFException("request to read more bytes than available");
}
remaining -= n;
}
@Override
public void readFully(byte[] b) throws IOException {
consume(b.length);
in.readFully(b);
}
@Override
public void readFully(byte[] b, int off, int len) throws IOException {
consume(len);
in.readFully(b, off, len);
}
private int ranged(int n) {
if (n <= 0) {
return 0;
}
return Math.min(n, remaining);
}
@Override
public int skipBytes(int n) throws IOException {
int limit = ranged(n);
int skipped = in.skipBytes(limit);
consume(skipped);
return skipped;
}
@Override
public boolean readBoolean() throws IOException {
consume(Byte.BYTES);
return in.readBoolean();
}
@Override
public byte readByte() throws IOException {
consume(Byte.BYTES);
return in.readByte();
}
@Override
public int readUnsignedByte() throws IOException {
consume(Byte.BYTES);
return in.readUnsignedByte();
}
@Override
public short readShort() throws IOException {
consume(Short.BYTES);
return in.readShort();
}
@Override
public int readUnsignedShort() throws IOException {
consume(Short.BYTES);
return in.readUnsignedShort();
}
@Override
public char readChar() throws IOException {
consume(Character.BYTES);
return in.readChar();
}
@Override
public int readInt() throws IOException {
consume(Integer.BYTES);
return in.readInt();
}
@Override
public long readLong() throws IOException {
consume(Long.BYTES);
return in.readLong();
}
@Override
public float readFloat() throws IOException {
consume(Float.BYTES);
return in.readFloat();
}
@Override
public double readDouble() throws IOException {
consume(Double.BYTES);
return in.readDouble();
}
@Override
@Deprecated
public String readLine() {
throw new UnsupportedOperationException();
}
@Override
public String readUTF() throws IOException {
return IO.readUTF(this);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getName());
sb.append("[remaining=");
sb.append(remaining);
sb.append("]");
return sb.toString();
}
}