1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package goldengate.common.command;
22
23 import goldengate.common.exception.InvalidArgumentException;
24
25
26
27
28
29
30
31 public enum ReplyCode {
32
33
34
35 REPLY_000_SPECIAL_NOSTATUS(0),
36
37
38
39
40
41
42 REPLY_110_RESTART_MARKER_REPLY(110),
43
44
45
46
47 REPLY_120_SERVICE_READY_IN_NNN_MINUTES(120),
48
49
50
51
52 REPLY_125_DATA_CONNECTION_ALREADY_OPEN(125),
53
54
55
56
57 REPLY_150_FILE_STATUS_OKAY(150),
58
59
60
61
62 REPLY_200_COMMAND_OKAY(200),
63
64
65
66
67 REPLY_202_COMMAND_NOT_IMPLEMENTED(202),
68
69
70
71
72 REPLY_211_SYSTEM_STATUS_REPLY(211),
73
74
75
76
77 REPLY_212_DIRECTORY_STATUS(212),
78
79
80
81
82 REPLY_213_FILE_STATUS(213),
83
84
85
86
87
88 REPLY_214_HELP_MESSAGE(
89 214,
90 "This FTP server refers to RFC 959, RFC 775, RFC 2389 and RFC 3659"),
91
92
93
94
95
96 REPLY_215_NAME_SYSTEM_TYPE(215),
97
98
99
100
101 REPLY_220_SERVICE_READY(220),
102
103
104
105
106 REPLY_221_CLOSING_CONTROL_CONNECTION(221),
107
108
109
110
111 REPLY_225_DATA_CONNECTION_OPEN_NO_TRANSFER_IN_PROGRESS(225),
112
113
114
115
116
117 REPLY_226_CLOSING_DATA_CONNECTION(226),
118
119
120
121
122 REPLY_227_ENTERING_PASSIVE_MODE(227),
123
124
125
126
127 REPLY_229_ENTERING_PASSIVE_MODE(229),
128
129
130
131
132 REPLY_230_USER_LOGGED_IN(230),
133
134
135
136
137 REPLY_250_REQUESTED_FILE_ACTION_OKAY(250),
138
139
140
141
142 REPLY_257_PATHNAME_CREATED(257),
143
144
145
146
147 REPLY_331_USER_NAME_OKAY_NEED_PASSWORD(331),
148
149
150
151
152 REPLY_332_NEED_ACCOUNT_FOR_LOGIN(332),
153
154
155
156
157 REPLY_350_REQUESTED_FILE_ACTION_PENDING_FURTHER_INFORMATION(350),
158
159
160
161
162
163 REPLY_421_SERVICE_NOT_AVAILABLE_CLOSING_CONTROL_CONNECTION(421),
164
165
166
167
168 REPLY_425_CANT_OPEN_DATA_CONNECTION(425),
169
170
171
172
173 REPLY_426_CONNECTION_CLOSED_TRANSFER_ABORTED(426),
174
175
176
177
178
179 REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN(450),
180
181
182
183
184 REPLY_451_REQUESTED_ACTION_ABORTED(451),
185
186
187
188
189 REPLY_452_REQUESTED_ACTION_NOT_TAKEN(452),
190
191
192
193
194
195 REPLY_500_SYNTAX_ERROR_COMMAND_UNRECOGNIZED(500),
196
197
198
199
200 REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS(501),
201
202
203
204
205 REPLY_502_COMMAND_NOT_IMPLEMENTED(502),
206
207
208
209
210 REPLY_503_BAD_SEQUENCE_OF_COMMANDS(503),
211
212
213
214
215 REPLY_504_COMMAND_NOT_IMPLEMENTED_FOR_THAT_PARAMETER(504),
216
217
218
219
220 REPLY_522_EXTENDED_PORT_FAILURE_UNKNOWN_NETWORK_PROTOCOL(522),
221
222
223
224
225 REPLY_530_NOT_LOGGED_IN(530),
226
227
228
229
230 REPLY_532_NEED_ACCOUNT_FOR_STORING_FILES(532),
231
232
233
234
235
236 REPLY_550_REQUESTED_ACTION_NOT_TAKEN(550),
237
238
239
240
241 REPLY_551_REQUESTED_ACTION_ABORTED_PAGE_TYPE_UNKNOWN(551),
242
243
244
245
246
247 REPLY_552_REQUESTED_FILE_ACTION_ABORTED_EXCEEDED_STORAGE(552),
248
249
250
251
252 REPLY_553_REQUESTED_ACTION_NOT_TAKEN_FILE_NAME_NOT_ALLOWED(553);
253
254
255
256
257 private int code;
258
259
260
261
262 private String mesg;
263
264
265
266
267 public static final String LF = "\n";
268
269
270
271
272 public static final String CRNUL = "\r\0";
273
274
275
276
277
278
279
280
281 public static final String CRLF = "\r\n";
282
283
284
285
286
287
288
289 private ReplyCode(int code, String mesg) {
290 this.code = code;
291 this.mesg = getFinalMsg(code, mesg);
292 }
293
294
295
296
297
298
299
300
301
302 public static String getFinalMsg(int code, String msg) {
303 StringBuilder builder = new StringBuilder();
304 builder.append(code);
305 if (msg.indexOf('\n') == -1) {
306 builder.append(' ');
307 builder.append(msg);
308 builder.append(ReplyCode.CRLF);
309 } else {
310 String[] lines = msg.split("\n");
311
312 builder.append('-');
313 builder.append(lines[0]);
314 builder.append(ReplyCode.CRLF);
315
316 for (int i = 1; i < lines.length - 1; i ++) {
317 int firstBlank = lines[i].indexOf(' ');
318 if (firstBlank > 0) {
319 String firstParam = lines[i].substring(0, firstBlank);
320 boolean isInt = false;
321 try {
322 Integer.parseInt(firstParam);
323 isInt = true;
324 } catch (NumberFormatException e) {
325
326 }
327 if (isInt) {
328 builder.append(" ");
329 }
330 }
331 builder.append(lines[i]);
332 builder.append(ReplyCode.CRLF);
333 }
334
335 builder.append(code);
336 builder.append(' ');
337 builder.append(lines[lines.length - 1]);
338 builder.append(ReplyCode.CRLF);
339 }
340 return builder.toString();
341 }
342
343
344
345
346
347
348 private ReplyCode(int code) {
349 this.code = code;
350 mesg = name().substring(6).replace('_', ' ') + ReplyCode.CRLF;
351 }
352
353
354
355
356 public int getCode() {
357 return code;
358 }
359
360
361
362
363 public String getMesg() {
364 return mesg;
365 }
366
367
368
369
370
371
372 public static ReplyCode getReplyCode(int code) throws InvalidArgumentException {
373 switch (code) {
374 case 0:
375 return REPLY_000_SPECIAL_NOSTATUS;
376 case 110:
377 return REPLY_110_RESTART_MARKER_REPLY;
378 case 120:
379 return REPLY_120_SERVICE_READY_IN_NNN_MINUTES;
380 case 125:
381 return REPLY_125_DATA_CONNECTION_ALREADY_OPEN;
382 case 150:
383 return REPLY_150_FILE_STATUS_OKAY;
384 case 200:
385 return REPLY_200_COMMAND_OKAY;
386 case 202:
387 return REPLY_202_COMMAND_NOT_IMPLEMENTED;
388 case 211:
389 return REPLY_211_SYSTEM_STATUS_REPLY;
390 case 212:
391 return REPLY_212_DIRECTORY_STATUS;
392 case 213:
393 return REPLY_213_FILE_STATUS;
394 case 214:
395 return REPLY_214_HELP_MESSAGE;
396 case 215:
397 return REPLY_215_NAME_SYSTEM_TYPE;
398 case 220:
399 return REPLY_220_SERVICE_READY;
400 case 221:
401 return REPLY_221_CLOSING_CONTROL_CONNECTION;
402 case 225:
403 return REPLY_225_DATA_CONNECTION_OPEN_NO_TRANSFER_IN_PROGRESS;
404 case 226:
405 return REPLY_226_CLOSING_DATA_CONNECTION;
406 case 227:
407 return REPLY_227_ENTERING_PASSIVE_MODE;
408 case 229:
409 return REPLY_229_ENTERING_PASSIVE_MODE;
410 case 230:
411 return REPLY_230_USER_LOGGED_IN;
412 case 250:
413 return REPLY_250_REQUESTED_FILE_ACTION_OKAY;
414 case 257:
415 return REPLY_257_PATHNAME_CREATED;
416 case 331:
417 return REPLY_331_USER_NAME_OKAY_NEED_PASSWORD;
418 case 332:
419 return REPLY_332_NEED_ACCOUNT_FOR_LOGIN;
420 case 350:
421 return REPLY_350_REQUESTED_FILE_ACTION_PENDING_FURTHER_INFORMATION;
422 case 421:
423 return REPLY_421_SERVICE_NOT_AVAILABLE_CLOSING_CONTROL_CONNECTION;
424 case 425:
425 return REPLY_425_CANT_OPEN_DATA_CONNECTION;
426 case 426:
427 return REPLY_426_CONNECTION_CLOSED_TRANSFER_ABORTED;
428 case 450:
429 return REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN;
430 case 451:
431 return REPLY_451_REQUESTED_ACTION_ABORTED;
432 case 452:
433 return REPLY_452_REQUESTED_ACTION_NOT_TAKEN;
434 case 500:
435 return REPLY_500_SYNTAX_ERROR_COMMAND_UNRECOGNIZED;
436 case 501:
437 return REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS;
438 case 502:
439 return REPLY_502_COMMAND_NOT_IMPLEMENTED;
440 case 503:
441 return REPLY_503_BAD_SEQUENCE_OF_COMMANDS;
442 case 504:
443 return REPLY_504_COMMAND_NOT_IMPLEMENTED_FOR_THAT_PARAMETER;
444 case 522:
445 return REPLY_522_EXTENDED_PORT_FAILURE_UNKNOWN_NETWORK_PROTOCOL;
446 case 530:
447 return REPLY_530_NOT_LOGGED_IN;
448 case 532:
449 return REPLY_532_NEED_ACCOUNT_FOR_STORING_FILES;
450 case 550:
451 return REPLY_550_REQUESTED_ACTION_NOT_TAKEN;
452 case 551:
453 return REPLY_551_REQUESTED_ACTION_ABORTED_PAGE_TYPE_UNKNOWN;
454 case 552:
455 return REPLY_552_REQUESTED_FILE_ACTION_ABORTED_EXCEEDED_STORAGE;
456 case 553:
457 return REPLY_553_REQUESTED_ACTION_NOT_TAKEN_FILE_NAME_NOT_ALLOWED;
458 default:
459 throw new InvalidArgumentException("Unknown ReplyCode "+code);
460 }
461 }
462 }