1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.waarp.gateway.ftp.exec;
23
24 import org.waarp.common.command.exception.CommandAbstractException;
25 import org.waarp.common.command.exception.Reply421Exception;
26 import org.waarp.common.database.data.AbstractDbData.UpdatedInfo;
27 import org.waarp.common.database.exception.WaarpDatabaseException;
28 import org.waarp.common.future.WaarpFuture;
29 import org.waarp.common.logging.WaarpLogger;
30 import org.waarp.common.logging.WaarpLoggerFactory;
31 import org.waarp.openr66.client.TransferArgs;
32 import org.waarp.openr66.database.data.DbRule;
33 import org.waarp.openr66.database.data.DbTaskRunner;
34 import org.waarp.openr66.protocol.configuration.PartnerConfiguration;
35 import org.waarp.openr66.protocol.localhandler.packet.RequestPacket;
36
37 import java.io.File;
38
39 import static org.waarp.common.database.DbConstant.*;
40 import static org.waarp.common.file.filesystembased.FilesystemBasedFileImpl.*;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 public class R66PreparedTransferExecutor extends AbstractExecutor {
80 private static final String CANNOT_GET_NEW_TASK = "Cannot get new task\n ";
81
82
83
84
85 private static final WaarpLogger logger =
86 WaarpLoggerFactory.getLogger(R66PreparedTransferExecutor.class);
87
88 protected final WaarpFuture future;
89 protected final TransferArgs transferArgs;
90
91 protected boolean nolog;
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 public R66PreparedTransferExecutor(final String command, final long delay,
117 final WaarpFuture futureCompletion) {
118 final String[] args = BLANK.split(command);
119 transferArgs = TransferArgs.getParamsInternal(0, args, false);
120 if (transferArgs != null) {
121 TransferArgs.getAllInfo(transferArgs, 0, args, null);
122 nolog = transferArgs.isNolog();
123 }
124 future = futureCompletion;
125 }
126
127 @Override
128 public final void run() throws CommandAbstractException {
129 if (transferArgs == null) {
130 logger.error(
131 "Mandatory argument is missing: -to -rule -file or -to -id");
132 throw new Reply421Exception(
133 "Mandatory argument is missing: -to -rule -file or -to -id");
134 }
135 if (transferArgs.getRemoteHost() == null ||
136 transferArgs.getRulename() == null ||
137 transferArgs.getFilename() == null) {
138 logger.error(
139 "Mandatory argument is missing: -to " + transferArgs.getRemoteHost() +
140 " -rule " + transferArgs.getRulename() + " -file " +
141 transferArgs.getFilename());
142 throw new Reply421Exception("Mandatory argument is missing");
143 }
144 final String message =
145 "R66Prepared with -to " + transferArgs.getRemoteHost() + " -rule " +
146 transferArgs.getRulename() + " -file " + transferArgs.getFilename() +
147 " -nolog: " + nolog + " -isMD5: " + transferArgs.isMD5() + " -info " +
148 transferArgs.getTransferInfo();
149 logger.debug(message);
150 final DbRule rule;
151 try {
152 rule = new DbRule(transferArgs.getRulename());
153 } catch (final WaarpDatabaseException e) {
154 logger.error("Cannot get Rule: {} since {}\n {}",
155 transferArgs.getRulename(), e.getMessage(), message);
156 throw new Reply421Exception(
157 "Cannot get Rule: " + transferArgs.getRulename() + "\n " +
158 message);
159 }
160 int mode = rule.getMode();
161 if (transferArgs.isMD5()) {
162 mode = RequestPacket.getModeMD5(mode);
163 }
164 final String sep =
165 PartnerConfiguration.getSeparator(transferArgs.getRemoteHost());
166 long originalSize = -1;
167 if (RequestPacket.isSendMode(mode) && !RequestPacket.isThroughMode(mode)) {
168 final File file = new File(transferArgs.getFilename());
169 if (canRead(file)) {
170 originalSize = file.length();
171 }
172 }
173 final RequestPacket request =
174 new RequestPacket(transferArgs.getRulename(), mode,
175 transferArgs.getFilename(),
176 transferArgs.getBlockSize(), 0, ILLEGALVALUE,
177 transferArgs.getTransferInfo(), originalSize, sep);
178
179 final boolean isRetrieve = !RequestPacket.isRecvMode(request.getMode());
180 logger.debug("Will prepare: {}", request);
181 final DbTaskRunner taskRunner;
182 try {
183 taskRunner = new DbTaskRunner(rule, isRetrieve, request,
184 transferArgs.getRemoteHost(),
185 transferArgs.getStartTime());
186 } catch (final WaarpDatabaseException e) {
187 logger.error("Cannot get new task since {}\n {}", e.getMessage(),
188 message);
189 throw new Reply421Exception(CANNOT_GET_NEW_TASK + message);
190 }
191 taskRunner.changeUpdatedInfo(UpdatedInfo.TOSUBMIT);
192 if (!taskRunner.forceSaveStatus()) {
193 try {
194 if (!taskRunner.specialSubmit()) {
195 logger.error("Cannot prepare task: " + message);
196 throw new Reply421Exception(CANNOT_GET_NEW_TASK + message);
197 }
198 } catch (final WaarpDatabaseException e) {
199 logger.error("Cannot prepare task since {}\n {}", e.getMessage(),
200 message);
201 throw new Reply421Exception(CANNOT_GET_NEW_TASK + message);
202 }
203 }
204 logger.debug("R66PreparedTransfer prepared: {}", request);
205 future.setSuccess();
206 }
207 }