Mercurial > hg > Database > Alice
annotate src/main/java/alice/datasegment/ReceiveData.java @ 531:b6049fb123d8 dispose
resolve unzip, working TestRemoteAlice
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 03 May 2015 15:58:31 +0900 |
parents | 4aeebea0c9b5 |
children | 33f981dd91d2 |
rev | line source |
---|---|
452 | 1 package alice.datasegment; |
2 | |
525
30a74eee59c7
working TestRemoteAlice
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
523
diff
changeset
|
3 import java.io.*; |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
4 import java.nio.ByteBuffer; |
527 | 5 import java.util.LinkedList; |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
6 import java.util.zip.*; |
464 | 7 |
527 | 8 import org.msgpack.MessagePack; |
452 | 9 import org.msgpack.type.Value; |
10 | |
526
928907206d21
remove CompressedRDSM & CompressedLDSM class
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
525
diff
changeset
|
11 |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
12 /** |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
13 * 送られてきたDSを一時的に取っておくクラス。inputでも使用。 |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
14 */ |
452 | 15 public class ReceiveData { |
527 | 16 private Object val;//for Object DS |
17 private byte[] messagePack;//for byteArray(serialized) DS | |
18 private byte[] zMessagePack;//for byteArray(compressed) DS | |
530 | 19 private int dataSize; |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
20 private Class<?> clazz; |
467 | 21 |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
22 public long time;//測定用 |
488 | 23 public boolean setTime = false; |
24 public int depth = 1; | |
25 | |
528
6ebddfac7ff6
delete RecieveData.setCompressFlag
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
527
diff
changeset
|
26 private static final MessagePack packer = new MessagePack(); |
527 | 27 |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
28 /** |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
29 * コンストラクタ。Object型のDSと圧縮のメタ情報を受け取る。 |
525
30a74eee59c7
working TestRemoteAlice
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
523
diff
changeset
|
30 * put/update/reply用? |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
31 * @param obj DS本体(Object) |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
32 */ |
525
30a74eee59c7
working TestRemoteAlice
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
523
diff
changeset
|
33 public ReceiveData(Object obj) { |
526
928907206d21
remove CompressedRDSM & CompressedLDSM class
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
525
diff
changeset
|
34 clazz = obj.getClass(); |
457 | 35 val = obj; |
452 | 36 } |
463 | 37 |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
38 /** |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
39 * コンストラクタ。byteArray型のDSと圧縮のメタ情報を受け取り、byteArrayフラグを立てる。 |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
40 * |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
41 * @param messagePack DS本体(byteArray) |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
42 */ |
530 | 43 public ReceiveData(byte[] messagePack, boolean compressed, int datasize) { |
44 this.dataSize = datasize; | |
528
6ebddfac7ff6
delete RecieveData.setCompressFlag
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
527
diff
changeset
|
45 if (compressed){ |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
46 this.zMessagePack = messagePack; |
452 | 47 } else { |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
48 this.messagePack = messagePack; |
452 | 49 } |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
50 } |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
51 |
525
30a74eee59c7
working TestRemoteAlice
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
523
diff
changeset
|
52 public boolean isByteArray(){ |
30a74eee59c7
working TestRemoteAlice
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
523
diff
changeset
|
53 return messagePack != null | zMessagePack != null; |
452 | 54 } |
463 | 55 |
525
30a74eee59c7
working TestRemoteAlice
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
523
diff
changeset
|
56 public boolean compressed(){ |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
57 return zMessagePack != null; |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
58 } |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
59 |
525
30a74eee59c7
working TestRemoteAlice
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
523
diff
changeset
|
60 public boolean serialized(){ |
526
928907206d21
remove CompressedRDSM & CompressedLDSM class
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
525
diff
changeset
|
61 return val == null; |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
62 } |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
63 |
527 | 64 public Object getObj(){ |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
65 return asClass(Object.class); |
452 | 66 } |
463 | 67 |
527 | 68 public String asString(){ |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
69 return asClass(String.class); |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
70 } |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
71 |
528
6ebddfac7ff6
delete RecieveData.setCompressFlag
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
527
diff
changeset
|
72 public int asInteger() { |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
73 return asClass(Integer.class); |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
74 } |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
75 |
528
6ebddfac7ff6
delete RecieveData.setCompressFlag
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
527
diff
changeset
|
76 public Float asFloat() { |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
77 return asClass(Float.class); |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
78 } |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
79 |
527 | 80 public Value getVal(){///get DS as Value type |
81 if (val == null){///val != null | |
452 | 82 return asClass(Value.class); |
527 | 83 } else { |
452 | 84 try { |
528
6ebddfac7ff6
delete RecieveData.setCompressFlag
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
527
diff
changeset
|
85 return packer.unconvert(val);///convert to Value type by MassagePack |
452 | 86 } catch (IOException e) { |
87 e.printStackTrace(); | |
88 } | |
89 return null; | |
90 } | |
91 } | |
463 | 92 |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
93 /** |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
94 * DSを任意の型で取得するメソッド。 |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
95 * DSがbyteArrayでなければ指定された型に変換して返す。 |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
96 * DSがbyteArrayなら解凍状態にして指定された型に変換して返す。 |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
97 * |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
98 * @param clazz |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
99 * @param <T> |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
100 * @return |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
101 */ |
527 | 102 public <T> T asClass(Class<T> clazz) {///javasist |
526
928907206d21
remove CompressedRDSM & CompressedLDSM class
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
525
diff
changeset
|
103 System.out.println("in asClass val:" + val + ", MP:" + messagePack + ", zMP:" + zMessagePack); |
928907206d21
remove CompressedRDSM & CompressedLDSM class
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
525
diff
changeset
|
104 |
452 | 105 try { |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
106 if (val != null) { |
452 | 107 return (T) val; |
460 | 108 } |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
109 |
528
6ebddfac7ff6
delete RecieveData.setCompressFlag
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
527
diff
changeset
|
110 if (zMessagePack != null && messagePack == null) { |
530 | 111 messagePack = unzip(zMessagePack, dataSize);///ToDo:read header and set length |
452 | 112 } |
463 | 113 |
529
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
114 return packer.read(messagePack, clazz); |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
488
diff
changeset
|
115 |
527 | 116 } catch (IOException e) {// | DataFormatException e |
452 | 117 e.printStackTrace(); |
460 | 118 return null; |
452 | 119 } |
120 } | |
463 | 121 |
530 | 122 public byte[] getMessagePack(){ |
123 if (messagePack != null){ | |
124 return messagePack; | |
125 } else { | |
126 try { | |
127 messagePack = packer.write(val); | |
128 setDataSize(messagePack.length); | |
129 } catch (IOException e) { | |
130 e.printStackTrace(); | |
131 } | |
526
928907206d21
remove CompressedRDSM & CompressedLDSM class
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
525
diff
changeset
|
132 |
530 | 133 return messagePack; |
134 } | |
135 } | |
136 | |
137 public byte[] getZMessagePack(){ | |
138 if (zMessagePack != null){ | |
139 System.out.println("have zMessagePack"); | |
140 return zMessagePack; | |
141 } else { | |
142 try { | |
143 zip(); | |
144 | |
145 } catch (IOException e) { | |
146 e.printStackTrace(); | |
147 } | |
148 | |
149 return zMessagePack; | |
150 } | |
151 } | |
152 | |
153 public void zip() throws IOException { | |
154 System.out.println("in zip"); | |
529
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
155 LinkedList<ByteBuffer> inputs = new LinkedList<ByteBuffer>(); |
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
156 int inputIndex = 0; |
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
157 LinkedList<ByteBuffer> outputs = new LinkedList<ByteBuffer>(); |
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
158 Deflater deflater = new Deflater(); |
527 | 159 |
530 | 160 inputs.add(ByteBuffer.wrap(getMessagePack())); |
527 | 161 int len = 0; |
529
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
162 int INFLATE_BUFSIZE = 1024 * 100;//ToDo:fix |
527 | 163 ByteBuffer c1 = allocate(INFLATE_BUFSIZE);//for output |
164 | |
165 while (inputIndex < inputs.size()) { | |
166 ByteBuffer b1 = inputs.get(inputIndex++); | |
167 deflater.setInput(b1.array(), b1.position(), b1.remaining()); | |
529
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
168 |
527 | 169 if (inputIndex == inputs.size()){ |
170 deflater.finish(); | |
171 } | |
172 | |
173 int len1 = 0; | |
174 do { | |
530 | 175 len1 = deflater.deflate(c1.array(), c1.position(), c1.remaining()); |
527 | 176 if (len1 > 0) { |
177 len += len1; | |
178 c1.position(c1.position() + len1); | |
179 if (c1.remaining() == 0) { | |
180 c1.flip(); | |
181 outputs.addLast(c1); | |
182 c1 = allocate(INFLATE_BUFSIZE); | |
183 } | |
184 } | |
530 | 185 } while (len1 > 0 || !deflater.needsInput()); |
527 | 186 } |
187 if (c1.position() != 0) { | |
188 c1.flip(); | |
189 outputs.addLast(c1); | |
190 } | |
528
6ebddfac7ff6
delete RecieveData.setCompressFlag
kazz <kazz@cr.ie.u-ryukyu.ac.jp>
parents:
527
diff
changeset
|
191 |
527 | 192 deflater.reset(); |
530 | 193 |
194 zMessagePack = new byte[len]; | |
195 int tmp = 0; | |
196 for (int i = 0; i < outputs.size(); i++){ | |
197 System.arraycopy(outputs.get(i).array(), 0, zMessagePack, 0 + tmp, outputs.get(i).limit());//limit? remaining? | |
198 tmp += outputs.get(i).limit(); | |
199 } | |
200 System.out.print("in make zMessagePack2: "); | |
201 for (int i = 0; i < zMessagePack.length; i++) { | |
202 System.out.print(Integer.toHexString(zMessagePack[i] & 0xff)); | |
203 } | |
204 System.out.print("\n"); | |
527 | 205 } |
206 | |
529
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
207 protected byte[] unzip(byte[] input, int zippedLength) {///read header & unzip |
527 | 208 int length = input.length; |
529
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
209 Inflater inflater = new Inflater(); |
527 | 210 |
530 | 211 System.out.print("unziped input: "); |
212 for (int i = 0; i < input.length; i++) { | |
213 System.out.print(Integer.toHexString(input[i] & 0xff)); | |
214 } | |
215 System.out.print("\n"); | |
216 | |
527 | 217 byte [] output = new byte [zippedLength];///byteArray for unziped data |
529
cb7c31848d16
add CompressedDSMs
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
528
diff
changeset
|
218 inflater.setInput(input, 0, length);///set unzip data without header |
527 | 219 |
220 try { | |
531
b6049fb123d8
resolve unzip, working TestRemoteAlice
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
530
diff
changeset
|
221 inflater.inflate(output, 0, zippedLength);///unzip |
527 | 222 } catch (DataFormatException e) { |
223 e.printStackTrace(); | |
224 } | |
225 | |
226 inflater.reset(); | |
227 | |
228 System.out.print("unziped: "); | |
229 for (int i = 0; i < output.length; i++) { | |
230 System.out.print(Integer.toHexString(output[i] & 0xff)); | |
231 } | |
232 System.out.print("\n"); | |
233 | |
234 return output; | |
235 } | |
236 | |
237 | |
238 public ByteBuffer allocate(int size) | |
239 { | |
240 ByteBuffer b = null; | |
241 while(true){ | |
242 try { | |
243 b = ByteBuffer.allocate(size); | |
244 } catch (OutOfMemoryError e) { | |
245 b = null; | |
246 } | |
247 if (b!=null) { | |
248 break; | |
249 } | |
250 try { | |
251 wait(); | |
252 } catch (InterruptedException e) { | |
253 } | |
254 } | |
255 return b; | |
256 } | |
257 | |
258 public static int byteArrayToInt(byte[] b) | |
259 { | |
260 return b[3] & 0xFF | | |
261 (b[2] & 0xFF) << 8 | | |
262 (b[1] & 0xFF) << 16 | | |
263 (b[0] & 0xFF) << 24; | |
264 } | |
265 | |
266 public static byte[] intToByteArray(int a) | |
267 { | |
268 return new byte[] { | |
269 (byte) ((a >> 24) & 0xFF), | |
270 (byte) ((a >> 16) & 0xFF), | |
271 (byte) ((a >> 8) & 0xFF), | |
272 (byte) (a & 0xFF) | |
273 }; | |
274 } | |
275 | |
530 | 276 public int getDataSize(){ |
277 return this.dataSize; | |
278 } | |
279 | |
280 public void setDataSize(int datasize){ | |
281 this.dataSize = datasize; | |
282 } | |
283 | |
452 | 284 } |