View Javadoc
1   /*
2    * This file is part of Waarp Project (named also Waarp or GG).
3    *
4    *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
5    *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
6    * individual contributors.
7    *
8    *  All Waarp Project is free software: you can redistribute it and/or
9    * modify it under the terms of the GNU General Public License as published by
10   * the Free Software Foundation, either version 3 of the License, or (at your
11   * option) any later version.
12   *
13   * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
14   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15   * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16   *
17   *  You should have received a copy of the GNU General Public License along with
18   * Waarp . If not, see <http://www.gnu.org/licenses/>.
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   * Implementation of TransferDAO for a standard SQL database
45   */
46  public abstract class DBTransferDAO extends StatementExecutor<Transfer>
47      implements TransferDAO {
48  
49    private static final String LIMIT2 = " LIMIT ";
50  
51    // Table name
52    protected static final String TABLE = "runner";
53  
54    // Field name
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    // CRUD requests
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     // Create the SQL query
338     final Object[] params = prepareFindParams(filters);
339     final StringBuilder query =
340         new StringBuilder(prepareFindQuery(filters, params));
341     // Set LIMIT
342     if (limit > 0) {
343       query.append(LIMIT2).append(limit);
344     }
345     // Set OFFSET
346     if (offset > 0) {
347       query.append(" OFFSET ").append(offset);
348     }
349     // Execute query
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    * {@link UnsupportedOperationException}
467    *
468    * @param e1 as Transfer
469    *
470    * @return never
471    */
472   @Override
473   protected final String getId(final Transfer e1) {
474     throw new UnsupportedOperationException();
475   }
476 }
477 
478