1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.waarp.openr66.dao.database;
22
23 import org.waarp.common.database.exception.WaarpDatabaseSqlException;
24 import org.waarp.common.guid.LongUuid;
25 import org.waarp.openr66.context.ErrorCode;
26 import org.waarp.openr66.dao.Filter;
27 import org.waarp.openr66.dao.TransferDAO;
28 import org.waarp.openr66.dao.exception.DAOConnectionException;
29 import org.waarp.openr66.dao.exception.DAONoDataException;
30 import org.waarp.openr66.pojo.Transfer;
31 import org.waarp.openr66.pojo.UpdatedInfo;
32 import org.waarp.openr66.protocol.configuration.Configuration;
33
34 import java.sql.Connection;
35 import java.sql.PreparedStatement;
36 import java.sql.ResultSet;
37 import java.sql.SQLException;
38 import java.util.ArrayList;
39 import java.util.List;
40
41 import static org.waarp.openr66.database.DbConstantR66.*;
42
43
44
45
46 public abstract class DBTransferDAO extends StatementExecutor<Transfer>
47 implements TransferDAO {
48
49 private static final String LIMIT2 = " LIMIT ";
50
51
52 protected static final String TABLE = "runner";
53
54
55 public static final String ID_FIELD = "specialid";
56 public static final String GLOBAL_STEP_FIELD = "globalstep";
57 public static final String GLOBAL_LAST_STEP_FIELD = "globallaststep";
58 public static final String STEP_FIELD = "step";
59 public static final String RANK_FIELD = "rank";
60 public static final String STEP_STATUS_FIELD = "stepstatus";
61 public static final String RETRIEVE_MODE_FIELD = "retrievemode";
62 public static final String FILENAME_FIELD = "filename";
63 public static final String IS_MOVED_FIELD = "ismoved";
64 public static final String ID_RULE_FIELD = "idrule";
65 public static final String BLOCK_SIZE_FIELD = "blocksz";
66 public static final String ORIGINAL_NAME_FIELD = "originalname";
67 public static final String FILE_INFO_FIELD = "fileinfo";
68 public static final String TRANSFER_INFO_FIELD = "transferinfo";
69 public static final String TRANSFER_MODE_FIELD = "modetrans";
70 public static final String TRANSFER_START_FIELD = "starttrans";
71 public static final String TRANSFER_STOP_FIELD = "stoptrans";
72 public static final String INFO_STATUS_FIELD = "infostatus";
73 public static final String OWNER_REQUEST_FIELD = "ownerreq";
74 public static final String REQUESTED_FIELD = "requested";
75 public static final String REQUESTER_FIELD = "requester";
76 public static final String UPDATED_INFO_FIELD = "updatedInfo";
77
78
79 protected static final String PRIMARY_KEY_WHERE =
80 REQUESTED_FIELD + " = ? AND " + REQUESTER_FIELD + " = ? AND " +
81 OWNER_REQUEST_FIELD + " = ? AND " + ID_FIELD + " = ? ";
82 protected static final String SQL_DELETE =
83 "DELETE FROM " + TABLE + WHERE + PRIMARY_KEY_WHERE;
84 protected static final String SQL_DELETE_ALL = "DELETE FROM " + TABLE;
85 protected static final String SQL_EXIST =
86 "SELECT 1 FROM " + TABLE + WHERE + PRIMARY_KEY_WHERE;
87 protected static final String SQL_GET_ALL = "SELECT * FROM " + TABLE;
88 protected static final String SQL_COUNT_ALL = SQL_COUNT_ALL_PREFIX + TABLE;
89 protected static final String SQL_INSERT =
90 "INSERT INTO " + TABLE + " (" + ID_FIELD + ", " + GLOBAL_STEP_FIELD +
91 ", " + GLOBAL_LAST_STEP_FIELD + ", " + STEP_FIELD + ", " + RANK_FIELD +
92 ", " + BLOCK_SIZE_FIELD + ", " + TRANSFER_MODE_FIELD + ", " +
93 UPDATED_INFO_FIELD + ", " + STEP_STATUS_FIELD + ", " + INFO_STATUS_FIELD +
94 ", " + RETRIEVE_MODE_FIELD + ", " + IS_MOVED_FIELD + ", " +
95 TRANSFER_START_FIELD + ", " + TRANSFER_STOP_FIELD + ", " +
96 OWNER_REQUEST_FIELD + ", " + REQUESTED_FIELD + ", " + REQUESTER_FIELD +
97 ", " + ID_RULE_FIELD + ", " + FILENAME_FIELD + ", " +
98 ORIGINAL_NAME_FIELD + ", " + FILE_INFO_FIELD + ", " +
99 TRANSFER_INFO_FIELD +
100 ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
101 protected static final String SQL_SELECT =
102 "SELECT * FROM " + TABLE + WHERE + PRIMARY_KEY_WHERE;
103 protected static final String SQL_UPDATE =
104 "UPDATE " + TABLE + " SET " + ID_FIELD + PARAMETER_COMMA +
105 GLOBAL_STEP_FIELD + PARAMETER_COMMA + GLOBAL_LAST_STEP_FIELD +
106 PARAMETER_COMMA + STEP_FIELD + PARAMETER_COMMA + RANK_FIELD +
107 PARAMETER_COMMA + BLOCK_SIZE_FIELD + PARAMETER_COMMA +
108 TRANSFER_MODE_FIELD + PARAMETER_COMMA + UPDATED_INFO_FIELD +
109 PARAMETER_COMMA + STEP_STATUS_FIELD + PARAMETER_COMMA +
110 INFO_STATUS_FIELD + PARAMETER_COMMA + RETRIEVE_MODE_FIELD +
111 PARAMETER_COMMA + IS_MOVED_FIELD + PARAMETER_COMMA +
112 TRANSFER_START_FIELD + PARAMETER_COMMA + TRANSFER_STOP_FIELD +
113 PARAMETER_COMMA + OWNER_REQUEST_FIELD + PARAMETER_COMMA +
114 REQUESTER_FIELD + PARAMETER_COMMA + REQUESTED_FIELD + PARAMETER_COMMA +
115 ID_RULE_FIELD + PARAMETER_COMMA + FILENAME_FIELD + PARAMETER_COMMA +
116 ORIGINAL_NAME_FIELD + PARAMETER_COMMA + FILE_INFO_FIELD +
117 PARAMETER_COMMA + TRANSFER_INFO_FIELD + " = ? WHERE " +
118 PRIMARY_KEY_WHERE;
119 private static final String SQL_UPDATE_LIMITED_RANK =
120 "UPDATE " + TABLE + " SET " + RANK_FIELD + PARAMETER_COMMA +
121 TRANSFER_STOP_FIELD + " = ? WHERE " + PRIMARY_KEY_WHERE;
122
123 private static final String
124 SQL_UPDATE_LIMITED_RANK_STOP_UPDATEDINFO_STEPSTATUS =
125 "UPDATE " + TABLE + " SET " + RANK_FIELD + PARAMETER_COMMA +
126 TRANSFER_STOP_FIELD + PARAMETER_COMMA + UPDATED_INFO_FIELD +
127 PARAMETER_COMMA + STEP_STATUS_FIELD + PARAMETER_COMMA +
128 INFO_STATUS_FIELD + PARAMETER_COMMA + GLOBAL_STEP_FIELD +
129 PARAMETER_COMMA + GLOBAL_LAST_STEP_FIELD + PARAMETER_COMMA + STEP_FIELD +
130 " = ? " + "WHERE " + PRIMARY_KEY_WHERE;
131
132 @Override
133 protected final String getDeleteRequest() {
134 return SQL_DELETE;
135 }
136
137 @Override
138 protected final String getDeleteAllRequest() {
139 return SQL_DELETE_ALL;
140 }
141
142 @Override
143 protected final String getExistRequest() {
144 return SQL_EXIST;
145 }
146
147 @Override
148 protected final String getGetAllRequest() {
149 return SQL_GET_ALL;
150 }
151
152 @Override
153 protected final String getInsertRequest() {
154 return SQL_INSERT;
155 }
156
157 @Override
158 protected final String getSelectRequest() {
159 return SQL_SELECT;
160 }
161
162 @Override
163 protected final String getCountRequest() {
164 return SQL_COUNT_ALL;
165 }
166
167 @Override
168 protected final String getUpdateRequest() {
169 return SQL_UPDATE;
170 }
171
172 @Override
173 protected final String getTable() {
174 return TABLE;
175 }
176
177 final String getUpdateLimitedRankRequest() {
178 return SQL_UPDATE_LIMITED_RANK;
179 }
180
181 final String getUpdateRankUpdatedInfoStepStatusStopRequest() {
182 return SQL_UPDATE_LIMITED_RANK_STOP_UPDATEDINFO_STEPSTATUS;
183 }
184
185 protected DBTransferDAO(final Connection con) {
186 super(con);
187 }
188
189 @Override
190 protected final boolean isCachedEnable() {
191 return false;
192 }
193
194 @Override
195 protected final Object[] getInsertValues(final Transfer transfer) {
196 return new Object[] {
197 transfer.getId(), transfer.getGlobalStep().ordinal(),
198 transfer.getLastGlobalStep().ordinal(), transfer.getStep(),
199 transfer.getRank(), transfer.getBlockSize(), transfer.getTransferMode(),
200 transfer.getUpdatedInfo().ordinal(), transfer.getStepStatus().getCode(),
201 transfer.getInfoStatus().getCode(), transfer.getRetrieveMode(),
202 transfer.getIsMoved(), transfer.getStart(), transfer.getStop(),
203 transfer.getOwnerRequest(), transfer.getRequested(),
204 transfer.getRequester(), transfer.getRule(), transfer.getFilename(),
205 transfer.getOriginalName(), transfer.getFileInfo(),
206 transfer.getTransferInfo()
207 };
208 }
209
210 @Override
211 protected final Object[] getUpdateValues(final Transfer transfer) {
212 final Object[] objects = new Object[] {
213 transfer.getId(), transfer.getGlobalStep().ordinal(),
214 transfer.getLastGlobalStep().ordinal(), transfer.getStep(),
215 transfer.getRank(), transfer.getBlockSize(), transfer.getTransferMode(),
216 transfer.getUpdatedInfo().ordinal(), transfer.getStepStatus().getCode(),
217 transfer.getInfoStatus().getCode(), transfer.getRetrieveMode(),
218 transfer.getIsMoved(), transfer.getStart(), transfer.getStop(),
219 transfer.getOwnerRequest(), transfer.getRequester(),
220 transfer.getRequested(), transfer.getRule(), transfer.getFilename(),
221 transfer.getOriginalName(), transfer.getFileInfo(),
222 transfer.getTransferInfo(), null, null, null, null
223 };
224 setPrimaryKeyValues(objects, transfer);
225 return objects;
226 }
227
228 final Object[] getUpdateLimitedRankValues(final Transfer transfer) {
229 final Object[] objects = new Object[] {
230 transfer.getRank(), transfer.getStop(), null, null, null, null
231 };
232 setPrimaryKeyValues(objects, transfer);
233 return objects;
234 }
235
236 final Object[] getUpdateRankUpdatedInfoStepStatusStopValues(
237 final Transfer transfer) {
238 final Object[] objects = new Object[] {
239 transfer.getRank(), transfer.getStop(),
240 transfer.getUpdatedInfo().ordinal(), transfer.getStepStatus().getCode(),
241 transfer.getInfoStatus().getCode(), transfer.getGlobalStep().ordinal(),
242 transfer.getLastGlobalStep().ordinal(), transfer.getStep(), null, null,
243 null, null
244 };
245 setPrimaryKeyValues(objects, transfer);
246 return objects;
247 }
248
249 final void setPrimaryKeyValues(final Object[] objects,
250 final Transfer transfer) {
251 int pos = objects.length - 4;
252 objects[pos++] = transfer.getRequested();
253 objects[pos++] = transfer.getRequester();
254 objects[pos++] = transfer.getOwnerRequest();
255 objects[pos] = transfer.getId();
256 }
257
258 final Object[] getPrimaryKeyValues(final Transfer transfer) {
259 return new Object[] {
260 transfer.getRequested(), transfer.getRequester(),
261 transfer.getOwnerRequest(), transfer.getId()
262 };
263 }
264
265 final Object[] getPrimaryKeyValues(final long id, final String owner,
266 final String requester,
267 final String requested) {
268 return new Object[] { requested, requester, owner, id };
269 }
270
271 public final void updateRank(final Transfer e1)
272 throws DAOConnectionException, DAONoDataException {
273 final Object[] params = getUpdateLimitedRankValues(e1);
274
275 PreparedStatement stm = null;
276 try {
277 stm = connection.prepareStatement(getUpdateLimitedRankRequest());
278 setParameters(stm, params);
279 try {
280 executeUpdate(stm);
281 } catch (final SQLException e2) {
282 throw new DAONoDataException(e2);
283 }
284 } catch (final SQLException e) {
285 throw new DAOConnectionException(e);
286 } finally {
287 closeStatement(stm);
288 }
289 }
290
291 public final void updateRankUpdatedInfoStepStatusStop(final Transfer e1)
292 throws DAOConnectionException, DAONoDataException {
293 final Object[] params = getUpdateRankUpdatedInfoStepStatusStopValues(e1);
294
295 PreparedStatement stm = null;
296 try {
297 stm = connection.prepareStatement(
298 getUpdateRankUpdatedInfoStepStatusStopRequest());
299 setParameters(stm, params);
300 try {
301 executeUpdate(stm);
302 } catch (final SQLException e2) {
303 throw new DAONoDataException(e2);
304 }
305 } catch (final SQLException e) {
306 throw new DAOConnectionException(e);
307 } finally {
308 closeStatement(stm);
309 }
310 }
311
312 @Override
313 public final void delete(final Transfer transfer)
314 throws DAOConnectionException, DAONoDataException {
315 PreparedStatement stm = null;
316 final Object[] params = getPrimaryKeyValues(transfer);
317 try {
318 stm = connection.prepareStatement(getDeleteRequest());
319 setParameters(stm, params);
320 try {
321 executeAction(stm);
322 } catch (final SQLException e2) {
323 throw new DAONoDataException(e2);
324 }
325 } catch (final SQLException e) {
326 throw new DAOConnectionException(e);
327 } finally {
328 closeStatement(stm);
329 }
330 }
331
332 @Override
333 public final List<Transfer> find(final List<Filter> filters, final int limit,
334 final int offset)
335 throws DAOConnectionException {
336 final ArrayList<Transfer> transfers = new ArrayList<Transfer>();
337
338 final Object[] params = prepareFindParams(filters);
339 final StringBuilder query =
340 new StringBuilder(prepareFindQuery(filters, params));
341
342 if (limit > 0) {
343 query.append(LIMIT2).append(limit);
344 }
345
346 if (offset > 0) {
347 query.append(" OFFSET ").append(offset);
348 }
349
350 PreparedStatement stm = null;
351 ResultSet res = null;
352 try {
353 stm = connection.prepareStatement(query.toString());
354 setParameters(stm, params);
355 res = executeQuery(stm);
356 while (res.next()) {
357 transfers.add(getFromResultSet(res));
358 }
359 } catch (final SQLException e) {
360 throw new DAOConnectionException(e);
361 } finally {
362 closeResultSet(res);
363 closeStatement(stm);
364 }
365 return transfers;
366 }
367
368 @Override
369 public final boolean exist(final long id, final String requester,
370 final String requested, final String owner)
371 throws DAOConnectionException {
372 PreparedStatement stm = null;
373 ResultSet res = null;
374 final Object[] params =
375 getPrimaryKeyValues(id, owner, requester, requested);
376 try {
377 stm = connection.prepareStatement(getExistRequest());
378 setParameters(stm, params);
379 res = executeQuery(stm);
380 return res.next();
381 } catch (final SQLException e) {
382 throw new DAOConnectionException(e);
383 } finally {
384 closeResultSet(res);
385 closeStatement(stm);
386 }
387 }
388
389 @Override
390 public final Transfer select(final long id, final String requester,
391 final String requested, final String owner)
392 throws DAOConnectionException, DAONoDataException {
393 PreparedStatement stm = null;
394 ResultSet res = null;
395 final Object[] params =
396 getPrimaryKeyValues(id, owner, requester, requested);
397 try {
398 stm = connection.prepareStatement(getSelectRequest());
399 setParameters(stm, params);
400 res = executeQuery(stm);
401 if (res.next()) {
402 return getFromResultSet(res);
403 } else {
404 throw new DAONoDataException("No " + getClass().getName() + " found");
405 }
406 } catch (final SQLException e) {
407 throw new DAOConnectionException(e);
408 } finally {
409 closeResultSet(res);
410 closeStatement(stm);
411 }
412 }
413
414 protected abstract long getNextId() throws DAOConnectionException;
415
416 @Override
417 public final void insert(final Transfer transfer)
418 throws DAOConnectionException {
419 if (transfer.getId() == ILLEGALVALUE) {
420 if (Configuration.configuration.isTransferGuid()) {
421 transfer.setId(LongUuid.getLongUuid());
422 } else {
423 transfer.setId(getNextId());
424 }
425 }
426 super.insert(transfer);
427 }
428
429 @Override
430 protected final boolean isDbTransfer() {
431 return true;
432 }
433
434 @Override
435 public final Transfer getFromResultSet(final ResultSet set)
436 throws SQLException {
437 try {
438 return new Transfer(set.getLong(ID_FIELD), set.getString(ID_RULE_FIELD),
439 set.getInt(TRANSFER_MODE_FIELD),
440 set.getString(FILENAME_FIELD),
441 set.getString(ORIGINAL_NAME_FIELD),
442 set.getString(FILE_INFO_FIELD),
443 set.getBoolean(IS_MOVED_FIELD),
444 set.getInt(BLOCK_SIZE_FIELD),
445 set.getBoolean(RETRIEVE_MODE_FIELD),
446 set.getString(OWNER_REQUEST_FIELD),
447 set.getString(REQUESTER_FIELD),
448 set.getString(REQUESTED_FIELD),
449 set.getString(TRANSFER_INFO_FIELD),
450 Transfer.TASKSTEP.valueOf(
451 set.getInt(GLOBAL_STEP_FIELD)),
452 Transfer.TASKSTEP.valueOf(
453 set.getInt(GLOBAL_LAST_STEP_FIELD)),
454 set.getInt(STEP_FIELD), ErrorCode.getFromCode(
455 set.getString(STEP_STATUS_FIELD)), ErrorCode.getFromCode(
456 set.getString(INFO_STATUS_FIELD)), set.getInt(RANK_FIELD),
457 set.getTimestamp(TRANSFER_START_FIELD),
458 set.getTimestamp(TRANSFER_STOP_FIELD),
459 UpdatedInfo.valueOf(set.getInt(UPDATED_INFO_FIELD)));
460 } catch (final WaarpDatabaseSqlException e) {
461 throw new SQLException(e);
462 }
463 }
464
465
466
467
468
469
470
471
472 @Override
473 protected final String getId(final Transfer e1) {
474 throw new UnsupportedOperationException();
475 }
476 }
477
478