View Javadoc
1   /*
2    * Copyright (c) 2002-2022, City of Paris
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    *
9    *  1. Redistributions of source code must retain the above copyright notice
10   *     and the following disclaimer.
11   *
12   *  2. Redistributions in binary form must reproduce the above copyright notice
13   *     and the following disclaimer in the documentation and/or other materials
14   *     provided with the distribution.
15   *
16   *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17   *     contributors may be used to endorse or promote products derived from
18   *     this software without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   *
32   * License 1.0
33   */
34  package fr.paris.lutece.plugins.workflow.business.task;
35  
36  import fr.paris.lutece.plugins.workflow.utils.WorkflowUtils;
37  import fr.paris.lutece.plugins.workflowcore.business.action.Action;
38  import fr.paris.lutece.plugins.workflowcore.business.task.ITaskDAO;
39  import fr.paris.lutece.plugins.workflowcore.service.task.ITask;
40  import fr.paris.lutece.plugins.workflowcore.service.task.ITaskFactory;
41  import fr.paris.lutece.util.sql.DAOUtil;
42  import java.sql.Statement;
43  
44  import java.util.ArrayList;
45  import java.util.List;
46  import java.util.Locale;
47  
48  import javax.inject.Inject;
49  
50  /**
51   *
52   * TaskDAO
53   *
54   */
55  public class TaskDAO implements ITaskDAO
56  {
57      private static final String SQL_QUERY_FIND_BY_PRIMARY_KEY = "SELECT task_type_key,id_task,id_action, display_order, uid_task" + " FROM workflow_task WHERE id_task=?";
58      private static final String SQL_QUERY_SELECT_STATE_BY_ID_ACTION = "SELECT task_type_key,id_task,id_action, display_order, uid_task "
59              + " FROM workflow_task WHERE id_action=? ORDER BY display_order";
60      private static final String SQL_QUERY_INSERT = "INSERT INTO  workflow_task " + "(task_type_key,id_action, display_order, uid_task) VALUES(?,?,?,?)";
61      private static final String SQL_QUERY_UPDATE = "UPDATE workflow_task  SET id_task=?,task_type_key=?,id_action=?,display_order=?, uid_task=?" + " WHERE id_task=?";
62      private static final String SQL_QUERY_DELETE = "DELETE FROM workflow_task  WHERE id_task=? ";
63      private static final String SQL_QUERY_FIND_MAXIMUM_ORDER_BY_ACTION = "SELECT MAX(display_order) FROM workflow_task WHERE id_action=?";
64      private static final String SQL_QUERY_DECREMENT_ORDER = "UPDATE workflow_task SET display_order = display_order -1 WHERE display_order > ? AND id_action=? ";
65      private static final String SQL_QUERY_TASKS_WITH_ORDER_BETWEEN = "SELECT task_type_key,id_task,id_action, display_order, uid_task FROM workflow_task WHERE (display_order BETWEEN ? AND ?) AND id_action=?";
66      private static final String SQL_QUERY_TASKS_AFTER_ORDER = "SELECT task_type_key,id_task,id_action, display_order, uid_task FROM workflow_task WHERE display_order >=? AND id_action=?";
67      private static final String SQL_QUERY_SELECT_TASK_FOR_ORDER_INIT = "SELECT task_type_key,id_task,id_action, display_order, uid_task "
68              + " FROM workflow_task WHERE id_action=? ORDER BY id_task";
69      @Inject
70      private ITaskFactory _taskFactory;
71  
72      /**
73       * {@inheritDoc}
74       */
75      @Override
76      public synchronized void insert( ITask task )
77      {
78          try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_INSERT, Statement.RETURN_GENERATED_KEYS, WorkflowUtils.getPlugin( ) ) )
79          {
80              int nPos = 0;
81              daoUtil.setString( ++nPos, task.getTaskType( ).getKey( ) );
82              daoUtil.setInt( ++nPos, task.getAction( ).getId( ) );
83              daoUtil.setInt( ++nPos, task.getOrder( ) );
84              daoUtil.setString( ++nPos, task.getUid( ) );
85  
86              daoUtil.executeUpdate( );
87              if ( daoUtil.nextGeneratedKey( ) )
88              {
89                  task.setId( daoUtil.getGeneratedKeyInt( 1 ) );
90              }
91          }
92      }
93  
94      /**
95       * {@inheritDoc}
96       */
97      @Override
98      public void store( ITask task )
99      {
100         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_UPDATE, WorkflowUtils.getPlugin( ) ) )
101         {
102             int nPos = 0;
103 
104             daoUtil.setInt( ++nPos, task.getId( ) );
105             daoUtil.setString( ++nPos, task.getTaskType( ).getKey( ) );
106             daoUtil.setInt( ++nPos, task.getAction( ).getId( ) );
107             daoUtil.setInt( ++nPos, task.getOrder( ) );
108             daoUtil.setString( ++nPos, task.getUid( ) );
109             daoUtil.setInt( ++nPos, task.getId( ) );
110 
111             daoUtil.executeUpdate( );
112         }
113     }
114 
115     /**
116      * {@inheritDoc}
117      */
118     @Override
119     public ITask load( int nIdTask, Locale locale )
120     {
121         ITask task = null;
122         Action action = null;
123         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_FIND_BY_PRIMARY_KEY, WorkflowUtils.getPlugin( ) ) )
124         {
125             daoUtil.setInt( 1, nIdTask );
126 
127             daoUtil.executeQuery( );
128 
129             int nPos = 0;
130 
131             if ( daoUtil.next( ) )
132             {
133                 task = _taskFactory.newTask( daoUtil.getString( ++nPos ), locale );
134                 task.setId( daoUtil.getInt( ++nPos ) );
135                 action = new Action( );
136                 action.setId( daoUtil.getInt( ++nPos ) );
137                 task.setOrder( daoUtil.getInt( ++nPos ) );
138                 task.setAction( action );
139                 task.setUid( daoUtil.getString( ++nPos ) );
140             }
141         }
142         return task;
143     }
144 
145     /**
146      * {@inheritDoc}
147      */
148     @Override
149     public void delete( int nIdTask )
150     {
151         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_DELETE, WorkflowUtils.getPlugin( ) ) )
152         {
153             daoUtil.setInt( 1, nIdTask );
154             daoUtil.executeUpdate( );
155         }
156     }
157 
158     /**
159      * {@inheritDoc}
160      */
161     @Override
162     public List<ITask> selectTaskByIdAction( int nIdAction, Locale locale )
163     {
164         ITask task = null;
165         Action action = null;
166         List<ITask> listTask = new ArrayList<>( );
167         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_SELECT_STATE_BY_ID_ACTION, WorkflowUtils.getPlugin( ) ) )
168         {
169             daoUtil.setInt( 1, nIdAction );
170 
171             daoUtil.executeQuery( );
172 
173             while ( daoUtil.next( ) )
174             {
175                 int nPos = 0;
176                 task = _taskFactory.newTask( daoUtil.getString( ++nPos ), locale );
177                 task.setId( daoUtil.getInt( ++nPos ) );
178                 action = new Action( );
179                 action.setId( daoUtil.getInt( ++nPos ) );
180                 task.setAction( action );
181                 task.setActionUid( action.getUid( ) );
182                 
183                 task.setOrder( daoUtil.getInt( ++nPos ) );
184                 task.setUid( daoUtil.getString( ++nPos ) );
185 
186                 listTask.add( task );
187             }
188         }
189         return listTask;
190     }
191 
192     /**
193      * {@inheritDoc}
194      */
195     @Override
196     public int findMaximumOrderByActionId( int nIdAction )
197     {
198         int nMaximumOrder = 0;
199         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_FIND_MAXIMUM_ORDER_BY_ACTION, WorkflowUtils.getPlugin( ) ) )
200         {
201             daoUtil.setInt( 1, nIdAction );
202             daoUtil.executeQuery( );
203 
204             while ( daoUtil.next( ) )
205             {
206                 nMaximumOrder = daoUtil.getInt( 1 );
207             }
208         }
209         return nMaximumOrder;
210     }
211 
212     /**
213      * {@inheritDoc}
214      */
215     @Override
216     public void decrementOrderByOne( int nOrder, int nIdAction )
217     {
218         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_DECREMENT_ORDER, WorkflowUtils.getPlugin( ) ) )
219         {
220             daoUtil.setInt( 1, nOrder );
221             daoUtil.setInt( 2, nIdAction );
222             daoUtil.executeUpdate( );
223         }
224     }
225 
226     /**
227      * {@inheritDoc}
228      */
229     @Override
230     public List<ITask> findTasksBetweenOrders( int nOrder1, int nOrder2, int nIdAction, Locale locale )
231     {
232         List<ITask> listTask = new ArrayList<>( );
233         int nPos = 0;
234         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_TASKS_WITH_ORDER_BETWEEN, WorkflowUtils.getPlugin( ) ) )
235         {
236             daoUtil.setInt( 1, nOrder1 );
237             daoUtil.setInt( 2, nOrder2 );
238             daoUtil.setInt( 3, nIdAction );
239             daoUtil.executeQuery( );
240 
241             while ( daoUtil.next( ) )
242             {
243                 ITask task = null;
244                 Action action = null;
245                 nPos = 0;
246                 task = _taskFactory.newTask( daoUtil.getString( ++nPos ), locale );
247                 task.setId( daoUtil.getInt( ++nPos ) );
248                 action = new Action( );
249                 action.setId( daoUtil.getInt( ++nPos ) );
250                 task.setAction( action );
251                 task.setOrder( daoUtil.getInt( ++nPos ) );
252                 task.setUid( daoUtil.getString( ++nPos ) );
253 
254                 listTask.add( task );
255             }
256         }
257         return listTask;
258     }
259 
260     /**
261      * {@inheritDoc}
262      */
263     @Override
264     public List<ITask> findTasksAfterOrder( int nOrder, int nIdAction, Locale locale )
265     {
266         List<ITask> listTask = new ArrayList<>( );
267         int nPos = 0;
268         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_TASKS_AFTER_ORDER, WorkflowUtils.getPlugin( ) ) )
269         {
270             daoUtil.setInt( 1, nOrder );
271             daoUtil.setInt( 2, nIdAction );
272             daoUtil.executeQuery( );
273 
274             while ( daoUtil.next( ) )
275             {
276                 ITask task = null;
277                 Action action = null;
278                 nPos = 0;
279                 task = _taskFactory.newTask( daoUtil.getString( ++nPos ), locale );
280                 task.setId( daoUtil.getInt( ++nPos ) );
281                 action = new Action( );
282                 action.setId( daoUtil.getInt( ++nPos ) );
283                 task.setAction( action );
284                 task.setOrder( daoUtil.getInt( ++nPos ) );
285                 task.setUid( daoUtil.getString( ++nPos ) );
286 
287                 listTask.add( task );
288             }
289         }
290         return listTask;
291     }
292 
293     /**
294      * {@inheritDoc}
295      */
296     @Override
297     public List<ITask> findTasksForOrderInit( int nIdAction, Locale locale )
298     {
299         List<ITask> listTask = new ArrayList<>( );
300         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_SELECT_TASK_FOR_ORDER_INIT, WorkflowUtils.getPlugin( ) ) )
301         {
302             daoUtil.setInt( 1, nIdAction );
303             daoUtil.executeQuery( );
304 
305             while ( daoUtil.next( ) )
306             {
307                 ITask task = null;
308                 Action action = null;
309                 int nPos = 0;
310                 task = _taskFactory.newTask( daoUtil.getString( ++nPos ), locale );
311                 task.setId( daoUtil.getInt( ++nPos ) );
312                 action = new Action( );
313                 action.setId( daoUtil.getInt( ++nPos ) );
314                 task.setAction( action );
315                 task.setOrder( daoUtil.getInt( ++nPos ) );
316                 task.setUid( daoUtil.getString( ++nPos ) );
317 
318                 listTask.add( task );
319             }
320         }
321         return listTask;
322     }
323 }