annotate src/main/java/org/msgpack/type/ByteArrayRawValueImpl.java @ 0:cb825acd883a

first commit
author sugi
date Sat, 18 Oct 2014 15:06:15 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb825acd883a first commit
sugi
parents:
diff changeset
1 //
cb825acd883a first commit
sugi
parents:
diff changeset
2 // MessagePack for Java
cb825acd883a first commit
sugi
parents:
diff changeset
3 //
cb825acd883a first commit
sugi
parents:
diff changeset
4 // Copyright (C) 2009 - 2013 FURUHASHI Sadayuki
cb825acd883a first commit
sugi
parents:
diff changeset
5 //
cb825acd883a first commit
sugi
parents:
diff changeset
6 // Licensed under the Apache License, Version 2.0 (the "License");
cb825acd883a first commit
sugi
parents:
diff changeset
7 // you may not use this file except in compliance with the License.
cb825acd883a first commit
sugi
parents:
diff changeset
8 // You may obtain a copy of the License at
cb825acd883a first commit
sugi
parents:
diff changeset
9 //
cb825acd883a first commit
sugi
parents:
diff changeset
10 // http://www.apache.org/licenses/LICENSE-2.0
cb825acd883a first commit
sugi
parents:
diff changeset
11 //
cb825acd883a first commit
sugi
parents:
diff changeset
12 // Unless required by applicable law or agreed to in writing, software
cb825acd883a first commit
sugi
parents:
diff changeset
13 // distributed under the License is distributed on an "AS IS" BASIS,
cb825acd883a first commit
sugi
parents:
diff changeset
14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
cb825acd883a first commit
sugi
parents:
diff changeset
15 // See the License for the specific language governing permissions and
cb825acd883a first commit
sugi
parents:
diff changeset
16 // limitations under the License.
cb825acd883a first commit
sugi
parents:
diff changeset
17 //
cb825acd883a first commit
sugi
parents:
diff changeset
18 package org.msgpack.type;
cb825acd883a first commit
sugi
parents:
diff changeset
19
cb825acd883a first commit
sugi
parents:
diff changeset
20 import java.util.Arrays;
cb825acd883a first commit
sugi
parents:
diff changeset
21 import java.io.IOException;
cb825acd883a first commit
sugi
parents:
diff changeset
22 import java.nio.ByteBuffer;
cb825acd883a first commit
sugi
parents:
diff changeset
23 import java.nio.charset.Charset;
cb825acd883a first commit
sugi
parents:
diff changeset
24 import java.nio.charset.CharacterCodingException;
cb825acd883a first commit
sugi
parents:
diff changeset
25 import java.nio.charset.CharsetDecoder;
cb825acd883a first commit
sugi
parents:
diff changeset
26 import java.nio.charset.CodingErrorAction;
cb825acd883a first commit
sugi
parents:
diff changeset
27 import org.msgpack.packer.Packer;
cb825acd883a first commit
sugi
parents:
diff changeset
28 import org.msgpack.MessageTypeException;
cb825acd883a first commit
sugi
parents:
diff changeset
29
cb825acd883a first commit
sugi
parents:
diff changeset
30 class ByteArrayRawValueImpl extends AbstractRawValue {
cb825acd883a first commit
sugi
parents:
diff changeset
31 private static ByteArrayRawValueImpl emptyInstance = new ByteArrayRawValueImpl(new byte[0], true);
cb825acd883a first commit
sugi
parents:
diff changeset
32
cb825acd883a first commit
sugi
parents:
diff changeset
33 public static RawValue getEmptyInstance() {
cb825acd883a first commit
sugi
parents:
diff changeset
34 return emptyInstance;
cb825acd883a first commit
sugi
parents:
diff changeset
35 }
cb825acd883a first commit
sugi
parents:
diff changeset
36
cb825acd883a first commit
sugi
parents:
diff changeset
37 private static final ThreadLocal<CharsetDecoder> decoderStore = new ThreadLocal<CharsetDecoder>() {
cb825acd883a first commit
sugi
parents:
diff changeset
38 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
39 protected CharsetDecoder initialValue() {
cb825acd883a first commit
sugi
parents:
diff changeset
40 return Charset.forName("UTF-8").newDecoder()
cb825acd883a first commit
sugi
parents:
diff changeset
41 .onMalformedInput(CodingErrorAction.REPORT)
cb825acd883a first commit
sugi
parents:
diff changeset
42 .onUnmappableCharacter(CodingErrorAction.REPORT);
cb825acd883a first commit
sugi
parents:
diff changeset
43 }
cb825acd883a first commit
sugi
parents:
diff changeset
44 };
cb825acd883a first commit
sugi
parents:
diff changeset
45
cb825acd883a first commit
sugi
parents:
diff changeset
46 private byte[] bytes;
cb825acd883a first commit
sugi
parents:
diff changeset
47
cb825acd883a first commit
sugi
parents:
diff changeset
48 ByteArrayRawValueImpl(byte[] bytes, boolean gift) {
cb825acd883a first commit
sugi
parents:
diff changeset
49 if (gift) {
cb825acd883a first commit
sugi
parents:
diff changeset
50 this.bytes = bytes;
cb825acd883a first commit
sugi
parents:
diff changeset
51 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
52 this.bytes = new byte[bytes.length];
cb825acd883a first commit
sugi
parents:
diff changeset
53 System.arraycopy(bytes, 0, this.bytes, 0, bytes.length);
cb825acd883a first commit
sugi
parents:
diff changeset
54 }
cb825acd883a first commit
sugi
parents:
diff changeset
55 }
cb825acd883a first commit
sugi
parents:
diff changeset
56
cb825acd883a first commit
sugi
parents:
diff changeset
57 ByteArrayRawValueImpl(byte[] b, int off, int len) {
cb825acd883a first commit
sugi
parents:
diff changeset
58 // TODO reference
cb825acd883a first commit
sugi
parents:
diff changeset
59 this.bytes = new byte[len];
cb825acd883a first commit
sugi
parents:
diff changeset
60 System.arraycopy(b, off, this.bytes, 0, len);
cb825acd883a first commit
sugi
parents:
diff changeset
61 }
cb825acd883a first commit
sugi
parents:
diff changeset
62
cb825acd883a first commit
sugi
parents:
diff changeset
63 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
64 public byte[] getByteArray() {
cb825acd883a first commit
sugi
parents:
diff changeset
65 return bytes;
cb825acd883a first commit
sugi
parents:
diff changeset
66 }
cb825acd883a first commit
sugi
parents:
diff changeset
67
cb825acd883a first commit
sugi
parents:
diff changeset
68 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
69 public String getString() {
cb825acd883a first commit
sugi
parents:
diff changeset
70 CharsetDecoder decoder = decoderStore.get();
cb825acd883a first commit
sugi
parents:
diff changeset
71 try {
cb825acd883a first commit
sugi
parents:
diff changeset
72 return decoder.decode(ByteBuffer.wrap(bytes)).toString();
cb825acd883a first commit
sugi
parents:
diff changeset
73 } catch (CharacterCodingException ex) {
cb825acd883a first commit
sugi
parents:
diff changeset
74 throw new MessageTypeException(ex);
cb825acd883a first commit
sugi
parents:
diff changeset
75 }
cb825acd883a first commit
sugi
parents:
diff changeset
76 }
cb825acd883a first commit
sugi
parents:
diff changeset
77
cb825acd883a first commit
sugi
parents:
diff changeset
78 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
79 public void writeTo(Packer pk) throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
80 pk.write(bytes);
cb825acd883a first commit
sugi
parents:
diff changeset
81 }
cb825acd883a first commit
sugi
parents:
diff changeset
82
cb825acd883a first commit
sugi
parents:
diff changeset
83 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
84 public boolean equals(Object o) {
cb825acd883a first commit
sugi
parents:
diff changeset
85 if (this == o) {
cb825acd883a first commit
sugi
parents:
diff changeset
86 return true;
cb825acd883a first commit
sugi
parents:
diff changeset
87 }
cb825acd883a first commit
sugi
parents:
diff changeset
88 if (!(o instanceof Value)) {
cb825acd883a first commit
sugi
parents:
diff changeset
89 return false;
cb825acd883a first commit
sugi
parents:
diff changeset
90 }
cb825acd883a first commit
sugi
parents:
diff changeset
91 Value v = (Value) o;
cb825acd883a first commit
sugi
parents:
diff changeset
92 if (!v.isRawValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
93 return false;
cb825acd883a first commit
sugi
parents:
diff changeset
94 }
cb825acd883a first commit
sugi
parents:
diff changeset
95
cb825acd883a first commit
sugi
parents:
diff changeset
96 return Arrays.equals(bytes, v.asRawValue().getByteArray());
cb825acd883a first commit
sugi
parents:
diff changeset
97 }
cb825acd883a first commit
sugi
parents:
diff changeset
98
cb825acd883a first commit
sugi
parents:
diff changeset
99 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
100 public int hashCode() {
cb825acd883a first commit
sugi
parents:
diff changeset
101 return Arrays.hashCode(bytes);
cb825acd883a first commit
sugi
parents:
diff changeset
102 }
cb825acd883a first commit
sugi
parents:
diff changeset
103 }