1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.ftp.core.data;
21
22 import org.waarp.common.command.ReplyCode;
23 import org.waarp.common.logging.WaarpLogger;
24 import org.waarp.common.logging.WaarpLoggerFactory;
25 import org.waarp.ftp.core.command.FtpCommandCode;
26 import org.waarp.ftp.core.exception.FtpNoConnectionException;
27 import org.waarp.ftp.core.exception.FtpNoFileException;
28 import org.waarp.ftp.core.session.FtpSession;
29
30 import java.util.List;
31
32
33
34
35 class FtpTransferExecutor implements Runnable {
36
37
38
39 private static final WaarpLogger logger =
40 WaarpLoggerFactory.getLogger(FtpTransferExecutor.class);
41
42
43
44
45 private final FtpSession session;
46
47
48
49
50 private final FtpTransfer executeTransfer;
51
52
53
54
55
56
57
58 FtpTransferExecutor(final FtpSession session,
59 final FtpTransfer executeTransfer) {
60 this.session = session;
61 this.executeTransfer = executeTransfer;
62 if (this.executeTransfer == null) {
63 this.session.getDataConn().getFtpTransferControl().setEndOfTransfer();
64 logger.error("No Execution to do");
65 }
66 }
67
68
69
70
71 @Override
72 public void run() {
73 if (executeTransfer == null) {
74 session.getDataConn().getFtpTransferControl().setEndOfTransfer();
75 logger.error("No Execution to do");
76 return;
77 }
78 try {
79 runNextCommand();
80 } catch (final InterruptedException e) {
81 logger.error("Executor Interrupted: {}", e.getMessage(), e);
82 }
83 }
84
85
86
87
88
89
90 private void runNextCommand() throws InterruptedException {
91 if (FtpCommandCode.isStoreLikeCommand(executeTransfer.getCommand())) {
92
93 waitForCommand();
94
95 try {
96 session.getDataConn().getFtpTransferControl().setEndOfTransfer();
97 } catch (final NullPointerException e) {
98
99 }
100 } else if (FtpCommandCode.isListLikeCommand(executeTransfer.getCommand())) {
101
102 final List<String> list = executeTransfer.getInfo();
103 final StringBuilder builder = new StringBuilder();
104 for (final String newfileInfo : list) {
105 builder.append(newfileInfo).append(ReplyCode.CRLF);
106 }
107 if (builder.length() == 0) {
108 builder.append(ReplyCode.CRLF);
109 }
110 final String message = builder.toString();
111 boolean status = false;
112 try {
113 status =
114 session.getDataConn().getDataNetworkHandler().writeMessage(message);
115 } catch (final FtpNoConnectionException e) {
116 logger.error("No Connection but should not be!", e);
117 }
118
119 executeTransfer.setStatus(status);
120
121 session.getDataConn().getFtpTransferControl().setEndOfTransfer();
122 } else if (FtpCommandCode.isRetrLikeCommand(executeTransfer.getCommand())) {
123
124 try {
125 executeTransfer.getFtpFile().trueRetrieve();
126 } catch (final FtpNoFileException e) {
127
128 logger.error(e);
129 session.getDataConn().getFtpTransferControl().setEndOfTransfer();
130 }
131 logger.debug("wait for end of command");
132 waitForCommand();
133 logger.debug("RETR ending");
134
135 try {
136 session.getDataConn().getFtpTransferControl().setEndOfTransfer();
137 } catch (final NullPointerException e) {
138
139 }
140 } else {
141
142 session.getDataConn().getFtpTransferControl().setEndOfTransfer();
143 }
144 }
145
146
147
148
149
150
151 private void waitForCommand() throws InterruptedException {
152 session.getDataConn().getFtpTransferControl().waitForEndOfTransfer();
153 }
154 }