root / DistributedBackupService / src / handlers / Message.java @ 1
History | View | Annotate | Download (4.55 KB)
1 |
package handlers; |
---|---|
2 |
|
3 |
import utils.Utils; |
4 |
import utils.Utils.MessageType; |
5 |
|
6 |
import java.io.*; |
7 |
|
8 |
public class Message { |
9 |
|
10 |
private int argsNo; |
11 |
|
12 |
private int chunkNo; |
13 |
private int senderID; |
14 |
private String fileID; |
15 |
private String version; |
16 |
private int replication; |
17 |
private MessageType msgType;
|
18 |
|
19 |
private byte [] body; |
20 |
|
21 |
public Message(byte[] information, int length) { |
22 |
String header;
|
23 |
String headerWithoutStuff;
|
24 |
String [] splittedHeader; |
25 |
|
26 |
header= readHeader(information); |
27 |
|
28 |
headerWithoutStuff = header.trim().replaceAll("\\s+", " "); |
29 |
splittedHeader = headerWithoutStuff.split("\\s+");
|
30 |
translateHeader(splittedHeader); |
31 |
|
32 |
if (msgType == MessageType.CHUNK)
|
33 |
this.body = readBody(information, header.length(), length);
|
34 |
|
35 |
if(msgType == MessageType.PUTCHUNK)
|
36 |
this.body = readBody(information, header.length(), length);
|
37 |
} |
38 |
|
39 |
public Message(MessageType type, String[] args) { |
40 |
this.msgType = type;
|
41 |
version = args[0];
|
42 |
senderID = Integer.parseInt(args[1]); |
43 |
fileID = args[2];
|
44 |
|
45 |
if (type != MessageType.DELETE)
|
46 |
chunkNo = Integer.parseInt(args[3]); |
47 |
|
48 |
if (type == MessageType.PUTCHUNK) {
|
49 |
replication = Integer.parseInt(args[4]); |
50 |
} |
51 |
} |
52 |
|
53 |
public Message(MessageType type, String[] args, byte[] information) { |
54 |
this(type, args);
|
55 |
body = information; |
56 |
} |
57 |
|
58 |
private String readHeader(byte[] information) { |
59 |
ByteArrayInputStream stream;
|
60 |
BufferedReader reader;
|
61 |
String header = ""; |
62 |
|
63 |
stream = new ByteArrayInputStream(information); |
64 |
reader = new BufferedReader(new InputStreamReader(stream)); |
65 |
|
66 |
try {
|
67 |
header = reader.readLine(); |
68 |
} catch (IOException e) { |
69 |
e.printStackTrace(); |
70 |
} |
71 |
return header;
|
72 |
} |
73 |
|
74 |
private byte[] readBody(byte[] information, int headerLength, int informationLength) { |
75 |
int readBytes;
|
76 |
ByteArrayInputStream message;
|
77 |
byte[] bodyContent; |
78 |
|
79 |
readBytes = informationLength - headerLength - 4;
|
80 |
message = new ByteArrayInputStream(information, headerLength + 4, readBytes); |
81 |
bodyContent = new byte[readBytes]; |
82 |
|
83 |
message.read(bodyContent, 0, readBytes);
|
84 |
|
85 |
return bodyContent;
|
86 |
} |
87 |
|
88 |
private void translateHeader(String[] headerSplit) { |
89 |
|
90 |
switch (headerSplit[0]) { |
91 |
case "PUTCHUNK": |
92 |
{ |
93 |
msgType = MessageType.PUTCHUNK; |
94 |
argsNo = 6;
|
95 |
} break;
|
96 |
case "STORED": |
97 |
{ |
98 |
msgType = MessageType.STORED; |
99 |
argsNo = 5;
|
100 |
} |
101 |
break;
|
102 |
case "GETCHUNK": |
103 |
{ |
104 |
msgType = MessageType.GETCHUNK; |
105 |
argsNo = 5;
|
106 |
} break;
|
107 |
case "CHUNK": |
108 |
{ msgType = MessageType.CHUNK; |
109 |
argsNo = 5;
|
110 |
} break;
|
111 |
case "DELETE": |
112 |
{ |
113 |
msgType = MessageType.DELETE; |
114 |
argsNo = 4;
|
115 |
} break;
|
116 |
case "REMOVED": |
117 |
{ |
118 |
msgType = MessageType.REMOVED; |
119 |
argsNo = 5;
|
120 |
} break;
|
121 |
default:
|
122 |
return;
|
123 |
} |
124 |
|
125 |
if (headerSplit.length != argsNo)
|
126 |
return;
|
127 |
|
128 |
version = headerSplit[1];
|
129 |
senderID = Integer.parseInt(headerSplit[2]); |
130 |
fileID = headerSplit[3];
|
131 |
|
132 |
if (argsNo > 4) |
133 |
chunkNo = Integer.parseInt(headerSplit[4]); |
134 |
|
135 |
if (msgType == MessageType.PUTCHUNK)
|
136 |
replication = Integer.parseInt(headerSplit[5]); |
137 |
|
138 |
} |
139 |
|
140 |
public String headerString() { |
141 |
String string;
|
142 |
if(msgType == MessageType.PUTCHUNK)
|
143 |
string = msgType + " " + version + " " + senderID + " " + fileID + " " + chunkNo + " " + replication + " " + Utils.CRLF + Utils.CRLF; |
144 |
else if(msgType == MessageType.DELETE) |
145 |
string = msgType + " " + version + " " + senderID + " " + fileID + " " + Utils.CRLF + Utils.CRLF; |
146 |
else
|
147 |
string = msgType + " " + version + " " + senderID + " " + fileID + " " + chunkNo + " " + Utils.CRLF + Utils.CRLF; |
148 |
return string;
|
149 |
} |
150 |
|
151 |
public byte[] getBytes() throws IOException { |
152 |
byte header[]; |
153 |
header = headerString().getBytes(); |
154 |
|
155 |
if (body == null) |
156 |
return header;
|
157 |
else {
|
158 |
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
159 |
out.write(header); |
160 |
out.write(body); |
161 |
return out.toByteArray();
|
162 |
} |
163 |
} |
164 |
|
165 |
public String getVersion() { |
166 |
return version;
|
167 |
} |
168 |
|
169 |
public int getSenderID() { |
170 |
return senderID;
|
171 |
} |
172 |
|
173 |
public String getFileID() { |
174 |
return fileID;
|
175 |
} |
176 |
|
177 |
public int getChunkNo() { |
178 |
return chunkNo;
|
179 |
} |
180 |
|
181 |
public int getReplicationDegree() { |
182 |
return replication;
|
183 |
} |
184 |
|
185 |
public byte[] getBody() { |
186 |
return body;
|
187 |
} |
188 |
|
189 |
public MessageType getType() {
|
190 |
return msgType;
|
191 |
} |
192 |
|
193 |
@Override
|
194 |
public String toString() { |
195 |
String str;
|
196 |
if(msgType == MessageType.PUTCHUNK)
|
197 |
{ |
198 |
str = "<" + msgType +">" + " " + "<" + version+">" + " " + "<" + senderID+">" + " " +"<" + fileID+">" + " " + "<" +chunkNo+">"; |
199 |
} |
200 |
else if(msgType == MessageType.DELETE) |
201 |
{ |
202 |
str = "<" + msgType +">" + " " + "<" + version+">" + " " + "<" + senderID+">" + " " +"<" + fileID+">"; |
203 |
} |
204 |
else
|
205 |
{ |
206 |
str = "<" + msgType +">" + " " + "<" + version+">" + " " + "<" + senderID+">" + " " +"<" + fileID+">" + " " + "<" +chunkNo+">"; |
207 |
} |
208 |
return str;
|
209 |
} |
210 |
|
211 |
} |