Project

General

Profile

Statistics
| Revision:

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
}