package org.webpieces.data.impl; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.List; import org.webpieces.data.api.BufferPool; public class ByteBufferDataWrapper extends SliceableDataWrapper { private ByteBuffer buffer; public ByteBufferDataWrapper(ByteBuffer buffer) { this.buffer = buffer; } @Override public int getReadableSize() { return buffer.remaining(); } @Override public byte readByteAt(int i) { return buffer.get(i); } @Override public String createStringFrom(int offset, int length, Charset charSet) { //wanted to go from piece of ByteBuffer to String directly but can't find a good way... byte[] data = new byte[length]; buffer.mark(); buffer.position(offset); //for HeapByteBuffer, this is an array copy and for Mapped, it loops through reading each byte(hopefully from memory). buffer.get(data); buffer.reset(); return new String(data, charSet); } @Override public byte[] createByteArray() { byte[] data = new byte[buffer.remaining()]; buffer.mark(); buffer.get(data); buffer.reset(); return data; } @Override public void addUnderlyingBuffersToList(List<ByteBuffer> buffers) { buffers.add(buffer); } @Override public ByteBuffer getSlicedBuffer(int offset, int length) { int position = buffer.position(); int limit = buffer.limit(); buffer.position(offset); buffer.limit(offset+length); ByteBuffer theView = buffer.slice(); buffer.position(position); buffer.limit(limit); return theView; } @Override protected void releaseImpl(BufferPool pool) { buffer.position(buffer.limit()); pool.releaseBuffer(buffer); } @Override public String toString() { return "ByteBufferDataWrapper [remaining=" + buffer.remaining() + ", buf="+buffer+"]"; } @Override public String createStringFromUtf8(int offset, int length) { return createStringFrom(offset, length, StandardCharsets.UTF_8); } }