001package org.xbib.elasticsearch.common.bytes; 002 003import org.apache.lucene.util.BytesRef; 004import org.apache.lucene.util.UnicodeUtil; 005import org.elasticsearch.ElasticsearchIllegalArgumentException; 006import org.elasticsearch.common.base.Charsets; 007import org.elasticsearch.common.io.stream.BytesStreamInput; 008import org.elasticsearch.common.io.stream.StreamInput; 009import org.jboss.netty.buffer.ChannelBuffer; 010import org.jboss.netty.buffer.ChannelBuffers; 011 012import java.io.IOException; 013import java.io.OutputStream; 014import java.nio.ByteBuffer; 015import java.nio.channels.GatheringByteChannel; 016import java.util.Arrays; 017 018/** 019 * BytesArray for un-relocated netty. 020 */ 021public class BytesArray implements BytesReference { 022 023 private byte[] bytes; 024 private int offset; 025 private int length; 026 027 public BytesArray(String bytes) { 028 BytesRef bytesRef = new BytesRef(); 029 UnicodeUtil.UTF16toUTF8(bytes, 0, bytes.length(), bytesRef); 030 this.bytes = bytesRef.bytes; 031 this.offset = bytesRef.offset; 032 this.length = bytesRef.length; 033 } 034 035 public BytesArray(BytesRef bytesRef) { 036 this(bytesRef, false); 037 } 038 039 public BytesArray(BytesRef bytesRef, boolean deepCopy) { 040 if (deepCopy) { 041 BytesRef copy = BytesRef.deepCopyOf(bytesRef); 042 bytes = copy.bytes; 043 offset = copy.offset; 044 length = copy.length; 045 } else { 046 bytes = bytesRef.bytes; 047 offset = bytesRef.offset; 048 length = bytesRef.length; 049 } 050 } 051 052 public BytesArray(byte[] bytes) { 053 this.bytes = bytes; 054 this.offset = 0; 055 this.length = bytes.length; 056 } 057 058 public BytesArray(byte[] bytes, int offset, int length) { 059 this.bytes = bytes; 060 this.offset = offset; 061 this.length = length; 062 } 063 064 @Override 065 public byte get(int index) { 066 return bytes[offset + index]; 067 } 068 069 @Override 070 public int length() { 071 return length; 072 } 073 074 @Override 075 public BytesReference slice(int from, int length) { 076 if (from < 0 || (from + length) > this.length) { 077 throw new ElasticsearchIllegalArgumentException("can't slice a buffer with length [" + this.length + "], with slice parameters from [" + from + "], length [" + length + "]"); 078 } 079 return new BytesArray(bytes, offset + from, length); 080 } 081 082 @Override 083 public StreamInput streamInput() { 084 return new BytesStreamInput(bytes, offset, length, false); 085 } 086 087 @Override 088 public void writeTo(OutputStream os) throws IOException { 089 os.write(bytes, offset, length); 090 } 091 092 @Override 093 public void writeTo(GatheringByteChannel channel) throws IOException { 094 channel.write(ByteBuffer.wrap(bytes, offset, length())); 095 } 096 097 @Override 098 public byte[] toBytes() { 099 if (offset == 0 && bytes.length == length) { 100 return bytes; 101 } 102 return Arrays.copyOfRange(bytes, offset, offset + length); 103 } 104 105 @Override 106 public BytesArray toBytesArray() { 107 return this; 108 } 109 110 @Override 111 public BytesArray copyBytesArray() { 112 return new BytesArray(Arrays.copyOfRange(bytes, offset, offset + length)); 113 } 114 115 @Override 116 public ChannelBuffer toChannelBuffer() { 117 return ChannelBuffers.wrappedBuffer(bytes, offset, length); 118 } 119 120 @Override 121 public boolean hasArray() { 122 return true; 123 } 124 125 @Override 126 public byte[] array() { 127 return bytes; 128 } 129 130 @Override 131 public int arrayOffset() { 132 return offset; 133 } 134 135 @Override 136 public String toUtf8() { 137 if (length == 0) { 138 return ""; 139 } 140 return new String(bytes, offset, length, Charsets.UTF_8); 141 } 142 143 @Override 144 public BytesRef toBytesRef() { 145 return new BytesRef(bytes, offset, length); 146 } 147 148 @Override 149 public BytesRef copyBytesRef() { 150 return new BytesRef(Arrays.copyOfRange(bytes, offset, offset + length)); 151 } 152 153 @Override 154 public int hashCode() { 155 return Helper.bytesHashCode(this); 156 } 157 158 @Override 159 public boolean equals(Object obj) { 160 return Helper.bytesEqual(this, (BytesReference) obj); 161 } 162}