comparison src/main/java/alice/datasegment/ReceiveData.java @ 523:145c425db88d dispose

add CompressedLDSM
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Thu, 09 Apr 2015 18:36:26 +0900
parents 7ef0ebb40c9b
children 30a74eee59c7
comparison
equal deleted inserted replaced
522:b8fe79f0c764 523:145c425db88d
1 package alice.datasegment; 1 package alice.datasegment;
2 2
3 import java.io.ByteArrayOutputStream; 3 import java.io.ByteArrayOutputStream;
4 import java.io.IOException; 4 import java.io.IOException;
5 import java.util.zip.DataFormatException; 5 import java.nio.ByteBuffer;
6 import java.util.zip.Inflater; 6 import java.util.zip.*;
7 import java.util.zip.InflaterOutputStream;
8 7
8 import org.apache.log4j.Logger;
9 import org.msgpack.type.Value; 9 import org.msgpack.type.Value;
10
11 import alice.codesegment.SingletonMessage; 10 import alice.codesegment.SingletonMessage;
12 11
12 /**
13 * 送られてきたDSを一時的に取っておくクラス。inputでも使用。
14 */
13 public class ReceiveData { 15 public class ReceiveData {
14 private Object val; 16 private Object val;//Object型のDS
17 private byte[] messagePack;//byteArray(serialized)のDS
18 private byte[] zMessagePack;//byteArray(compressed)のDS
19 private Class<?> clazz;
20 private Logger logger = Logger.getLogger("MessagePack");
15 21
16 // both flag have to be true or false except DataSegment is byteArray; 22 public long time;//測定用
17 private boolean compressed = false;
18 private boolean serialized = false;
19 private boolean byteArray = false;
20
21 public long time;
22 public boolean setTime = false; 23 public boolean setTime = false;
23 public int depth = 1; 24 public int depth = 1;
24 25
25 public ReceiveData(Object obj, boolean cFlag, boolean sFlag){ 26 /**
27 * コンストラクタ。Object型のDSと圧縮のメタ情報を受け取る。
28 * put/update用?
29 * @param obj DS本体(Object)
30 */
31 public ReceiveData(Object obj, boolean cFlag, boolean sFlag) {
26 val = obj; 32 val = obj;
27 compressed = cFlag; 33 if (cFlag){
28 serialized = sFlag; 34 messagePack = (byte[])val;
29 } 35 ByteBuffer buf = null;
30 36
31 public ReceiveData(byte[] obj, boolean cFlag, boolean sFlag){ 37 try {
32 val = obj; 38 zMessagePack = zip(messagePack);
33 byteArray = true; 39 buf = ByteBuffer.allocate(zMessagePack.length + 1);
34 compressed = cFlag; 40 buf.put((byte) 0xc1);
35 serialized = sFlag; 41 buf.put(zMessagePack);
36 } 42 zMessagePack = buf.array();
37 43 } catch (IOException e) {
38 public boolean isByteArray(){ 44 e.printStackTrace();
39 return byteArray; 45 }
40 }
41
42 public boolean compressed(){
43 return compressed;
44 }
45
46 public boolean serialized(){
47 return serialized;
48 }
49
50 public Object getObj(){
51 return val;
52 }
53
54 public String asString(){
55 if (serialized){
56 return asClass(String.class);
57 } else {
58 return (String) val;
59 } 46 }
60 } 47 }
61 48
62 public int asInteger(){ 49 /**
63 if (serialized){ 50 * コンストラクタ。byteArray型のDSと圧縮のメタ情報を受け取り、byteArrayフラグを立てる。
64 return asClass(Integer.class); 51 *
52 * @param messagePack DS本体(byteArray)
53 */
54 public ReceiveData(byte[] messagePack) {
55
56 if (messagePack[0] == 0xc1){
57 this.zMessagePack = messagePack;
65 } else { 58 } else {
66 return (Integer) val; 59 this.messagePack = messagePack;
67 } 60 }
61
62 logger.debug(this.messagePack);
63 logger.debug(this.zMessagePack);
68 } 64 }
69 65
70 public Float asFloat(){ 66
71 if (serialized){ 67 public boolean isByteArray(){//byteArrayフラグの状態を取得するメソッド
72 return asClass(Float.class); 68 return messagePack != null;
73 } else {
74 return (Float) val;
75 }
76 } 69 }
77 70
78 public Value getVal(){ 71 public boolean compressed(){//compressedフラグの状態を取得するメソッド
79 if (serialized){ 72 return zMessagePack != null;
73 }
74
75 public boolean serialized(){//serializedフラグの状態を取得するメソッド
76 return val != null;
77 }
78
79 public Object getObj(){//Object型のDS本体を取得するメソッド。
80 return asClass(Object.class);
81 }
82
83 public String asString(){//String型としてDSを取得するメソッド。DSがシリアライズされていればStringクラスを返す。
84 return asClass(String.class);
85 }
86
87 public int asInteger(){//Int型としてDSを取得するメソッド。DSがシリアライズされていればIntクラスを返す。
88 return asClass(Integer.class);
89 }
90
91 public Float asFloat(){//Float型としてDSを取得するメソッド。DSがシリアライズされていればFloatクラスを返す。
92 return asClass(Float.class);
93 }
94
95 public Value getVal(){//Value型としてDSを取得するメソッド
96 if (val == null){//もとはval != null
80 return asClass(Value.class); 97 return asClass(Value.class);
81 } else { 98 } else {
82 try { 99 try {
83 return SingletonMessage.getInstance().unconvert(val); 100 return SingletonMessage.getInstance().unconvert(val);//MassagePackでvalue型に変換。できなければnullを返す。
84 } catch (IOException e) { 101 } catch (IOException e) {
85 e.printStackTrace(); 102 e.printStackTrace();
86 } 103 }
87 return null; 104 return null;
88 } 105 }
89 } 106 }
90 107
91 @SuppressWarnings("unchecked") 108 /**
92 public <T> T asClass(Class<T> clazz) { 109 * DSを任意の型で取得するメソッド。
110 * DSがbyteArrayでなければ指定された型に変換して返す。
111 * DSがbyteArrayなら解凍状態にして指定された型に変換して返す。
112 *
113 * @param clazz
114 * @param <T>
115 * @return
116 */
117 public <T> T asClass(Class<T> clazz) {//javasist
93 try { 118 try {
94 if (!byteArray) { 119 if (val != null) {
95 return (T) val; 120 return (T) val;
96 } 121 }
97 byte[] b = null; 122 byte[] b = messagePack;
98 if (compressed) { 123
99 b = unzip((byte[]) val); 124 if (zMessagePack != null && messagePack == null) {
100 } else { 125 logger.debug("zMessagePack = " + zMessagePack);
101 b = (byte[]) val; 126 messagePack = unzip(zMessagePack);
127 b = messagePack;
102 } 128 }
103 129
104 if (serialized) { 130 logger.debug("MessagePack = " + messagePack);
131
132 if (val == null) {
133 this.clazz = clazz;
105 return SingletonMessage.getInstance().read(b, clazz); 134 return SingletonMessage.getInstance().read(b, clazz);
106 } else { 135 } else {
107 return (T) b; 136 return (T) val;
108 } 137 }
109 } catch (IOException | DataFormatException e) { 138 } catch (Exception e) {
110 e.printStackTrace(); 139 e.printStackTrace();
111 return null; 140 return null;
112 } 141 }
113 } 142 }
114 143
144 /**
145 * java.util.zip.Inflater(zlib)を使ってbyteArray型のDSを解凍する。
146 *
147 * @param input 圧縮されたbyteArray型のDS
148 * @return 解凍したbyteArray型DS
149 * @throws IOException
150 * @throws DataFormatException
151 */
115 public byte[] unzip(byte[] input) throws IOException, DataFormatException{ 152 public byte[] unzip(byte[] input) throws IOException, DataFormatException{
116 Inflater inflater = new Inflater(); 153 Inflater inflater = new Inflater();
117 ByteArrayOutputStream os = new ByteArrayOutputStream(); 154 ByteArrayOutputStream os = new ByteArrayOutputStream();
118 InflaterOutputStream ios = new InflaterOutputStream(os, inflater); 155 InflaterOutputStream ios = new InflaterOutputStream(os, inflater);
119 ios.write(input); 156 ios.write(input);
120 ios.finish(); 157 ios.finish();
121 return os.toByteArray(); 158 return os.toByteArray();
122 } 159 }
123 160
161 /**
162 * java.util.zip.Deflater(zlib)を使ってbyteArray型のDSを圧縮する。
163 *
164 * @param input 非圧縮状態のbyteArray型のDS
165 * @return 圧縮したbyteArray型DS
166 * @throws IOException
167 */
168 public byte[] zip(byte[] input) throws IOException{
169 Deflater deflater = new Deflater();
170 ByteArrayOutputStream os = new ByteArrayOutputStream();
171 DeflaterOutputStream dos = new DeflaterOutputStream(os, deflater);
172 dos.write(input);
173 dos.finish();
174 return os.toByteArray();
175 }
176
124 } 177 }