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}