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