View Javadoc
1   /*
2    * Copyright (c) 2002-2018, Mairie de 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.directory.modules.multiview.business.record.list;
35  
36  import java.util.ArrayList;
37  import java.util.List;
38  
39  import org.apache.commons.collections.CollectionUtils;
40  import org.apache.commons.lang3.StringUtils;
41  
42  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.DirectoryRecordItem;
43  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.QueryBuilder;
44  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.RecordParameters;
45  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.IRecordColumn;
46  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.RecordColumnCell;
47  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.IRecordColumnQueryPart;
48  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.column.querypart.RecordColumnQueryPartFacade;
49  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.IRecordFilter;
50  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.querypart.IRecordFilterQueryPart;
51  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.filter.querypart.RecordFilterQueryPartFacade;
52  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.panel.IRecordPanel;
53  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.panel.configuration.RecordPanelConfiguration;
54  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.panel.initializer.IRecordPanelInitializer;
55  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.panel.initializer.querypart.IRecordPanelInitializerQueryPart;
56  import fr.paris.lutece.plugins.directory.modules.multiview.business.record.panel.initializer.querypart.RecordPanelInitializerQueryPartFacade;
57  import fr.paris.lutece.util.sql.DAOUtil;
58  
59  /**
60   * Implementation of the IRecordListDAO interface
61   */
62  public class RecordListDAO implements IRecordListDAO
63  {
64      // Constants
65      private static final String ID_RECORD_COLUMN_NAME = "id_record";
66      private static final String ID_DIRECTORY_COLUMN_NAME = "id_directory";
67  
68      /**
69       * {@inheritDoc}
70       */
71      @Override
72      public void populateRecordColumns( IRecordPanel recordPanel, List<IRecordColumn> listRecordColumn, List<IRecordFilter> listRecordFilter )
73      {
74          // To retrieve the values to display on the table we must have a RecordPanel and a list of RecordColumn
75          if ( recordPanel == null || CollectionUtils.isEmpty( listRecordColumn ) )
76          {
77              return;
78          }
79  
80          // Create the list of all values of the parameter to used
81          List<String> listQueryParametersPositionValue = new ArrayList<>( );
82  
83          // Build the list of query part from the recordPanel, the list of columns and the list of filters
84          List<IRecordPanelInitializerQueryPart> listRecordPanelInitializerQueryPart = buildRecordPanelInitializerQueryPartList( recordPanel,
85                  listQueryParametersPositionValue );
86          List<IRecordColumnQueryPart> listRecordColumnQueryPart = buildRecordColumnQueryPartList( listRecordColumn );
87          List<IRecordFilterQueryPart> listRecordFilterQueryPart = buildRecordFilterQueryPartList( listRecordFilter, listQueryParametersPositionValue );
88  
89          // Build the query to execute
90          String strQuery = QueryBuilder.buildQuery( listRecordPanelInitializerQueryPart, listRecordColumnQueryPart, listRecordFilterQueryPart );
91  
92          List<DirectoryRecordItem> listDirectoryRecordItem = new ArrayList<>( );
93  
94          if ( StringUtils.isNotBlank( strQuery ) )
95          {
96              DAOUtil daoUtil = new DAOUtil( strQuery );
97              fillDAOUtilParameterValues( daoUtil, listQueryParametersPositionValue );
98              daoUtil.executeQuery( );
99  
100             while ( daoUtil.next( ) )
101             {
102                 // Create a DirectoryRecordItem for the current result line
103                 DirectoryRecordItem directoryRecordItem = createDirectoryItem( daoUtil );
104                 listDirectoryRecordItem.add( directoryRecordItem );
105 
106                 for ( IRecordColumnQueryPart recordColumnQueryPart : listRecordColumnQueryPart )
107                 {
108                     RecordColumnCell recordColumnCell = recordColumnQueryPart.getRecordColumnCell( daoUtil );
109                     directoryRecordItem.addRecordColumnCell( recordColumnCell );
110                 }
111             }
112 
113             daoUtil.close( );
114         }
115 
116         recordPanel.setDirectoryRecordItemList( listDirectoryRecordItem );
117     }
118 
119     /**
120      * Fill the values to used to prepare the query of the given DAOUtil
121      * 
122      * @param daoUtil
123      *            The DAOUtil on which the values must be set to prepare the query
124      * @param listQueryParametersPositionValue
125      *            The list of all parameter values to used to fill the given DAOUtil statement
126      */
127     private void fillDAOUtilParameterValues( DAOUtil daoUtil, List<String> listQueryParametersPositionValue )
128     {
129         if ( !CollectionUtils.isEmpty( listQueryParametersPositionValue ) )
130         {
131             int nIndex = 1;
132             for ( String strParameterValue : listQueryParametersPositionValue )
133             {
134                 try
135                 {
136                     int nParameterValue = Integer.parseInt( strParameterValue );
137                     daoUtil.setInt( nIndex++, nParameterValue );
138                 }
139                 catch( NumberFormatException exception )
140                 {
141                     daoUtil.setString( nIndex++, strParameterValue );
142                 }
143             }
144         }
145     }
146 
147     /**
148      * Create a DirectoryItem from a DAOUtil
149      * 
150      * @param daoUtil
151      *            The daoUtil to retrieve the values of the request from
152      * @return the created DirectoryRecordItem
153      */
154     private DirectoryRecordItem createDirectoryItem( DAOUtil daoUtil )
155     {
156         DirectoryRecordItem directoryRecordItem = new DirectoryRecordItem( );
157         directoryRecordItem.setIdRecord( daoUtil.getInt( ID_RECORD_COLUMN_NAME ) );
158         directoryRecordItem.setIdDirectory( daoUtil.getInt( ID_DIRECTORY_COLUMN_NAME ) );
159 
160         return directoryRecordItem;
161     }
162 
163     /**
164      * Build the list of all RecordPanelInitializerQueryPart associate to all the RecordPanelInitializer to retrieve from the given RecordPanel
165      * 
166      * @param recordPanel
167      *            The RecordPanel used to retrieve the list of all RecordPanelInitializer to retrieve the list of RecordPanelInitializerQueryPart
168      * @param listQueryParametersPositionValue
169      *            The list of all parameter values to used to fill the DAOUtil statement
170      * @return the list of all RecordPanelInitializerQueryPart associate to all the RecordPanelInitializer to retrieve from the given RecordPanel
171      */
172     private static List<IRecordPanelInitializerQueryPart> buildRecordPanelInitializerQueryPartList( IRecordPanel recordPanel,
173             List<String> listQueryParametersPositionValue )
174     {
175         List<IRecordPanelInitializerQueryPart> listRecordPanelInitializerQueryPart = new ArrayList<>( );
176 
177         RecordPanelConfiguration recordPanelConfiguration = recordPanel.getRecordPanelConfiguration( );
178 
179         if ( recordPanelConfiguration != null && !CollectionUtils.isEmpty( recordPanelConfiguration.getListRecordPanelInitializer( ) ) )
180         {
181             List<IRecordPanelInitializer> listRecordPanelInitializer = recordPanelConfiguration.getListRecordPanelInitializer( );
182 
183             for ( IRecordPanelInitializer recordPanelInitializer : listRecordPanelInitializer )
184             {
185                 IRecordPanelInitializerQueryPart recordPanelInitializerQueryPart = retrieveRecordPanelInitializerQueryPart( recordPanelInitializer,
186                         listQueryParametersPositionValue );
187                 if ( recordPanelInitializerQueryPart != null )
188                 {
189                     listRecordPanelInitializerQueryPart.add( recordPanelInitializerQueryPart );
190                 }
191             }
192         }
193 
194         return listRecordPanelInitializerQueryPart;
195     }
196 
197     /**
198      * Retrieve the IRecordPanelInitializerQueryPart associate to the given RecordPanelInitializer
199      * 
200      * @param recordPanelInitializer
201      *            The RecordPanelInitializer used to retrieve the associated IRecordPanelInitializerQueryPart
202      * @param listQueryParametersPositionValue
203      *            The list of all parameter values to used to fill the DAOUtil statement
204      * @return the IRecordPanelInitializerQueryPart associate to the given RecordPanelInitializer or null if not found
205      */
206     private static IRecordPanelInitializerQueryPart retrieveRecordPanelInitializerQueryPart( IRecordPanelInitializer recordPanelInitializer,
207             List<String> listQueryParametersPositionValue )
208     {
209         IRecordPanelInitializerQueryPart recordPanelInitializerQueryPartResult = null;
210 
211         if ( recordPanelInitializer != null )
212         {
213             recordPanelInitializerQueryPartResult = new RecordPanelInitializerQueryPartFacade( ).getRecordPanelInitializerQueryPart( recordPanelInitializer );
214 
215             if ( recordPanelInitializerQueryPartResult != null )
216             {
217                 RecordParameters recordParameters = recordPanelInitializer.getRecordParameters( );
218                 recordPanelInitializerQueryPartResult.buildRecordPanelInitializerQuery( recordParameters );
219 
220                 List<String> listUsedParametersValues = recordParameters.getListUsedParametersValue( );
221                 listQueryParametersPositionValue.addAll( listUsedParametersValues );
222             }
223         }
224 
225         return recordPanelInitializerQueryPartResult;
226     }
227 
228     /**
229      * Build the list of IRecordColumnQueryPart to use for build the global query from the given list of IRecordColumn
230      * 
231      * @param listRecordColumn
232      *            The list of IRecordColumn to use for retrieving the list of IRecordColumnQueryPart
233      * @return the list of IRecordColumnQueryPart to use for build the global query
234      */
235     private static List<IRecordColumnQueryPart> buildRecordColumnQueryPartList( List<IRecordColumn> listRecordColumn )
236     {
237         List<IRecordColumnQueryPart> listRecordColumnQueryPart = new ArrayList<>( );
238 
239         if ( listRecordColumn != null && !listRecordColumn.isEmpty( ) )
240         {
241             for ( IRecordColumn recordColumn : listRecordColumn )
242             {
243                 IRecordColumnQueryPart recordColumnQueryPart = retrieveRecordColumnQueryPart( recordColumn );
244                 if ( recordColumnQueryPart != null )
245                 {
246                     recordColumnQueryPart.setRecordColumn( recordColumn );
247                     listRecordColumnQueryPart.add( recordColumnQueryPart );
248                 }
249             }
250         }
251 
252         return listRecordColumnQueryPart;
253     }
254 
255     /**
256      * Return the record column query part for the given record column
257      * 
258      * @param recordColumn
259      *            The RecordColumn to build the queries from
260      * @return the record column query part associated to the given record column
261      */
262     private static IRecordColumnQueryPart retrieveRecordColumnQueryPart( IRecordColumn recordColumn )
263     {
264         IRecordColumnQueryPart recordColumnQueryPartResult = null;
265 
266         if ( recordColumn != null )
267         {
268             recordColumnQueryPartResult = new RecordColumnQueryPartFacade( ).getRecordFilterQueryPart( recordColumn );
269         }
270 
271         return recordColumnQueryPartResult;
272     }
273 
274     /**
275      * Build the list of record filter query part for the given list of record filter
276      * 
277      * @param listRecordFilter
278      *            The list of record filter to build the list of record filter query part from
279      * @param listQueryParametersPositionValue
280      *            The list of all parameter values to used to fill the DAOUtil statement
281      * @return the list of record filter query part from the given list of record filter
282      */
283     private static List<IRecordFilterQueryPart> buildRecordFilterQueryPartList( List<IRecordFilter> listRecordFilter,
284             List<String> listQueryParametersPositionValue )
285     {
286         List<IRecordFilterQueryPart> listRecordFilterQueryPart = new ArrayList<>( );
287 
288         if ( listRecordFilter != null && !listRecordFilter.isEmpty( ) )
289         {
290             for ( IRecordFilter recordFilter : listRecordFilter )
291             {
292                 IRecordFilterQueryPart recordFilterQueryPart = retrieveRecordFilterQueryPart( recordFilter, listQueryParametersPositionValue );
293                 if ( recordFilterQueryPart != null )
294                 {
295                     listRecordFilterQueryPart.add( recordFilterQueryPart );
296                 }
297             }
298         }
299 
300         return listRecordFilterQueryPart;
301     }
302 
303     /**
304      * Retrieve the query part for the given filter
305      * 
306      * @param recordFilter
307      *            The RecordFilter to build the query
308      * @param listQueryParametersPositionValue
309      *            The list of all parameter values to used to fill the DAOUtil statement
310      * @return the record filter query part associated to the given record filter
311      */
312     private static IRecordFilterQueryPart retrieveRecordFilterQueryPart( IRecordFilter recordFilter, List<String> listQueryParametersPositionValue )
313     {
314         IRecordFilterQueryPart recordFilterQueryPartResult = null;
315 
316         if ( recordFilter != null )
317         {
318             IRecordFilterQueryPart recordFilterQueryPart = new RecordFilterQueryPartFacade( ).getRecordFilterQueryPart( recordFilter );
319             if ( recordFilterQueryPart != null )
320             {
321                 RecordParameters recordParameters = recordFilter.getRecordParameters( );
322                 recordFilterQueryPart.buildRecordFilterQuery( recordParameters );
323                 recordFilterQueryPartResult = recordFilterQueryPart;
324 
325                 List<String> listUsedParametersValue = recordParameters.getListUsedParametersValue( );
326                 listQueryParametersPositionValue.addAll( listUsedParametersValue );
327             }
328         }
329 
330         return recordFilterQueryPartResult;
331     }
332 }