package com.github.obourgain.elasticsearch.http.buffer;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.channels.GatheringByteChannel;
import java.util.Arrays;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.io.stream.BytesStreamInput;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.netty.buffer.ByteBufferBackedChannelBuffer;
import org.elasticsearch.common.netty.buffer.ChannelBuffer;
import com.google.common.base.Charsets;
import io.netty.buffer.ByteBuf;
public class ByteBufBytesReference implements BytesReference {
private final ByteBuf buf;
public ByteBufBytesReference(ByteBuf buf) {
this.buf = buf;
}
@Override
public byte get(int index) {
return buf.getByte(index);
}
@Override
public int length() {
return buf.capacity();
}
@Override
public BytesReference slice(int from, int length) {
return new ByteBufBytesReference(buf.slice(from, length));
}
@Override
public StreamInput streamInput() {
return new BytesStreamInput(this);
}
@Override
public void writeTo(OutputStream os) throws IOException {
if (buf.hasArray()) {
os.write(buf.array());
} else {
byte[] bytes = new byte[buf.capacity()];
buf.duplicate().getBytes(0, bytes);
os.write(bytes);
}
}
@Override
public void writeTo(GatheringByteChannel channel) throws IOException {
throw new IllegalStateException("not implemented");
}
@Override
public byte[] toBytes() {
return Arrays.copyOf(buf.array(), buf.capacity());
}
@Override
public BytesArray toBytesArray() {
return new BytesArray(this.toBytesRef());
}
@Override
public BytesArray copyBytesArray() {
return new BytesArray(this.copyBytesRef());
}
@Override
public ChannelBuffer toChannelBuffer() {
return new ByteBufferBackedChannelBuffer(buf.nioBuffer());
}
@Override
public boolean hasArray() {
return buf.hasArray();
}
@Override
public byte[] array() {
if (buf.hasArray()) {
return buf.array();
} else {
byte[] bytes = new byte[buf.capacity()];
buf.duplicate().getBytes(0, bytes);
return bytes;
}
}
@Override
public int arrayOffset() {
return buf.readerIndex();
}
@Override
public String toUtf8() {
if (buf.capacity() == 0) {
return "";
}
return buf.toString(Charsets.UTF_8);
}
@Override
public BytesRef toBytesRef() {
return new BytesRef(array(), 0, buf.capacity());
}
@Override
public BytesRef copyBytesRef() {
return new BytesRef(toBytes(), 0, buf.capacity());
}
}