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.resource;
35  
36  import fr.paris.lutece.plugins.workflow.utils.WorkflowUtils;
37  import fr.paris.lutece.plugins.workflowcore.business.resource.IResourceWorkflowDAO;
38  import fr.paris.lutece.plugins.workflowcore.business.resource.ResourceWorkflow;
39  import fr.paris.lutece.plugins.workflowcore.business.resource.ResourceWorkflowFilter;
40  import fr.paris.lutece.plugins.workflowcore.business.state.State;
41  import fr.paris.lutece.plugins.workflowcore.business.workflow.Workflow;
42  import fr.paris.lutece.util.ReferenceList;
43  import fr.paris.lutece.util.sql.DAOUtil;
44  
45  import java.util.ArrayList;
46  import java.util.HashMap;
47  import java.util.List;
48  import java.util.Map;
49  import java.util.stream.Collectors;
50  
51  import org.apache.commons.collections.CollectionUtils;
52  
53  /**
54   *
55   * ResourceWorkflowDAO
56   *
57   */
58  public class ResourceWorkflowDAO implements IResourceWorkflowDAO
59  {
60      private static final String SQL_SELECT_ALL = "SELECT id_resource,resource_type,id_state,id_workflow,id_external_parent,is_associated_workgroups ";
61      private static final String SQL_QUERY_FIND_BY_PRIMARY_KEY = SQL_SELECT_ALL
62              + " FROM workflow_resource_workflow  WHERE id_resource=? AND resource_type=? AND id_workflow=?";
63      private static final String SQL_QUERY_SELECT_ID_STATE = "SELECT id_resource,id_state FROM workflow_resource_workflow "
64              + " WHERE id_workflow =? AND resource_type = ? AND id_external_parent = ? AND id_resource IN (?";
65      private static final String SQL_QUERY_SELECT_BY_LIST_ID_STATE = SQL_SELECT_ALL + "FROM workflow_resource_workflow  WHERE id_state IN (?";
66      private static final String SQL_QUERY_SELECT_BY_WORKFLOW = SQL_SELECT_ALL + " FROM workflow_resource_workflow  WHERE id_workflow=?";
67      private static final String SQL_QUERY_SELECT_ID_RESOURCE_BY_WORKFLOW = "SELECT id_resource  " + "FROM workflow_resource_workflow  WHERE id_workflow=?";
68      private static final String SQL_QUERY_SELECT_BY_STATE = SQL_SELECT_ALL + "FROM workflow_resource_workflow  WHERE id_state=?";
69      private static final String SQL_QUERY_FILTER_BY_ID_PARENT =  " AND id_external_parent = ? ";
70      private static final String SQL_QUERY_INSERT = "INSERT INTO  workflow_resource_workflow "
71              + "(id_resource,resource_type,id_state,id_workflow,id_external_parent,is_associated_workgroups)VALUES(?,?,?,?,?,?)";
72      private static final String SQL_QUERY_UPDATE = "UPDATE workflow_resource_workflow  SET id_resource=?,resource_type=?,id_state=?,id_workflow=?, "
73              + " id_external_parent= ?,is_associated_workgroups= ? WHERE id_resource=? AND resource_type=? AND id_workflow=?";
74      private static final String SQL_QUERY_DELETE = "DELETE FROM workflow_resource_workflow WHERE id_resource=? AND resource_type=? AND id_workflow=? ";
75      private static final String SQL_QUERY_DELETE_WORKGROUP = "DELETE FROM workflow_resource_workgroup WHERE id_resource=? AND resource_type=? AND id_workflow=?";
76      private static final String SQL_QUERY_DELETE_BY_LIST_ID_RESOURCE = "DELETE FROM workflow_resource_workflow WHERE id_workflow =? AND resource_type = ? AND id_resource IN (? ";
77      private static final String SQL_QUERY_DELETE_WORKGROUP_BY_LIST_ID_RESOURCE = "DELETE FROM workflow_resource_workgroup WHERE id_workflow =? AND resource_type = ? AND id_resource IN (? ";
78      private static final String SQL_QUERY_SELECT_WORKGROUPS = "SELECT workgroup_key FROM workflow_resource_workgroup WHERE id_resource=? AND resource_type=? AND id_workflow=?";
79      private static final String SQL_QUERY_INSERT_WORKGROUP = "INSERT INTO workflow_resource_workgroup (id_resource,resource_type,id_workflow, workgroup_key) VALUES(?,?,?,?) ";
80      private static final String SQL_QUERY_SELECT_STATE_BY_FILTER = "SELECT r.id_resource,r.resource_type,r.id_state,r.id_workflow "
81              + " FROM workflow_resource_workflow r ";
82      private static final String SQL_QUERY_SELECT_STATE_ID_BY_FILTER = "SELECT r.id_resource " + " FROM workflow_resource_workflow r ";
83      private static final String SQL_QUERY_WITH_WORKGROUP = ",workflow_resource_workgroup w  ";
84  
85      private static final String SQL_FILTER_EXTERNAL_PARENT_ID = " r.id_external_parent = ? ";
86      private static final String SQL_FILTER_ID_WORKFLOW = " r.id_workflow = ? ";
87      private static final String SQL_FILTER_ID_STATE = " r.id_state = ? ";
88      private static final String SQL_FILTER_ID_STATE_BY_ID_ACTION = " r.id_state IN ( ? ";
89      private static final String SQL_FILTER_RESOURCE_TYPE = " r.resource_type = ? ";
90      private static final String SQL_FILTER_WORKGROUP_KEY = " r.id_resource = w.id_resource AND r.resource_type = w.resource_type AND r.id_workflow = w.id_workflow AND (w.workgroup_key IN ( ";
91      private static final String SQL_FILTER_LIST_STATE = " r.id_state IN ( ";
92      private static final String SQL_ORDER_BY_ID_STATE = " ORDER BY r.id_state ";
93      private static final String SQL_CLOSE_PARENTHESIS = " ) ";
94      private static final String SQL_CLOSE_UNION = " UNION ";
95      private static final String SQL_ADITIONAL_PARAMETER = ",?";
96      private static final String SQL_FILTER_NOT_ASSOCIATE_WITH_WORKGROUP = " AND r.is_associated_workgroups=0 ";
97  
98      /**
99       * {@inheritDoc}
100      */
101     @Override
102     public synchronized void insert( ResourceWorkflow resourceWorkflow )
103     {
104         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_INSERT, WorkflowUtils.getPlugin( ) ) )
105         {
106             int nPos = 0;
107             daoUtil.setInt( ++nPos, resourceWorkflow.getIdResource( ) );
108             daoUtil.setString( ++nPos, resourceWorkflow.getResourceType( ) );
109             daoUtil.setInt( ++nPos, resourceWorkflow.getState( ).getId( ) );
110             daoUtil.setInt( ++nPos, resourceWorkflow.getWorkflow( ).getId( ) );
111 
112             if ( resourceWorkflow.getExternalParentId( ) != null )
113             {
114                 daoUtil.setInt( ++nPos, resourceWorkflow.getExternalParentId( ) );
115             }
116             else
117             {
118                 daoUtil.setIntNull( ++nPos );
119             }
120 
121             daoUtil.setBoolean( ++nPos, resourceWorkflow.isAssociatedWithWorkgroup( ) );
122             daoUtil.executeUpdate( );
123         }
124     }
125 
126     /**
127      * {@inheritDoc}
128      */
129     @Override
130     public void store( ResourceWorkflow resourceWorkflow )
131     {
132         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_UPDATE, WorkflowUtils.getPlugin( ) ) )
133         {
134             int nPos = 0;
135             daoUtil.setInt( ++nPos, resourceWorkflow.getIdResource( ) );
136             daoUtil.setString( ++nPos, resourceWorkflow.getResourceType( ) );
137             daoUtil.setInt( ++nPos, resourceWorkflow.getState( ).getId( ) );
138             daoUtil.setInt( ++nPos, resourceWorkflow.getWorkflow( ).getId( ) );
139 
140             if ( resourceWorkflow.getExternalParentId( ) != null )
141             {
142                 daoUtil.setInt( ++nPos, resourceWorkflow.getExternalParentId( ) );
143             }
144             else
145             {
146                 daoUtil.setIntNull( ++nPos );
147             }
148 
149             daoUtil.setBoolean( ++nPos, resourceWorkflow.isAssociatedWithWorkgroup( ) );
150             daoUtil.setInt( ++nPos, resourceWorkflow.getIdResource( ) );
151             daoUtil.setString( ++nPos, resourceWorkflow.getResourceType( ) );
152             daoUtil.setInt( ++nPos, resourceWorkflow.getWorkflow( ).getId( ) );
153 
154             daoUtil.executeUpdate( );
155         }
156     }
157 
158     /**
159      * {@inheritDoc}
160      */
161     @Override
162     public ResourceWorkflow load( int nIdResource, String strResourceType, int nIdWorkflow )
163     {
164         ResourceWorkflow documentWorkflow = null;
165         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_FIND_BY_PRIMARY_KEY, WorkflowUtils.getPlugin( ) ) )
166         {
167             int nPos = 0;
168 
169             daoUtil.setInt( ++nPos, nIdResource );
170             daoUtil.setString( ++nPos, strResourceType );
171             daoUtil.setInt( ++nPos, nIdWorkflow );
172 
173             daoUtil.executeQuery( );
174 
175             if ( daoUtil.next( ) )
176             {
177                 documentWorkflow = dataToObject( daoUtil );
178             }
179         }
180         return documentWorkflow;
181     }
182 
183     /**
184      * {@inheritDoc}
185      */
186     @Override
187     public List<ResourceWorkflow> selectResourceWorkflowByWorkflow( int nIdWorkflow )
188     {
189         List<ResourceWorkflow> lisResourceWorkflow = new ArrayList<>( );
190         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_SELECT_BY_WORKFLOW, WorkflowUtils.getPlugin( ) ) )
191         {
192             int nPos = 0;
193             daoUtil.setInt( ++nPos, nIdWorkflow );
194             daoUtil.executeQuery( );
195 
196             while ( daoUtil.next( ) )
197             {
198                 ResourceWorkflow resourceWorkflow = dataToObject( daoUtil );
199                 lisResourceWorkflow.add( resourceWorkflow );
200             }
201         }
202         return lisResourceWorkflow;
203     }
204 
205     /**
206      * {@inheritDoc}
207      */
208     @Override
209     public List<ResourceWorkflow> selectResourceWorkflowByState( int nIdState )
210     {
211     	return selectResourceWorkflowByState( nIdState, -1 );
212     }
213     
214     /**
215      * {@inheritDoc}
216      */
217     @Override
218     public List<ResourceWorkflow> selectResourceWorkflowByState( int nIdState, int nIdParent )
219     {
220         List<ResourceWorkflow> lisResourceWorkflow = new ArrayList<>( );
221         StringBuilder sql = new StringBuilder( SQL_QUERY_SELECT_BY_STATE ) ;
222         
223         if ( nIdParent > -1 ) {
224         	sql.append( SQL_QUERY_FILTER_BY_ID_PARENT );
225         }
226         
227         try ( DAOUtil daoUtil = new DAOUtil( sql.toString( ), WorkflowUtils.getPlugin( ) ) )
228         {
229             int nPos = 0;
230             daoUtil.setInt( ++nPos, nIdState );
231             if ( nIdParent > -1 ) {
232             	daoUtil.setInt( ++nPos, nIdParent );
233             }
234             daoUtil.executeQuery( );
235             while ( daoUtil.next( ) )
236             {
237                 ResourceWorkflow resourceWorkflow = dataToObject( daoUtil );
238                 lisResourceWorkflow.add( resourceWorkflow );
239             }
240         }
241         return lisResourceWorkflow;
242     }
243     
244     /**
245      * {@inheritDoc}
246      */
247     @Override
248     public List<ResourceWorkflow> selectResourceWorkflowByListState( List<Integer> listIdStateBefore )
249     {
250         List<ResourceWorkflow> lisResourceWorkflow = new ArrayList<>( );
251         int nlistIdResourceSize = listIdStateBefore.size( );
252 
253         if ( nlistIdResourceSize > 0 )
254         {
255             StringBuilder sbSQL = new StringBuilder( SQL_QUERY_SELECT_BY_LIST_ID_STATE );
256 
257             for ( int i = 1; i < nlistIdResourceSize; i++ )
258             {
259                 sbSQL.append( SQL_ADITIONAL_PARAMETER );
260             }
261 
262             sbSQL.append( SQL_CLOSE_PARENTHESIS );
263 
264             try ( DAOUtil daoUtil = new DAOUtil( sbSQL.toString( ), WorkflowUtils.getPlugin( ) ) )
265             {
266 
267                 for ( int i = 0; i < nlistIdResourceSize; i++ )
268                 {
269                     daoUtil.setInt( i + 1 , listIdStateBefore.get( i ) );
270                 }
271 
272                 daoUtil.executeQuery( );
273 
274                 while ( daoUtil.next( ) )
275                 {
276                     ResourceWorkflow resourceWorkflow = dataToObject( daoUtil );
277                     lisResourceWorkflow.add( resourceWorkflow );
278                 }
279             }
280         }
281         return lisResourceWorkflow;
282     }
283 
284     /**
285      * {@inheritDoc}
286      */
287     @Override
288     public void delete( ResourceWorkflow resourceWorkflow )
289     {
290         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_DELETE, WorkflowUtils.getPlugin( ) ) )
291         {
292             int nPos = 0;
293             daoUtil.setInt( ++nPos, resourceWorkflow.getIdResource( ) );
294             daoUtil.setString( ++nPos, resourceWorkflow.getResourceType( ) );
295             daoUtil.setInt( ++nPos, resourceWorkflow.getWorkflow( ).getId( ) );
296             daoUtil.executeUpdate( );
297         }
298     }
299 
300     /**
301      * {@inheritDoc}
302      */
303     @Override
304     public List<String> selectWorkgroups( ResourceWorkflow resourceWorkflow )
305     {
306         List<String> listWorkgroups = new ArrayList<>( );
307         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_SELECT_WORKGROUPS, WorkflowUtils.getPlugin( ) ) )
308         {
309             int nPos = 0;
310             daoUtil.setInt( ++nPos, resourceWorkflow.getIdResource( ) );
311             daoUtil.setString( ++nPos, resourceWorkflow.getResourceType( ) );
312             daoUtil.setInt( ++nPos, resourceWorkflow.getWorkflow( ).getId( ) );
313 
314             daoUtil.executeQuery( );
315 
316             while ( daoUtil.next( ) )
317             {
318                 nPos = 0;
319                 listWorkgroups.add( daoUtil.getString( ++nPos ) );
320             }
321         }
322         return listWorkgroups;
323     }
324 
325     /**
326      * {@inheritDoc}
327      */
328     @Override
329     public void deleteWorkgroups( ResourceWorkflow resourceWorkflow )
330     {
331         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_DELETE_WORKGROUP, WorkflowUtils.getPlugin( ) ) )
332         {
333             int nPos = 0;
334 
335             daoUtil.setInt( ++nPos, resourceWorkflow.getIdResource( ) );
336             daoUtil.setString( ++nPos, resourceWorkflow.getResourceType( ) );
337             daoUtil.setInt( ++nPos, resourceWorkflow.getWorkflow( ).getId( ) );
338 
339             daoUtil.executeUpdate( );
340         }
341     }
342 
343     /**
344      * {@inheritDoc}
345      */
346     @Override
347     public void removeWorkgroupsByListIdResource( List<Integer> listIdResource, String strResourceType, Integer nIdWorflow )
348     {
349         int nlistIdResourceSize = listIdResource.size( );
350 
351         if ( nlistIdResourceSize > 0 )
352         {
353             StringBuilder sbSQL = new StringBuilder( SQL_QUERY_DELETE_BY_LIST_ID_RESOURCE );
354             for ( int i = 1; i < nlistIdResourceSize; i++ )
355             {
356                 sbSQL.append( SQL_ADITIONAL_PARAMETER );
357             }
358 
359             sbSQL.append( SQL_CLOSE_PARENTHESIS );
360 
361             try ( DAOUtil daoUtil = new DAOUtil( sbSQL.toString( ), WorkflowUtils.getPlugin( ) ) )
362             {
363                 daoUtil.setInt( 1, nIdWorflow );
364                 daoUtil.setString( 2, strResourceType );
365 
366                 for ( int i = 0; i < nlistIdResourceSize; i++ )
367                 {
368                     daoUtil.setInt( i + 3, listIdResource.get( i ) );
369                 }
370 
371                 daoUtil.executeUpdate( );
372             }
373         }
374     }
375 
376     /**
377      * {@inheritDoc}
378      */
379     @Override
380     public void removeByListIdResource( List<Integer> listIdResource, String strResourceType, Integer nIdWorflow )
381     {
382         int nlistIdResourceSize = listIdResource.size( );
383 
384         if ( nlistIdResourceSize > 0 )
385         {
386             StringBuilder sbSQL = new StringBuilder( SQL_QUERY_DELETE_WORKGROUP_BY_LIST_ID_RESOURCE );
387 
388             for ( int i = 1; i < nlistIdResourceSize; i++ )
389             {
390                 sbSQL.append( SQL_ADITIONAL_PARAMETER );
391             }
392 
393             sbSQL.append( SQL_CLOSE_PARENTHESIS );
394 
395             try ( DAOUtil daoUtil = new DAOUtil( sbSQL.toString( ), WorkflowUtils.getPlugin( ) ) )
396             {
397                 daoUtil.setInt( 1, nIdWorflow );
398                 daoUtil.setString( 2, strResourceType );
399 
400                 for ( int i = 0; i < nlistIdResourceSize; i++ )
401                 {
402                     daoUtil.setInt( i + 3, listIdResource.get( i ) );
403                 }
404 
405                 daoUtil.executeUpdate( );
406             }
407         }
408     }
409 
410     /**
411      * {@inheritDoc}
412      */
413     @Override
414     public void insertWorkgroup( ResourceWorkflow resourceWorkflow, String strWorkgroup )
415     {
416         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_INSERT_WORKGROUP, WorkflowUtils.getPlugin( ) ) )
417         {
418             int nPos = 0;
419 
420             daoUtil.setInt( ++nPos, resourceWorkflow.getIdResource( ) );
421             daoUtil.setString( ++nPos, resourceWorkflow.getResourceType( ) );
422             daoUtil.setInt( ++nPos, resourceWorkflow.getWorkflow( ).getId( ) );
423             daoUtil.setString( ++nPos, strWorkgroup );
424 
425             daoUtil.executeUpdate( );
426         }
427     }
428 
429     /**
430      * {@inheritDoc}
431      */
432     @Override
433     public List<ResourceWorkflow> getListResourceWorkflowByFilter( ResourceWorkflowFilter filter )
434     {
435         List<ResourceWorkflow> listResourceWorkflow = new ArrayList<>( );
436         ResourceWorkflow resourceWorkflow = null;
437 
438         String strSQL = buildFilterQuerydHeader( filter, null, SQL_QUERY_SELECT_STATE_BY_FILTER, null );
439 
440         if ( filter.containsWorkgroupKeyList( ) )
441         {
442             Map<String, String> workgroupList = filter.getWorkgroupKeyList( );
443             filter.setWorkgroupKeyList( null );
444 
445             StringBuilder bufSQL = new StringBuilder( );
446             bufSQL.append( strSQL ).append( SQL_CLOSE_UNION ).append( buildFilterQuerydHeader( filter, null, SQL_QUERY_SELECT_STATE_BY_FILTER, null ) )
447                     .append( SQL_FILTER_NOT_ASSOCIATE_WITH_WORKGROUP );
448             filter.setWorkgroupKeyList( workgroupList );
449             strSQL = bufSQL.toString( );
450         }
451 
452         try ( DAOUtil daoUtil = new DAOUtil( strSQL, WorkflowUtils.getPlugin( ) ) )
453         {
454             int nPos = buildFilterQuerydFooter( daoUtil, filter, null, 0 );
455 
456             if ( filter.containsWorkgroupKeyList( ) )
457             {
458                 filter.setWorkgroupKeyList( null );
459                 buildFilterQuerydFooter( daoUtil, filter, null, nPos );
460             }
461 
462             daoUtil.executeQuery( );
463 
464             while ( daoUtil.next( ) )
465             {
466                 nPos = 0;
467                 resourceWorkflow = new ResourceWorkflow( );
468                 resourceWorkflow.setIdResource( daoUtil.getInt( ++nPos ) );
469                 resourceWorkflow.setResourceType( daoUtil.getString( ++nPos ) );
470 
471                 State state = new State( );
472                 state.setId( daoUtil.getInt( ++nPos ) );
473                 resourceWorkflow.setState( state );
474 
475                 Workflow workflow = new Workflow( );
476                 workflow.setId( daoUtil.getInt( ++nPos ) );
477                 resourceWorkflow.setWorkFlow( workflow );
478 
479                 if ( filter.containsExternalParentId( ) )
480                 {
481                     resourceWorkflow.setExternalParentId( daoUtil.getInt( ++nPos ) );
482                 }
483 
484                 listResourceWorkflow.add( resourceWorkflow );
485             }
486 
487         }
488 
489         return listResourceWorkflow;
490     }
491 
492     /**
493      * {@inheritDoc}
494      */
495     @Override
496     public List<Integer> selectResourceIdByWorkflow( int nIdWorkflow )
497     {
498         List<Integer> lisResourceWorkflow = new ArrayList<>( );
499         try ( DAOUtil daoUtil = new DAOUtil( SQL_QUERY_SELECT_ID_RESOURCE_BY_WORKFLOW, WorkflowUtils.getPlugin( ) ) )
500         {
501             int nPos = 0;
502             daoUtil.setInt( ++nPos, nIdWorkflow );
503             daoUtil.executeQuery( );
504             while ( daoUtil.next( ) )
505             {
506                 nPos = 0;
507                 lisResourceWorkflow.add( daoUtil.getInt( ++nPos ) );
508             }
509         }
510         return lisResourceWorkflow;
511     }
512 
513     /**
514      * {@inheritDoc}
515      */
516     @Override
517     public List<Integer> getListResourceWorkflowIdByFilter( ResourceWorkflowFilter filter )
518     {
519         List<Integer> listResourceWorkflowId = new ArrayList<>( );
520 
521         String strSQL = buildFilterQuerydHeader( filter, null, SQL_QUERY_SELECT_STATE_ID_BY_FILTER, null );
522 
523         if ( filter.containsWorkgroupKeyList( ) )
524         {
525             Map<String, String> workgroupList = filter.getWorkgroupKeyList( );
526             filter.setWorkgroupKeyList( null );
527 
528             StringBuilder bufSQL = new StringBuilder( );
529             bufSQL.append( strSQL ).append( SQL_CLOSE_UNION ).append( buildFilterQuerydHeader( filter, null, SQL_QUERY_SELECT_STATE_ID_BY_FILTER, null ) )
530                     .append( SQL_FILTER_NOT_ASSOCIATE_WITH_WORKGROUP );
531             filter.setWorkgroupKeyList( workgroupList );
532             strSQL = bufSQL.toString( );
533         }
534 
535         try ( DAOUtil daoUtil = new DAOUtil( strSQL, WorkflowUtils.getPlugin( ) ) )
536         {
537             int nPos = buildFilterQuerydFooter( daoUtil, filter, null, 0 );
538 
539             if ( filter.containsWorkgroupKeyList( ) )
540             {
541                 filter.setWorkgroupKeyList( null );
542                 buildFilterQuerydFooter( daoUtil, filter, null, nPos );
543             }
544 
545             daoUtil.executeQuery( );
546             while ( daoUtil.next( ) )
547             {
548                 listResourceWorkflowId.add( daoUtil.getInt( 1 ) );
549             }
550         }
551         return listResourceWorkflowId;
552     }
553 
554     /**
555      * {@inheritDoc}
556      */
557     @Override
558     public List<Integer> getListResourceWorkflowIdByFilter( ResourceWorkflowFilter filter, List<Integer> lListIdWorkflowState )
559     {
560         List<Integer> listResourceWorkflowId = new ArrayList<>( );
561 
562         filter.setIdState( ResourceWorkflowFilter.ALL_INT );
563 
564         String strSQL = buildFilterQuerydHeader( filter, lListIdWorkflowState, SQL_QUERY_SELECT_STATE_ID_BY_FILTER, SQL_ORDER_BY_ID_STATE );
565 
566         if ( filter.containsWorkgroupKeyList( ) )
567         {
568             Map<String, String> workgroupList = filter.getWorkgroupKeyList( );
569             filter.setWorkgroupKeyList( null );
570 
571             StringBuilder bufSQL = new StringBuilder( );
572             bufSQL.append( strSQL ).append( SQL_CLOSE_UNION )
573                     .append( buildFilterQuerydHeader( filter, lListIdWorkflowState, SQL_QUERY_SELECT_STATE_ID_BY_FILTER, null ) )
574                     .append( SQL_FILTER_NOT_ASSOCIATE_WITH_WORKGROUP );
575             filter.setWorkgroupKeyList( workgroupList );
576             strSQL = bufSQL.toString( );
577         }
578 
579         try ( DAOUtil daoUtil = new DAOUtil( strSQL, WorkflowUtils.getPlugin( ) ) )
580         {
581             int nPos = buildFilterQuerydFooter( daoUtil, filter, lListIdWorkflowState, 0 );
582 
583             if ( filter.containsWorkgroupKeyList( ) )
584             {
585                 filter.setWorkgroupKeyList( null );
586                 buildFilterQuerydFooter( daoUtil, filter, lListIdWorkflowState, nPos );
587             }
588 
589             daoUtil.executeQuery( );
590 
591             while ( daoUtil.next( ) )
592             {
593                 listResourceWorkflowId.add( daoUtil.getInt( 1 ) );
594             }
595         }
596         return listResourceWorkflowId;
597     }
598 
599     /**
600      * {@inheritDoc}
601      */
602     @Override
603     public Map<Integer, Integer> getListIdStateByListId( List<Integer> lListIdRessource, int nIdWorflow, String strResourceType, Integer nIdExternalParentId )
604     {
605         Map<Integer, Integer> result = new HashMap<>( );
606         int nlistIdResourceSize = lListIdRessource.size( );
607 
608         if ( nlistIdResourceSize > 0 )
609         {
610             StringBuilder sbSQL = new StringBuilder( SQL_QUERY_SELECT_ID_STATE );
611 
612             for ( int i = 1; i < nlistIdResourceSize; i++ )
613             {
614                 sbSQL.append( SQL_ADITIONAL_PARAMETER );
615             }
616 
617             sbSQL.append( SQL_CLOSE_PARENTHESIS );
618 
619             try ( DAOUtil daoUtil = new DAOUtil( sbSQL.toString( ), WorkflowUtils.getPlugin( ) ) )
620             {
621                 daoUtil.setInt( 1, nIdWorflow );
622                 daoUtil.setString( 2, strResourceType );
623                 daoUtil.setInt( 3, nIdExternalParentId );
624 
625                 for ( int i = 0; i < nlistIdResourceSize; i++ )
626                 {
627                     daoUtil.setInt( i + 4, lListIdRessource.get( i ) );
628                 }
629 
630                 daoUtil.executeQuery( );
631 
632                 while ( daoUtil.next( ) )
633                 {
634                     result.put( daoUtil.getInt( 1 ), daoUtil.getInt( 2 ) );
635                 }
636             }
637         }
638         return result;
639     }
640 
641     /**
642      * Build filter SQL query footer
643      * 
644      * @param daoUtil
645      *            the DaoUtil
646      * @param filter
647      *            the filter
648      * @param lListIdState
649      *            the list of ids state
650      * @param nPos
651      *            the parameter position
652      * @return the doaUtil
653      */
654     private Integer buildFilterQuerydFooter( DAOUtil daoUtil, ResourceWorkflowFilter filter, List<Integer> lListIdState, Integer nPos )
655     {
656         int nPosition = nPos;
657 
658         if ( filter.containsIdWorkflow( ) )
659         {
660             daoUtil.setInt( ++nPosition, filter.getIdWorkflow( ) );
661         }
662 
663         if ( ( lListIdState == null ) && filter.containsIdState( ) )
664         {
665             daoUtil.setInt( ++nPosition, filter.getIdState( ) );
666         }
667         
668         if ( filter.containsListIdStateBefore( ) )
669         {
670             int nSize = filter.getListIdStateBefore( ).size( );
671 
672             for ( int i = 0; i < nSize; i++ )
673             {
674                 daoUtil.setInt( i + nPosition + 1, filter.getListIdStateBefore( ).get( i ) );
675             }
676 
677             nPosition += nSize;
678         }
679 
680         if ( filter.containsResourceType( ) )
681         {
682             daoUtil.setString( ++nPosition, filter.getResourceType( ) );
683         }
684 
685         if ( filter.containsExternalParentId( ) )
686         {
687             daoUtil.setInt( ++nPosition, filter.getExternalParentId( ) );
688         }
689 
690         if ( lListIdState != null )
691         {
692             int nSize = lListIdState.size( );
693 
694             for ( int i = 0; i < nSize; i++ )
695             {
696                 daoUtil.setInt( i + nPosition + 1, lListIdState.get( i ) );
697             }
698 
699             nPosition += nSize;
700         }
701 
702         if ( filter.containsWorkgroupKeyList( ) )
703         {
704             ReferenceList list = ReferenceList.convert( filter.getWorkgroupKeyList( ) );
705             int nSize = list.size( );
706 
707             for ( int i = 0; i < nSize; i++ )
708             {
709                 daoUtil.setString( i + nPosition + 1, list.get( i ).getCode( ) );
710             }
711 
712             nPosition += nSize;
713         }
714 
715         return nPosition;
716     }
717 
718     /**
719      * Build filter SQL query header
720      * 
721      * @param filter
722      *            the filter
723      * @param lListIdState
724      *            the list of ids state
725      * @param strSelectSQL
726      *            the beginning of sql query
727      * @param strOrderBy
728      *            the SQL query for order by
729      * @return the SQL query
730      */
731     private String buildFilterQuerydHeader( ResourceWorkflowFilter filter, List<Integer> lListIdState, String strSelectSQL, String strOrderBy )
732     {
733         List<String> listStrFilter = new ArrayList<>( );
734 
735         if ( filter.containsIdWorkflow( ) )
736         {
737             listStrFilter.add( SQL_FILTER_ID_WORKFLOW );
738         }
739         
740         if ( ( lListIdState == null ) && filter.containsIdState( ) )
741         {
742             listStrFilter.add( SQL_FILTER_ID_STATE );
743         }
744         
745         if ( filter.containsListIdStateBefore( ) )
746         {
747         	StringBuilder sbSQL = new StringBuilder( SQL_FILTER_ID_STATE_BY_ID_ACTION );
748 
749             for ( int i = 1; i < filter.getListIdStateBefore( ).size( ); i++ )
750             {
751                 sbSQL.append( SQL_ADITIONAL_PARAMETER );
752             }
753 
754             sbSQL.append( SQL_CLOSE_PARENTHESIS );
755             listStrFilter.add( sbSQL.toString( ) );
756         }
757 
758         if ( filter.containsResourceType( ) )
759         {
760             listStrFilter.add( SQL_FILTER_RESOURCE_TYPE );
761         }
762 
763         if ( filter.containsExternalParentId( ) )
764         {
765             listStrFilter.add( SQL_FILTER_EXTERNAL_PARENT_ID );
766         }
767 
768         if ( CollectionUtils.isNotEmpty( lListIdState ) )
769         {
770             StringBuilder sb = new StringBuilder( );
771             sb.append( SQL_FILTER_LIST_STATE );
772             sb.append( lListIdState.stream( ).map( i -> "?" ).collect( Collectors.joining( "," ) ) );
773             sb.append( SQL_CLOSE_PARENTHESIS );
774             listStrFilter.add( sb.toString( ) );
775         }
776 
777         String strSQL = null;
778 
779         if ( filter.containsWorkgroupKeyList( ) )
780         {
781             ReferenceList list = ReferenceList.convert( filter.getWorkgroupKeyList( ) );
782             int nSize = list.size( );
783 
784             if ( nSize > 0 )
785             {
786                 StringBuilder sb = new StringBuilder( );
787                 sb.append( SQL_FILTER_WORKGROUP_KEY );
788                 sb.append( list.stream( ).map( i -> "?" ).collect( Collectors.joining( "," ) ) );
789                 sb.append( SQL_CLOSE_PARENTHESIS + SQL_CLOSE_PARENTHESIS );
790                 listStrFilter.add( sb.toString( ) );
791             }
792 
793             strSQL = WorkflowUtils.buildRequestWithFilter( strSelectSQL + SQL_QUERY_WITH_WORKGROUP, listStrFilter, null );
794         }
795         else
796         {
797             strSQL = WorkflowUtils.buildRequestWithFilter( strSelectSQL, listStrFilter, strOrderBy );
798         }
799 
800         return strSQL;
801     }
802 
803     private ResourceWorkflow dataToObject( DAOUtil daoUtil )
804     {
805         int nPos = 0;
806         ResourceWorkflow documentWorkflow = new ResourceWorkflow( );
807         documentWorkflow.setIdResource( daoUtil.getInt( ++nPos ) );
808         documentWorkflow.setResourceType( daoUtil.getString( ++nPos ) );
809 
810         State state = new State( );
811         state.setId( daoUtil.getInt( ++nPos ) );
812         documentWorkflow.setState( state );
813 
814         Workflow workflow = new Workflow( );
815         workflow.setId( daoUtil.getInt( ++nPos ) );
816         documentWorkflow.setWorkFlow( workflow );
817 
818         if ( daoUtil.getObject( ++nPos ) != null )
819         {
820             documentWorkflow.setExternalParentId( daoUtil.getInt( nPos ) );
821         }
822         else
823         {
824             documentWorkflow.setExternalParentId( null );
825         }
826         documentWorkflow.setAssociatedWithWorkgroup( daoUtil.getBoolean( ++nPos ) );
827         return documentWorkflow;
828     }
829 }