001package org.xbib.elasticsearch.common.bytes;
002
003import org.apache.lucene.util.BytesRef;
004import org.elasticsearch.common.base.Charsets;
005import org.elasticsearch.common.bytes.BytesArray;
006import org.elasticsearch.common.bytes.BytesReference;
007import org.elasticsearch.common.io.stream.StreamInput;
008import org.jboss.netty.buffer.ChannelBuffer;
009import org.xbib.elasticsearch.transport.netty.ChannelBufferStreamInputFactory;
010
011import java.io.IOException;
012import java.io.OutputStream;
013import java.nio.channels.GatheringByteChannel;
014
015/**
016 * ChannelBufferBytesReference for un-relocated netty
017 */
018public class ChannelBufferBytesReference implements BytesReference {
019
020    private final ChannelBuffer buffer;
021
022    public ChannelBufferBytesReference(ChannelBuffer buffer) {
023        this.buffer = buffer;
024    }
025
026    @Override
027    public byte get(int index) {
028        return buffer.getByte(buffer.readerIndex() + index);
029    }
030
031    @Override
032    public int length() {
033        return buffer.readableBytes();
034    }
035
036    @Override
037    public BytesReference slice(int from, int length) {
038        return new ChannelBufferBytesReference(buffer.slice(from, length));
039    }
040
041    @Override
042    public StreamInput streamInput() {
043        return ChannelBufferStreamInputFactory.create(buffer.duplicate());
044    }
045
046    @Override
047    public void writeTo(OutputStream os) throws IOException {
048        buffer.getBytes(buffer.readerIndex(), os, length());
049    }
050
051    @Override
052    public void writeTo(GatheringByteChannel channel) throws IOException {
053        buffer.getBytes(buffer.readerIndex(), channel, length());
054    }
055
056    @Override
057    public byte[] toBytes() {
058        return copyBytesArray().toBytes();
059    }
060
061    @Override
062    public BytesArray toBytesArray() {
063        if (buffer.hasArray()) {
064            return new BytesArray(buffer.array(), buffer.arrayOffset() + buffer.readerIndex(), buffer.readableBytes());
065        }
066        return copyBytesArray();
067    }
068
069    @Override
070    public BytesArray copyBytesArray() {
071        byte[] copy = new byte[buffer.readableBytes()];
072        buffer.getBytes(buffer.readerIndex(), copy);
073        return new BytesArray(copy);
074    }
075
076
077    @Override
078    public boolean hasArray() {
079        return buffer.hasArray();
080    }
081
082    @Override
083    public byte[] array() {
084        return buffer.array();
085    }
086
087    @Override
088    public int arrayOffset() {
089        return buffer.arrayOffset() + buffer.readerIndex();
090    }
091
092    @Override
093    public String toUtf8() {
094        return buffer.toString(Charsets.UTF_8);
095    }
096
097    @Override
098    public BytesRef toBytesRef() {
099        throw new UnsupportedOperationException("Not supported");
100    }
101
102    @Override
103    public BytesRef copyBytesRef() {
104        throw new UnsupportedOperationException("Not supported");
105    }
106
107    @Override
108    public org.elasticsearch.common.netty.buffer.ChannelBuffer toChannelBuffer() {
109        //  return buffer.duplicate();
110        throw new UnsupportedOperationException("Not supported");
111    }
112
113    @Override
114    public int hashCode() {
115        return Helper.bytesHashCode(this);
116    }
117
118    @Override
119    public boolean equals(Object obj) {
120        return Helper.bytesEqual(this, (BytesReference) obj);
121    }
122}