1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package openr66.context.task;
21
22 import java.sql.Timestamp;
23 import java.util.Calendar;
24 import java.util.Date;
25
26 import goldengate.common.logging.GgInternalLogger;
27 import goldengate.common.logging.GgInternalLoggerFactory;
28 import openr66.context.ErrorCode;
29 import openr66.context.R66Result;
30 import openr66.context.R66Session;
31 import openr66.context.task.exception.OpenR66RunnerErrorException;
32 import openr66.database.data.DbTaskRunner;
33
34
35
36
37
38
39
40
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
80
81
82
83
84
85
86 public class RescheduleTransferTask extends AbstractTask {
87
88
89
90 private static final GgInternalLogger logger = GgInternalLoggerFactory
91 .getLogger(RescheduleTransferTask.class);
92
93 protected long newdate = 0;
94
95 protected Calendar newDate = null;
96
97
98
99
100
101
102
103 public RescheduleTransferTask(String argRule, int delay,
104 String argTransfer, R66Session session) {
105 super(TaskType.RESCHEDULE, delay, argRule, argTransfer, session);
106 }
107
108
109
110
111
112
113 @Override
114 public void run() {
115 logger.info("Reschedule with " + argRule + ":" + argTransfer +
116 " and {}", session);
117 DbTaskRunner runner = session.getRunner();
118 if (runner == null) {
119 futureCompletion.setFailure(new OpenR66RunnerErrorException(
120 "No valid runner in Reschedule"));
121 return;
122 }
123 if (runner.isRescheduledTransfer()) {
124
125 R66Result result = new R66Result(session, false, ErrorCode.Warning,
126 runner);
127 futureCompletion.setResult(result);
128 logger.warn("Transfer already Rescheduled: "+runner.toShortString());
129 futureCompletion.setSuccess();
130 return;
131 }
132 if (runner.isSelfRequested()) {
133
134 R66Result result = new R66Result(session, false, ErrorCode.LoopSelfRequestedHost,
135 runner);
136 futureCompletion.setResult(result);
137 futureCompletion.setFailure(new OpenR66RunnerErrorException(
138 "No valid runner in Reschedule since Self Requested"));
139 return;
140 }
141 String finalname = argRule;
142 finalname = getReplacedValue(finalname, argTransfer.split(" "));
143 String[] args = finalname.split(" ");
144 if (args.length < 4) {
145 R66Result result = new R66Result(session, false, ErrorCode.Warning,
146 runner);
147 futureCompletion.setResult(result);
148 logger.warn("Not enough argument in Reschedule: "+runner.toShortString());
149 futureCompletion.setSuccess();
150 return;
151 }
152 if (!validateArgs(args)) {
153 R66Result result = new R66Result(session, false, ErrorCode.Warning,
154 runner);
155 futureCompletion.setResult(result);
156 logger.warn("Reschedule unallowed due to argument: "+runner.toShortString());
157 futureCompletion.setSuccess();
158 return;
159 }
160 Timestamp start = new Timestamp(newdate);
161 try {
162 runner.setStart(start);
163 } catch (OpenR66RunnerErrorException e) {
164 logger.error(
165 "Prepare transfer in\n FAILURE\n " +
166 runner.toShortString() + "\n <AT>" +
167 (new Date(newdate)).toString() + "</AT>", e);
168 futureCompletion.setFailure(new OpenR66RunnerErrorException(
169 "Reschedule failed: " + e.getMessage(), e));
170 return;
171 }
172 runner.setRescheduledTransfer();
173 R66Result result = new R66Result(session, false, ErrorCode.Warning,
174 runner);
175 futureCompletion.setResult(result);
176 logger.warn("Reschedule transfer in\n SUCCESS\n " +
177 runner.toShortString() + "\n <AT>" +
178 (new Date(newdate)).toString() + "</AT>");
179 futureCompletion.setSuccess();
180 }
181
182 protected boolean validateArgs(String[] args) {
183 boolean validCode = false;
184 for (int i = 0; i < args.length; i ++) {
185 if (args[i].equalsIgnoreCase("-delay")) {
186 i ++;
187 try {
188 newdate = Long.parseLong(args[i]);
189 } catch (NumberFormatException e) {
190 logger.warn("Bad Long format: args[i]");
191 return false;
192 }
193 } else if (args[i].equalsIgnoreCase("-case")) {
194 i ++;
195 if (!validCode) {
196 String[] codes = args[i].split(",");
197 for (int j = 0; j < codes.length; j ++) {
198 ErrorCode code = ErrorCode.getFromCode(codes[j]);
199 if (session.getLocalChannelReference().getCurrentCode() == code) {
200 logger.debug("Code valid: "+code);
201 validCode = true;
202 }
203 }
204 }
205 }
206 }
207
208 if (!validCode) {
209 logger.warn("No valid Code found");
210 return false;
211 }
212 if (newdate <= 0) {
213 logger.warn("Delay is negative: "+newdate);
214 return false;
215 }
216 newdate += System.currentTimeMillis();
217 newDate = Calendar.getInstance();
218 newDate.setTimeInMillis(newdate);
219 boolean betweenTest = false;
220 boolean betweenResult = false;
221 for (int i = 0; i < args.length; i ++) {
222 if (args[i].equalsIgnoreCase("-notbetween")) {
223 i ++;
224 String[] elmts = args[i].split(";");
225 boolean startModified = false;
226 String[] values = elmts[0].split(":");
227 Calendar start = getCalendar(values);
228 if (start != null) {
229 startModified = true;
230 } else {
231 start = Calendar.getInstance();
232 }
233 boolean stopModified = false;
234 values = elmts[1].split(":");
235 Calendar stop = getCalendar(values);
236 if (stop != null) {
237 stopModified = true;
238 } else {
239 stop = Calendar.getInstance();
240 }
241 logger.debug("Dates before check: Not between "+start.getTime()+" and "+stop.getTime());
242
243 if (start.compareTo(stop) > 0) {
244
245 stop.add(Calendar.DAY_OF_MONTH, 1);
246 }
247
248 if (start.compareTo(newDate) < 0) {
249 start.add(Calendar.DAY_OF_MONTH, 1);
250 stop.add(Calendar.DAY_OF_MONTH, 1);
251 }
252 logger.debug("Dates after check: Not between "+start.getTime()+" and "+stop.getTime());
253 if (!startModified) {
254 if (newDate.compareTo(stop) < 0) {
255 logger.debug("newDate: "+newDate.getTime()+" Should not be between "+start.getTime()+" and "+stop.getTime());
256 return false;
257 }
258 } else if (start.compareTo(newDate) < 0) {
259 if ((!stopModified) || (newDate.compareTo(stop) < 0)) {
260 logger.debug("newDate: "+newDate.getTime()+" Should not be between "+start.getTime()+" and "+stop.getTime());
261 return false;
262 }
263 }
264 } else if (args[i].equalsIgnoreCase("-between")) {
265 i ++;
266 betweenTest = true;
267 String[] elmts = args[i].split(";");
268 boolean startModified = false;
269 String[] values = elmts[0].split(":");
270 Calendar start = getCalendar(values);
271 if (start != null) {
272 startModified = true;
273 } else {
274 start = Calendar.getInstance();
275 }
276 boolean stopModified = false;
277 values = elmts[1].split(":");
278 Calendar stop = getCalendar(values);
279 if (stop != null) {
280 stopModified = true;
281 } else {
282 stop = Calendar.getInstance();
283 }
284 logger.debug("Dates before check: Between "+start.getTime()+" and "+stop.getTime());
285
286 if (start.compareTo(stop) > 0) {
287
288 stop.add(Calendar.DAY_OF_MONTH, 1);
289 }
290
291 if (start.compareTo(newDate) < 0) {
292 start.add(Calendar.DAY_OF_MONTH, 1);
293 stop.add(Calendar.DAY_OF_MONTH, 1);
294 }
295 logger.debug("Dates before check: Between "+start.getTime()+" and "+stop.getTime());
296 if (!startModified) {
297 if (newDate.compareTo(stop) < 0) {
298 logger.debug("newDate: "+newDate.getTime()+" is between "+start.getTime()+" and "+stop.getTime());
299 betweenResult = true;
300 }
301 } else if (start.compareTo(newDate) < 0) {
302 if ((!stopModified) || (newDate.compareTo(stop) < 0)) {
303 logger.debug("newDate: "+newDate.getTime()+" is between "+start.getTime()+" and "+stop.getTime());
304 betweenResult = true;
305 }
306 }
307 }
308 }
309 if (betweenTest) {
310 logger.debug("Since between is specified, do we found newDate: "+newDate.getTime()+" Result: "+betweenResult);
311 return betweenResult;
312 }
313 logger.debug("newDate: "+newDate.getTime()+" rescheduled");
314 return true;
315 }
316
317
318
319
320
321
322
323
324
325
326 private Calendar getCalendar(String[] values) {
327 Calendar newcal = Calendar.getInstance();
328 boolean isModified = false;
329 for (int j = 0; j < values.length; j ++) {
330 if (values[j].length() > 1) {
331 int addvalue = 0;
332 int value = -1;
333 switch (values[j].charAt(0)) {
334 case '+':
335 try {
336 addvalue = Integer.parseInt(values[j].substring(2));
337 } catch (NumberFormatException e) {
338 continue;
339 }
340 break;
341 case '-':
342 try {
343 addvalue = Integer.parseInt(values[j].substring(1));
344 } catch (NumberFormatException e) {
345 continue;
346 }
347 break;
348 case '=':
349 try {
350 value = Integer.parseInt(values[j].substring(2));
351 } catch (NumberFormatException e) {
352 continue;
353 }
354 break;
355 default:
356 try {
357 value = Integer.parseInt(values[j].substring(1));
358 } catch (NumberFormatException e) {
359 continue;
360 }
361 }
362 switch (values[j].charAt(0)) {
363 case 'Y':
364 if (value >= 0) {
365 newcal.set(Calendar.YEAR, value);
366 } else {
367 newcal.add(Calendar.YEAR, addvalue);
368 }
369 isModified = true;
370 break;
371 case 'M':
372 if (value >= 0) {
373 newcal.set(Calendar.MONTH, value);
374 } else {
375 newcal.add(Calendar.MONTH, addvalue);
376 }
377 isModified = true;
378 break;
379 case 'D':
380 if (value >= 0) {
381 newcal.set(Calendar.DAY_OF_MONTH, value);
382 } else {
383 newcal.add(Calendar.DAY_OF_MONTH, addvalue);
384 }
385 isModified = true;
386 break;
387 case 'H':
388 if (value >= 0) {
389 newcal.set(Calendar.HOUR_OF_DAY, value);
390 } else {
391 newcal.add(Calendar.HOUR_OF_DAY, addvalue);
392 }
393 isModified = true;
394 break;
395 case 'm':
396 if (value >= 0) {
397 newcal.set(Calendar.MINUTE, value);
398 } else {
399 newcal.add(Calendar.MINUTE, addvalue);
400 }
401 isModified = true;
402 break;
403 case 'S':
404 if (value >= 0) {
405 newcal.set(Calendar.SECOND, value);
406 } else {
407 newcal.add(Calendar.SECOND, addvalue);
408 }
409 isModified = true;
410 break;
411 }
412 }
413 }
414 if (isModified) return newcal;
415 return null;
416 }
417 }