annotate src/main/java/org/msgpack/unpacker/Converter.java @ 7:e7e55c455e39 default tip

refactor
author sugi
date Fri, 09 Jan 2015 16:02:44 +0900
parents cb825acd883a
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.unpacker;
cb825acd883a first commit
sugi
parents:
diff changeset
19
cb825acd883a first commit
sugi
parents:
diff changeset
20 import java.io.IOException;
cb825acd883a first commit
sugi
parents:
diff changeset
21 import java.io.EOFException;
cb825acd883a first commit
sugi
parents:
diff changeset
22 import java.math.BigInteger;
cb825acd883a first commit
sugi
parents:
diff changeset
23
cb825acd883a first commit
sugi
parents:
diff changeset
24 import org.msgpack.MessagePack;
cb825acd883a first commit
sugi
parents:
diff changeset
25 import org.msgpack.MessageTypeException;
cb825acd883a first commit
sugi
parents:
diff changeset
26 import org.msgpack.packer.Unconverter;
cb825acd883a first commit
sugi
parents:
diff changeset
27 import org.msgpack.type.Value;
cb825acd883a first commit
sugi
parents:
diff changeset
28 import org.msgpack.type.ValueType;
cb825acd883a first commit
sugi
parents:
diff changeset
29 import org.msgpack.type.ArrayValue;
cb825acd883a first commit
sugi
parents:
diff changeset
30 import org.msgpack.type.MapValue;
cb825acd883a first commit
sugi
parents:
diff changeset
31
cb825acd883a first commit
sugi
parents:
diff changeset
32 public class Converter extends AbstractUnpacker {
cb825acd883a first commit
sugi
parents:
diff changeset
33 private final UnpackerStack stack;
cb825acd883a first commit
sugi
parents:
diff changeset
34 private Object[] values;
cb825acd883a first commit
sugi
parents:
diff changeset
35 protected Value value;
cb825acd883a first commit
sugi
parents:
diff changeset
36
cb825acd883a first commit
sugi
parents:
diff changeset
37 public Converter(Value value) {
cb825acd883a first commit
sugi
parents:
diff changeset
38 this(new MessagePack(), value);
cb825acd883a first commit
sugi
parents:
diff changeset
39 }
cb825acd883a first commit
sugi
parents:
diff changeset
40
cb825acd883a first commit
sugi
parents:
diff changeset
41 public Converter(MessagePack msgpack, Value value) {
cb825acd883a first commit
sugi
parents:
diff changeset
42 super(msgpack);
cb825acd883a first commit
sugi
parents:
diff changeset
43 this.stack = new UnpackerStack();
cb825acd883a first commit
sugi
parents:
diff changeset
44 this.values = new Object[UnpackerStack.MAX_STACK_SIZE];
cb825acd883a first commit
sugi
parents:
diff changeset
45 this.value = value;
cb825acd883a first commit
sugi
parents:
diff changeset
46 }
cb825acd883a first commit
sugi
parents:
diff changeset
47
cb825acd883a first commit
sugi
parents:
diff changeset
48 protected Value nextValue() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
49 throw new EOFException();
cb825acd883a first commit
sugi
parents:
diff changeset
50 }
cb825acd883a first commit
sugi
parents:
diff changeset
51
cb825acd883a first commit
sugi
parents:
diff changeset
52 private void ensureValue() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
53 if (value == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
54 value = nextValue();
cb825acd883a first commit
sugi
parents:
diff changeset
55 }
cb825acd883a first commit
sugi
parents:
diff changeset
56 }
cb825acd883a first commit
sugi
parents:
diff changeset
57
cb825acd883a first commit
sugi
parents:
diff changeset
58 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
59 public boolean tryReadNil() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
60 stack.checkCount();
cb825acd883a first commit
sugi
parents:
diff changeset
61 if (getTop().isNilValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
62 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
63 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
64 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
65 }
cb825acd883a first commit
sugi
parents:
diff changeset
66 return true;
cb825acd883a first commit
sugi
parents:
diff changeset
67 }
cb825acd883a first commit
sugi
parents:
diff changeset
68 return false;
cb825acd883a first commit
sugi
parents:
diff changeset
69 }
cb825acd883a first commit
sugi
parents:
diff changeset
70
cb825acd883a first commit
sugi
parents:
diff changeset
71 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
72 public boolean trySkipNil() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
73 ensureValue();
cb825acd883a first commit
sugi
parents:
diff changeset
74
cb825acd883a first commit
sugi
parents:
diff changeset
75 if (stack.getDepth() > 0 && stack.getTopCount() <= 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
76 // end of array or map
cb825acd883a first commit
sugi
parents:
diff changeset
77 return true;
cb825acd883a first commit
sugi
parents:
diff changeset
78 }
cb825acd883a first commit
sugi
parents:
diff changeset
79
cb825acd883a first commit
sugi
parents:
diff changeset
80 if (getTop().isNilValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
81 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
82 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
83 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
84 }
cb825acd883a first commit
sugi
parents:
diff changeset
85 return true;
cb825acd883a first commit
sugi
parents:
diff changeset
86 }
cb825acd883a first commit
sugi
parents:
diff changeset
87 return false;
cb825acd883a first commit
sugi
parents:
diff changeset
88 }
cb825acd883a first commit
sugi
parents:
diff changeset
89
cb825acd883a first commit
sugi
parents:
diff changeset
90 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
91 public void readNil() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
92 if (!getTop().isNilValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
93 throw new MessageTypeException("Expected nil but got not nil value");
cb825acd883a first commit
sugi
parents:
diff changeset
94 }
cb825acd883a first commit
sugi
parents:
diff changeset
95 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
96 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
97 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
98 }
cb825acd883a first commit
sugi
parents:
diff changeset
99 }
cb825acd883a first commit
sugi
parents:
diff changeset
100
cb825acd883a first commit
sugi
parents:
diff changeset
101 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
102 public boolean readBoolean() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
103 boolean v = getTop().asBooleanValue().getBoolean();
cb825acd883a first commit
sugi
parents:
diff changeset
104 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
105 return v;
cb825acd883a first commit
sugi
parents:
diff changeset
106 }
cb825acd883a first commit
sugi
parents:
diff changeset
107
cb825acd883a first commit
sugi
parents:
diff changeset
108 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
109 public byte readByte() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
110 byte v = getTop().asIntegerValue().getByte();
cb825acd883a first commit
sugi
parents:
diff changeset
111 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
112 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
113 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
114 }
cb825acd883a first commit
sugi
parents:
diff changeset
115 return v;
cb825acd883a first commit
sugi
parents:
diff changeset
116 }
cb825acd883a first commit
sugi
parents:
diff changeset
117
cb825acd883a first commit
sugi
parents:
diff changeset
118 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
119 public short readShort() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
120 short v = getTop().asIntegerValue().getShort();
cb825acd883a first commit
sugi
parents:
diff changeset
121 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
122 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
123 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
124 }
cb825acd883a first commit
sugi
parents:
diff changeset
125 return v;
cb825acd883a first commit
sugi
parents:
diff changeset
126 }
cb825acd883a first commit
sugi
parents:
diff changeset
127
cb825acd883a first commit
sugi
parents:
diff changeset
128 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
129 public int readInt() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
130 int v = getTop().asIntegerValue().getInt();
cb825acd883a first commit
sugi
parents:
diff changeset
131 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
132 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
133 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
134 }
cb825acd883a first commit
sugi
parents:
diff changeset
135 return v;
cb825acd883a first commit
sugi
parents:
diff changeset
136 }
cb825acd883a first commit
sugi
parents:
diff changeset
137
cb825acd883a first commit
sugi
parents:
diff changeset
138 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
139 public long readLong() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
140 long v = getTop().asIntegerValue().getLong();
cb825acd883a first commit
sugi
parents:
diff changeset
141 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
142 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
143 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
144 }
cb825acd883a first commit
sugi
parents:
diff changeset
145 return v;
cb825acd883a first commit
sugi
parents:
diff changeset
146 }
cb825acd883a first commit
sugi
parents:
diff changeset
147
cb825acd883a first commit
sugi
parents:
diff changeset
148 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
149 public BigInteger readBigInteger() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
150 BigInteger v = getTop().asIntegerValue().getBigInteger();
cb825acd883a first commit
sugi
parents:
diff changeset
151 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
152 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
153 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
154 }
cb825acd883a first commit
sugi
parents:
diff changeset
155 return v;
cb825acd883a first commit
sugi
parents:
diff changeset
156 }
cb825acd883a first commit
sugi
parents:
diff changeset
157
cb825acd883a first commit
sugi
parents:
diff changeset
158 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
159 public float readFloat() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
160 float v = getTop().asFloatValue().getFloat();
cb825acd883a first commit
sugi
parents:
diff changeset
161 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
162 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
163 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
164 }
cb825acd883a first commit
sugi
parents:
diff changeset
165 return v;
cb825acd883a first commit
sugi
parents:
diff changeset
166 }
cb825acd883a first commit
sugi
parents:
diff changeset
167
cb825acd883a first commit
sugi
parents:
diff changeset
168 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
169 public double readDouble() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
170 double v = getTop().asFloatValue().getDouble();
cb825acd883a first commit
sugi
parents:
diff changeset
171 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
172 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
173 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
174 }
cb825acd883a first commit
sugi
parents:
diff changeset
175 return v;
cb825acd883a first commit
sugi
parents:
diff changeset
176 }
cb825acd883a first commit
sugi
parents:
diff changeset
177
cb825acd883a first commit
sugi
parents:
diff changeset
178 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
179 public byte[] readByteArray() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
180 byte[] raw = getTop().asRawValue().getByteArray();
cb825acd883a first commit
sugi
parents:
diff changeset
181 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
182 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
183 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
184 }
cb825acd883a first commit
sugi
parents:
diff changeset
185 return raw;
cb825acd883a first commit
sugi
parents:
diff changeset
186 }
cb825acd883a first commit
sugi
parents:
diff changeset
187
cb825acd883a first commit
sugi
parents:
diff changeset
188 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
189 public String readString() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
190 String str = getTop().asRawValue().getString();
cb825acd883a first commit
sugi
parents:
diff changeset
191 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
192 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
193 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
194 }
cb825acd883a first commit
sugi
parents:
diff changeset
195 return str;
cb825acd883a first commit
sugi
parents:
diff changeset
196 }
cb825acd883a first commit
sugi
parents:
diff changeset
197
cb825acd883a first commit
sugi
parents:
diff changeset
198 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
199 public int readArrayBegin() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
200 Value v = getTop();
cb825acd883a first commit
sugi
parents:
diff changeset
201 if (!v.isArrayValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
202 throw new MessageTypeException(
cb825acd883a first commit
sugi
parents:
diff changeset
203 "Expected array but got not array value");
cb825acd883a first commit
sugi
parents:
diff changeset
204 }
cb825acd883a first commit
sugi
parents:
diff changeset
205 ArrayValue a = v.asArrayValue();
cb825acd883a first commit
sugi
parents:
diff changeset
206 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
207 stack.pushArray(a.size());
cb825acd883a first commit
sugi
parents:
diff changeset
208 values[stack.getDepth()] = a.getElementArray();
cb825acd883a first commit
sugi
parents:
diff changeset
209 return a.size();
cb825acd883a first commit
sugi
parents:
diff changeset
210 }
cb825acd883a first commit
sugi
parents:
diff changeset
211
cb825acd883a first commit
sugi
parents:
diff changeset
212 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
213 public void readArrayEnd(boolean check) throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
214 if (!stack.topIsArray()) {
cb825acd883a first commit
sugi
parents:
diff changeset
215 throw new MessageTypeException(
cb825acd883a first commit
sugi
parents:
diff changeset
216 "readArrayEnd() is called but readArrayBegin() is not called");
cb825acd883a first commit
sugi
parents:
diff changeset
217 }
cb825acd883a first commit
sugi
parents:
diff changeset
218
cb825acd883a first commit
sugi
parents:
diff changeset
219 int remain = stack.getTopCount();
cb825acd883a first commit
sugi
parents:
diff changeset
220 if (remain > 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
221 if (check) {
cb825acd883a first commit
sugi
parents:
diff changeset
222 throw new MessageTypeException(
cb825acd883a first commit
sugi
parents:
diff changeset
223 "readArrayEnd(check=true) is called but the array is not end");
cb825acd883a first commit
sugi
parents:
diff changeset
224 }
cb825acd883a first commit
sugi
parents:
diff changeset
225 for (int i = 0; i < remain; i++) {
cb825acd883a first commit
sugi
parents:
diff changeset
226 skip();
cb825acd883a first commit
sugi
parents:
diff changeset
227 }
cb825acd883a first commit
sugi
parents:
diff changeset
228 }
cb825acd883a first commit
sugi
parents:
diff changeset
229 stack.pop();
cb825acd883a first commit
sugi
parents:
diff changeset
230
cb825acd883a first commit
sugi
parents:
diff changeset
231 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
232 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
233 }
cb825acd883a first commit
sugi
parents:
diff changeset
234 }
cb825acd883a first commit
sugi
parents:
diff changeset
235
cb825acd883a first commit
sugi
parents:
diff changeset
236 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
237 public int readMapBegin() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
238 Value v = getTop();
cb825acd883a first commit
sugi
parents:
diff changeset
239 if (!v.isMapValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
240 throw new MessageTypeException("Expected map but got not map value");
cb825acd883a first commit
sugi
parents:
diff changeset
241 }
cb825acd883a first commit
sugi
parents:
diff changeset
242 MapValue m = v.asMapValue();
cb825acd883a first commit
sugi
parents:
diff changeset
243 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
244 stack.pushMap(m.size());
cb825acd883a first commit
sugi
parents:
diff changeset
245 values[stack.getDepth()] = m.getKeyValueArray();
cb825acd883a first commit
sugi
parents:
diff changeset
246 return m.size();
cb825acd883a first commit
sugi
parents:
diff changeset
247 }
cb825acd883a first commit
sugi
parents:
diff changeset
248
cb825acd883a first commit
sugi
parents:
diff changeset
249 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
250 public void readMapEnd(boolean check) throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
251 if (!stack.topIsMap()) {
cb825acd883a first commit
sugi
parents:
diff changeset
252 throw new MessageTypeException(
cb825acd883a first commit
sugi
parents:
diff changeset
253 "readMapEnd() is called but readMapBegin() is not called");
cb825acd883a first commit
sugi
parents:
diff changeset
254 }
cb825acd883a first commit
sugi
parents:
diff changeset
255
cb825acd883a first commit
sugi
parents:
diff changeset
256 int remain = stack.getTopCount();
cb825acd883a first commit
sugi
parents:
diff changeset
257 if (remain > 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
258 if (check) {
cb825acd883a first commit
sugi
parents:
diff changeset
259 throw new MessageTypeException(
cb825acd883a first commit
sugi
parents:
diff changeset
260 "readMapEnd(check=true) is called but the map is not end");
cb825acd883a first commit
sugi
parents:
diff changeset
261 }
cb825acd883a first commit
sugi
parents:
diff changeset
262 for (int i = 0; i < remain; i++) {
cb825acd883a first commit
sugi
parents:
diff changeset
263 skip();
cb825acd883a first commit
sugi
parents:
diff changeset
264 }
cb825acd883a first commit
sugi
parents:
diff changeset
265 }
cb825acd883a first commit
sugi
parents:
diff changeset
266 stack.pop();
cb825acd883a first commit
sugi
parents:
diff changeset
267
cb825acd883a first commit
sugi
parents:
diff changeset
268 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
269 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
270 }
cb825acd883a first commit
sugi
parents:
diff changeset
271 }
cb825acd883a first commit
sugi
parents:
diff changeset
272
cb825acd883a first commit
sugi
parents:
diff changeset
273 private Value getTop() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
274 ensureValue();
cb825acd883a first commit
sugi
parents:
diff changeset
275
cb825acd883a first commit
sugi
parents:
diff changeset
276 stack.checkCount();
cb825acd883a first commit
sugi
parents:
diff changeset
277 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
278 // if(stack.getTopCount() < 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
279 // //throw new EOFException(); // TODO
cb825acd883a first commit
sugi
parents:
diff changeset
280 // throw new RuntimeException(new EOFException());
cb825acd883a first commit
sugi
parents:
diff changeset
281 // }
cb825acd883a first commit
sugi
parents:
diff changeset
282 return value;
cb825acd883a first commit
sugi
parents:
diff changeset
283 }
cb825acd883a first commit
sugi
parents:
diff changeset
284 Value[] array = (Value[]) values[stack.getDepth()];
cb825acd883a first commit
sugi
parents:
diff changeset
285 return array[array.length - stack.getTopCount()];
cb825acd883a first commit
sugi
parents:
diff changeset
286 }
cb825acd883a first commit
sugi
parents:
diff changeset
287
cb825acd883a first commit
sugi
parents:
diff changeset
288 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
289 public Value readValue() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
290 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
291 if (value == null) {
cb825acd883a first commit
sugi
parents:
diff changeset
292 return nextValue();
cb825acd883a first commit
sugi
parents:
diff changeset
293 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
294 Value v = value;
cb825acd883a first commit
sugi
parents:
diff changeset
295 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
296 return v;
cb825acd883a first commit
sugi
parents:
diff changeset
297 }
cb825acd883a first commit
sugi
parents:
diff changeset
298 }
cb825acd883a first commit
sugi
parents:
diff changeset
299 return super.readValue();
cb825acd883a first commit
sugi
parents:
diff changeset
300 }
cb825acd883a first commit
sugi
parents:
diff changeset
301
cb825acd883a first commit
sugi
parents:
diff changeset
302 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
303 protected void readValue(Unconverter uc) throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
304 if (uc.getResult() != null) {
cb825acd883a first commit
sugi
parents:
diff changeset
305 uc.resetResult();
cb825acd883a first commit
sugi
parents:
diff changeset
306 }
cb825acd883a first commit
sugi
parents:
diff changeset
307
cb825acd883a first commit
sugi
parents:
diff changeset
308 stack.checkCount();
cb825acd883a first commit
sugi
parents:
diff changeset
309 Value v = getTop();
cb825acd883a first commit
sugi
parents:
diff changeset
310 if (!v.isArrayValue() && !v.isMapValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
311 uc.write(v);
cb825acd883a first commit
sugi
parents:
diff changeset
312 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
313 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
314 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
315 }
cb825acd883a first commit
sugi
parents:
diff changeset
316 if (uc.getResult() != null) {
cb825acd883a first commit
sugi
parents:
diff changeset
317 return;
cb825acd883a first commit
sugi
parents:
diff changeset
318 }
cb825acd883a first commit
sugi
parents:
diff changeset
319 }
cb825acd883a first commit
sugi
parents:
diff changeset
320
cb825acd883a first commit
sugi
parents:
diff changeset
321 while (true) {
cb825acd883a first commit
sugi
parents:
diff changeset
322 while (stack.getDepth() != 0 && stack.getTopCount() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
323 if (stack.topIsArray()) {
cb825acd883a first commit
sugi
parents:
diff changeset
324 uc.writeArrayEnd(true);
cb825acd883a first commit
sugi
parents:
diff changeset
325 stack.pop();
cb825acd883a first commit
sugi
parents:
diff changeset
326 } else if (stack.topIsMap()) {
cb825acd883a first commit
sugi
parents:
diff changeset
327 uc.writeMapEnd(true);
cb825acd883a first commit
sugi
parents:
diff changeset
328 stack.pop();
cb825acd883a first commit
sugi
parents:
diff changeset
329 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
330 throw new RuntimeException("invalid stack"); // FIXME error?
cb825acd883a first commit
sugi
parents:
diff changeset
331 }
cb825acd883a first commit
sugi
parents:
diff changeset
332 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
333 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
334 }
cb825acd883a first commit
sugi
parents:
diff changeset
335 if (uc.getResult() != null) {
cb825acd883a first commit
sugi
parents:
diff changeset
336 return;
cb825acd883a first commit
sugi
parents:
diff changeset
337 }
cb825acd883a first commit
sugi
parents:
diff changeset
338 }
cb825acd883a first commit
sugi
parents:
diff changeset
339
cb825acd883a first commit
sugi
parents:
diff changeset
340 stack.checkCount();
cb825acd883a first commit
sugi
parents:
diff changeset
341 v = getTop();
cb825acd883a first commit
sugi
parents:
diff changeset
342 if (v.isArrayValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
343 ArrayValue a = v.asArrayValue();
cb825acd883a first commit
sugi
parents:
diff changeset
344 uc.writeArrayBegin(a.size());
cb825acd883a first commit
sugi
parents:
diff changeset
345 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
346 stack.pushArray(a.size());
cb825acd883a first commit
sugi
parents:
diff changeset
347 values[stack.getDepth()] = a.getElementArray();
cb825acd883a first commit
sugi
parents:
diff changeset
348
cb825acd883a first commit
sugi
parents:
diff changeset
349 } else if (v.isMapValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
350 MapValue m = v.asMapValue();
cb825acd883a first commit
sugi
parents:
diff changeset
351 uc.writeMapBegin(m.size());
cb825acd883a first commit
sugi
parents:
diff changeset
352 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
353 stack.pushMap(m.size());
cb825acd883a first commit
sugi
parents:
diff changeset
354 values[stack.getDepth()] = m.getKeyValueArray();
cb825acd883a first commit
sugi
parents:
diff changeset
355
cb825acd883a first commit
sugi
parents:
diff changeset
356 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
357 uc.write(v);
cb825acd883a first commit
sugi
parents:
diff changeset
358 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
359 }
cb825acd883a first commit
sugi
parents:
diff changeset
360 }
cb825acd883a first commit
sugi
parents:
diff changeset
361 }
cb825acd883a first commit
sugi
parents:
diff changeset
362
cb825acd883a first commit
sugi
parents:
diff changeset
363 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
364 public void skip() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
365 stack.checkCount();
cb825acd883a first commit
sugi
parents:
diff changeset
366 Value v = getTop();
cb825acd883a first commit
sugi
parents:
diff changeset
367 if (!v.isArrayValue() && !v.isMapValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
368 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
369 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
370 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
371 }
cb825acd883a first commit
sugi
parents:
diff changeset
372 return;
cb825acd883a first commit
sugi
parents:
diff changeset
373 }
cb825acd883a first commit
sugi
parents:
diff changeset
374 int targetDepth = stack.getDepth();
cb825acd883a first commit
sugi
parents:
diff changeset
375 while (true) {
cb825acd883a first commit
sugi
parents:
diff changeset
376 while (stack.getTopCount() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
377 stack.pop();
cb825acd883a first commit
sugi
parents:
diff changeset
378 if (stack.getDepth() == 0) {
cb825acd883a first commit
sugi
parents:
diff changeset
379 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
380 }
cb825acd883a first commit
sugi
parents:
diff changeset
381 if (stack.getDepth() <= targetDepth) {
cb825acd883a first commit
sugi
parents:
diff changeset
382 return;
cb825acd883a first commit
sugi
parents:
diff changeset
383 }
cb825acd883a first commit
sugi
parents:
diff changeset
384 }
cb825acd883a first commit
sugi
parents:
diff changeset
385
cb825acd883a first commit
sugi
parents:
diff changeset
386 stack.checkCount();
cb825acd883a first commit
sugi
parents:
diff changeset
387 v = getTop();
cb825acd883a first commit
sugi
parents:
diff changeset
388 if (v.isArrayValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
389 ArrayValue a = v.asArrayValue();
cb825acd883a first commit
sugi
parents:
diff changeset
390 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
391 stack.pushArray(a.size());
cb825acd883a first commit
sugi
parents:
diff changeset
392 values[stack.getDepth()] = a.getElementArray();
cb825acd883a first commit
sugi
parents:
diff changeset
393
cb825acd883a first commit
sugi
parents:
diff changeset
394 } else if (v.isMapValue()) {
cb825acd883a first commit
sugi
parents:
diff changeset
395 MapValue m = v.asMapValue();
cb825acd883a first commit
sugi
parents:
diff changeset
396 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
397 stack.pushMap(m.size());
cb825acd883a first commit
sugi
parents:
diff changeset
398 values[stack.getDepth()] = m.getKeyValueArray();
cb825acd883a first commit
sugi
parents:
diff changeset
399
cb825acd883a first commit
sugi
parents:
diff changeset
400 } else {
cb825acd883a first commit
sugi
parents:
diff changeset
401 stack.reduceCount();
cb825acd883a first commit
sugi
parents:
diff changeset
402 }
cb825acd883a first commit
sugi
parents:
diff changeset
403 }
cb825acd883a first commit
sugi
parents:
diff changeset
404 }
cb825acd883a first commit
sugi
parents:
diff changeset
405
cb825acd883a first commit
sugi
parents:
diff changeset
406 public ValueType getNextType() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
407 return getTop().getType();
cb825acd883a first commit
sugi
parents:
diff changeset
408 }
cb825acd883a first commit
sugi
parents:
diff changeset
409
cb825acd883a first commit
sugi
parents:
diff changeset
410 public void reset() {
cb825acd883a first commit
sugi
parents:
diff changeset
411 stack.clear();
cb825acd883a first commit
sugi
parents:
diff changeset
412 value = null;
cb825acd883a first commit
sugi
parents:
diff changeset
413 }
cb825acd883a first commit
sugi
parents:
diff changeset
414
cb825acd883a first commit
sugi
parents:
diff changeset
415 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
416 public void close() throws IOException {
cb825acd883a first commit
sugi
parents:
diff changeset
417 }
cb825acd883a first commit
sugi
parents:
diff changeset
418
cb825acd883a first commit
sugi
parents:
diff changeset
419 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
420 public int getReadByteCount() {
cb825acd883a first commit
sugi
parents:
diff changeset
421 throw new UnsupportedOperationException("Not implemented yet");
cb825acd883a first commit
sugi
parents:
diff changeset
422 }
cb825acd883a first commit
sugi
parents:
diff changeset
423
cb825acd883a first commit
sugi
parents:
diff changeset
424 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
425 public void setRawSizeLimit(int size) {
cb825acd883a first commit
sugi
parents:
diff changeset
426 throw new UnsupportedOperationException("Not implemented yet");
cb825acd883a first commit
sugi
parents:
diff changeset
427 }
cb825acd883a first commit
sugi
parents:
diff changeset
428
cb825acd883a first commit
sugi
parents:
diff changeset
429 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
430 public void setArraySizeLimit(int size) {
cb825acd883a first commit
sugi
parents:
diff changeset
431 throw new UnsupportedOperationException("Not implemented yet");
cb825acd883a first commit
sugi
parents:
diff changeset
432 }
cb825acd883a first commit
sugi
parents:
diff changeset
433
cb825acd883a first commit
sugi
parents:
diff changeset
434 @Override
cb825acd883a first commit
sugi
parents:
diff changeset
435 public void setMapSizeLimit(int size) {
cb825acd883a first commit
sugi
parents:
diff changeset
436 throw new UnsupportedOperationException("Not implemented yet");
cb825acd883a first commit
sugi
parents:
diff changeset
437 }
7
e7e55c455e39 refactor
sugi
parents: 0
diff changeset
438
e7e55c455e39 refactor
sugi
parents: 0
diff changeset
439 @Override
e7e55c455e39 refactor
sugi
parents: 0
diff changeset
440 public byte[] getSerializedByteArray(int len) {
e7e55c455e39 refactor
sugi
parents: 0
diff changeset
441 throw new UnsupportedOperationException("Not implemented yet");
e7e55c455e39 refactor
sugi
parents: 0
diff changeset
442 }
0
cb825acd883a first commit
sugi
parents:
diff changeset
443 }