Project

General

Profile

Statistics
| Revision:

sdis1819-t7g02 / channels / MessageHeader.java @ 1

History | View | Annotate | Download (5.01 KB)

1
package channels;
2

    
3
import java.util.ArrayList;
4

    
5
import service.Constants;
6

    
7
public class MessageHeader {
8
        private String messageType;
9
        private String version;
10
        private String senderId;
11
        private String fileId;
12
        private String chunkNumber;
13
        private String degree;
14
        
15
        public MessageHeader(byte[] msg, int length) {
16
                
17
                byte[] header = getHeaderPart(msg, length);
18
                
19
                String headerString = new String(header);
20
                
21
                String[] headerElements = headerString.split("\\s+");
22
                
23
                if(!analyseHeader(headerElements)) {
24
                        throw new IllegalArgumentException("Minimum header arguments not matched");
25
                }
26
        }
27
        
28
        public MessageHeader(String[] headerComponents) {
29
                if(!analyseHeader(headerComponents)) {
30
                        throw new IllegalArgumentException("Minimum header arguments not matched");
31
                }
32
        }
33
        
34
        @Override
35
        public String toString() {
36
                if(messageType.equals(Constants.PUTCHUNK)) {
37
                        return messageType + " " + version + " " + senderId + " " + fileId + " " + chunkNumber + " " + degree;
38
                }
39
                else {
40
                        return messageType + " " + version + " " + senderId + " " + fileId + " " + chunkNumber;
41
                }
42
        }
43
        
44
        public String getMessageType() {
45
                return messageType;
46
        }
47

    
48
        private void setMessageType(String messageType) {
49
                this.messageType = messageType;
50
        }
51

    
52
        public String getVersion() {
53
                return version;
54
        }
55

    
56
        private void setVersion(String version) {
57
                this.version = version;
58
        }
59

    
60
        public String getSenderId() {
61
                return senderId;
62
        }
63

    
64
        private boolean setSenderId(String senderId) {        
65
                try {
66
                        Integer.parseInt(senderId);
67
                        this.senderId = senderId;
68
                } catch(Exception e) {
69
                        return false;
70
                }
71

    
72
                return true;
73
        }
74

    
75
        public String getFileId() {
76
                return fileId;
77
        }
78

    
79
        private void setFileId(String fileId) {
80
                this.fileId = fileId;
81
        }
82

    
83
        public String getChunkNumber() {
84
                return chunkNumber;
85
        }
86

    
87
        private void setChunkNumber(String chunkNumber) {
88
                this.chunkNumber = chunkNumber;
89
        }
90

    
91
        public String getDegree() {
92
                if(degree == null) {
93
                        return "1";
94
                }
95
                return degree;
96
        }
97

    
98
        private void setDegree(String degree) {
99
                this.degree = degree;
100
        }
101

    
102
        private byte[] getHeaderPart(byte[] msg, int length) {
103
                byte[] headerPart = new byte[length];
104
                
105
                for(int i = 0; i < length; i++) {
106
                        headerPart[i] = msg[i];
107
                }
108
                
109
                return headerPart;
110
        }
111
        
112
        public ArrayList<Byte> toBytes() {
113
                ArrayList<Byte> headerBytes = new ArrayList<Byte>();
114
                Byte space = new String(" ").getBytes()[0];
115
                
116
                for(Byte b : getMessageType().getBytes()) {
117
                        headerBytes.add(b);
118
                }
119
                
120
                headerBytes.add(space);
121
                
122
                for(Byte b : getVersion().getBytes()) {
123
                        headerBytes.add(b);
124
                }
125
                
126
                headerBytes.add(space);
127
                
128
                for(Byte b : getSenderId().getBytes()) {
129
                        headerBytes.add(b);
130
                }
131
                
132
                headerBytes.add(space);
133
                
134
                for(Byte b : getFileId().getBytes()) {
135
                        headerBytes.add(b);
136
                }
137
                
138
                headerBytes.add(space);
139
                
140
                if(!messageType.equals(Constants.DELETE)) {
141
                        for(Byte b : getChunkNumber().getBytes()) {
142
                                headerBytes.add(b);
143
                        }
144
                }
145
                
146
                headerBytes.add(space);
147
                
148
                if(messageType.equals(Constants.PUTCHUNK)) {
149
                        for(Byte b : getDegree().getBytes()) {
150
                                headerBytes.add(b);
151
                        }
152
                }
153
                headerBytes.add(space);
154
                
155
                headerBytes.add(Constants.CR);
156
                headerBytes.add(Constants.LF);
157
                headerBytes.add(Constants.CR);
158
                headerBytes.add(Constants.LF);
159
                
160
                return headerBytes;
161
        }
162
        
163
        public byte[] headerToBytes() {
164
                ArrayList<Byte> headerBytes = toBytes();
165
                byte[] toReturn = new byte[headerBytes.size()];
166
                int i = 0;
167
                
168
                for(Byte b: headerBytes) {
169
                        toReturn[i] = b;
170
                        i++;
171
                }
172
                
173
                return toReturn;
174
        }
175
        
176
        private boolean analyseHeader(String[] h) {
177
                
178
                switch(h[0]) {
179
                        case Constants.PUTCHUNK:
180
                                if(h.length != Constants.PUTCHUNK_N_ARGS) {
181
                                        return false;
182
                                }
183
                                setMessageType(h[0]);
184
                                setVersion(h[1]);
185
                                if(!setSenderId(h[2])) {
186
                                        return false;
187
                                }
188
                                setFileId(h[3]);
189
                                setChunkNumber(h[4]);
190
                                setDegree(h[5]);
191
                                break;
192
                        case Constants.STORED:
193
                                if(h.length != Constants.STORED_N_ARGS) {
194
                                        return false;
195
                                }
196
                                setMessageType(h[0]);
197
                                setVersion(h[1]);
198
                                if(!setSenderId(h[2])) {
199
                                        return false;
200
                                }
201
                                setFileId(h[3]);
202
                                setChunkNumber(h[4]);
203
                                break;
204
                        case Constants.GETCHUNK:
205
                                if(h.length != Constants.GETCHUNK_N_ARGS) {
206
                                        return false;
207
                                }
208
                                setMessageType(h[0]);
209
                                setVersion(h[1]);
210
                                if(!setSenderId(h[2])) {
211
                                        return false;
212
                                }
213
                                setFileId(h[3]);
214
                                setChunkNumber(h[4]);
215
                                break;
216
                        case Constants.CHUNK:
217
                                if(h.length != Constants.CHUNK_N_ARGS) {
218
                                        return false;
219
                                }
220
                                setMessageType(h[0]);
221
                                setVersion(h[1]);
222
                                if(!setSenderId(h[2])) {
223
                                        return false;
224
                                }
225
                                setFileId(h[3]);
226
                                setChunkNumber(h[4]);
227
                                break;
228
                        case Constants.DELETE:
229
                                if(h.length != Constants.DELETE_N_ARGS) {
230
                                        return false;
231
                                }
232
                                setMessageType(h[0]);
233
                                setVersion(h[1]);
234
                                if(!setSenderId(h[2])) {
235
                                        return false;
236
                                }
237
                                setFileId(h[3]);
238
                                break;
239
                        case Constants.REMOVED:
240
                                if(h.length != Constants.REMOVED_N_ARGS) {
241
                                        return false;
242
                                }
243
                                setMessageType(h[0]);
244
                                setVersion(h[1]);
245
                                if(!setSenderId(h[2])) {
246
                                        return false;
247
                                }
248
                                setFileId(h[3]);
249
                                setChunkNumber(h[4]);
250
                                break;
251
                        default:
252
                                return false;
253
                }
254
                
255
                return true;
256
        }
257
}