View Javadoc
1   /*
2    * Copyright (c) 2002-2014, 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.searchstats.web;
35  
36  import fr.paris.lutece.plugins.searchstats.business.QueryRecord;
37  import fr.paris.lutece.plugins.searchstats.business.QueryRecordHome;
38  import fr.paris.lutece.plugins.searchstats.business.RecordCount;
39  import fr.paris.lutece.plugins.searchstats.business.RecordFilter;
40  import fr.paris.lutece.plugins.searchstats.service.TermRecord;
41  import fr.paris.lutece.plugins.searchstats.service.TermRecordService;
42  import fr.paris.lutece.portal.service.i18n.I18nService;
43  import fr.paris.lutece.portal.service.template.AppTemplateService;
44  import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
45  import fr.paris.lutece.portal.web.util.LocalizedPaginator;
46  import fr.paris.lutece.util.html.HtmlTemplate;
47  import fr.paris.lutece.util.html.Paginator;
48  
49  import java.text.SimpleDateFormat;
50  
51  import java.util.ArrayList;
52  import java.util.Calendar;
53  import java.util.GregorianCalendar;
54  import java.util.HashMap;
55  import java.util.List;
56  
57  import javax.servlet.http.HttpServletRequest;
58  
59  
60  /*
61   * This class provides the user interface to manage adminquery features
62   */
63  public class SearchStatsJspBean extends PluginAdminPageJspBean
64  {
65      /////////////////////////////////////////////////////////////////////////////////////////
66      // Constants
67  
68      // Right
69      public static final String RIGHT_MANAGE_SEARCH_STATS = "SEARCH_STATS_MANAGEMENT";
70  
71      //Templates
72      private static final String TEMPLATE_MANAGE_SEARCH_STATS = "admin/plugins/searchstats/manage_searchstats.html";
73  
74      // Boomarks
75      private static final String MARK_DATES = "records_list";
76      private static final String MARK_QUERIES = "queries_list";
77      private static final String MARK_TERMS = "terms_list";
78      private static final String MARK_NO_RESULT_STATE = "no_result_state";
79      private static final String MARK_DISPLAY_DETAILS = "display_details";
80      private static final String MARK_DETAIL_DATE = "detail_date";
81      private static final String MARK_PAGINATOR = "paginator";
82      private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
83  
84      // Parameters
85      private static final String PARAMETER_YEAR = "year";
86      private static final String PARAMETER_MONTH = "month";
87      private static final String PARAMETER_DAY = "day";
88      private static final String PARAMETER_NO_RESULT = "no_result";
89      private static final String PARAMETER_ACTION = "action";
90      private static final String ACTION_VIEW = "view";
91      private static final String ACTION_REFRESH = "refresh";
92      private static final String PARAMETER_PAGE_INDEX_DATES = "page_index_dates";
93      private static final int DEFAULT_ITEMS_PER_PAGE = 20;
94      private static final String PROPERTY_FORMAT_YEAR = "searchstats.format.year";
95      private static final String PROPERTY_FORMAT_MONTH = "searchstats.format.month";
96      private static final String PROPERTY_FORMAT_DAY = "searchstats.format.day";
97      private int _nItemPerPageDates = 0;
98      private String _strPageIndexDates;
99      private boolean _bShowOnlyNoResultQueries;
100 
101     public String manageSearchStats( HttpServletRequest request )
102     {
103         String strYear = request.getParameter( PARAMETER_YEAR );
104         String strMonth = request.getParameter( PARAMETER_MONTH );
105         String strDay = request.getParameter( PARAMETER_DAY );
106         String strAction = request.getParameter( PARAMETER_ACTION );
107         String strNoResultQueries = request.getParameter( PARAMETER_NO_RESULT );
108 
109         RecordFilterchstats/business/RecordFilter.html#RecordFilter">RecordFilter filter = new RecordFilter(  );
110 
111         boolean bDisplayDetails = ( strAction != null ) && ( strAction.equals( ACTION_VIEW ) );
112 
113         if ( strYear != null )
114         {
115             filter.setYear( Integer.parseInt( strYear ) );
116         }
117 
118         if ( strMonth != null )
119         {
120             filter.setMonth( Integer.parseInt( strMonth ) );
121         }
122 
123         if ( strDay != null )
124         {
125             filter.setDay( Integer.parseInt( strDay ) );
126         }
127 
128         if ( ( strAction != null ) && strAction.equals( ACTION_REFRESH ) )
129         {
130             _bShowOnlyNoResultQueries = ( strNoResultQueries != null ) ? true : false;
131         }
132 
133         filter.setNoResults( _bShowOnlyNoResultQueries );
134 
135         List<RecordCount> listDates = QueryRecordHome.findRecordsDatesList( getPlugin(  ), _bShowOnlyNoResultQueries );
136         List<QueryRecord> listQueries;
137 
138         if ( ( strAction != null ) && strAction.equals( ACTION_VIEW ) )
139         {
140             listQueries = QueryRecordHome.findQueryRecordsListByCriteria( getPlugin(  ), filter );
141         }
142         else
143         {
144             listQueries = new ArrayList<QueryRecord>(  );
145         }
146 
147         List<TermRecord> listTopTerms = TermRecordService.getTopTerms( listQueries );
148         String strDetailLabel = getDetailDateLabel( strYear, strMonth, strDay );
149 
150         _nItemPerPageDates = Paginator.getItemsPerPage( request, Paginator.PARAMETER_ITEMS_PER_PAGE,
151                 _nItemPerPageDates, DEFAULT_ITEMS_PER_PAGE );
152         _strPageIndexDates = Paginator.getPageIndex( request, PARAMETER_PAGE_INDEX_DATES, _strPageIndexDates );
153 
154         LocalizedPaginator paginatorDates = new LocalizedPaginator( listDates, _nItemPerPageDates, getHomeUrl( request ),
155                 PARAMETER_PAGE_INDEX_DATES, _strPageIndexDates , getLocale() );
156 
157         HashMap model = new HashMap(  );
158         model.put( MARK_DATES, paginatorDates.getPageItems(  ) );
159         model.put( MARK_PAGINATOR, paginatorDates );
160         model.put( MARK_NB_ITEMS_PER_PAGE, "" + _nItemPerPageDates );
161         model.put( MARK_DISPLAY_DETAILS, bDisplayDetails );
162         model.put( MARK_DETAIL_DATE, strDetailLabel );
163         model.put( MARK_QUERIES, listQueries );
164         model.put( MARK_TERMS, listTopTerms );
165         model.put( MARK_NO_RESULT_STATE, _bShowOnlyNoResultQueries ? "checked=\"on\"" : "" );
166 
167         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_SEARCH_STATS, getLocale(  ), model );
168 
169         return getAdminPage( template.getHtml(  ) );
170     }
171 
172     private String getDetailDateLabel( String strYear, String strMonth, String strDay )
173     {
174         String strDateLabel = "";
175 
176         Calendar c = new GregorianCalendar(  );
177 
178         if ( strYear != null )
179         {
180             String strPattern;
181             c.set( Calendar.YEAR, Integer.parseInt( strYear ) );
182 
183             if ( strMonth != null )
184             {
185                 c.set( Calendar.MONTH, Integer.parseInt( strMonth ) - 1 );
186 
187                 if ( strDay != null )
188                 {
189                     c.set( Calendar.DAY_OF_MONTH, Integer.parseInt( strDay ) );
190                     strPattern = I18nService.getLocalizedString( PROPERTY_FORMAT_DAY, getLocale(  ) );
191                 }
192                 else
193                 {
194                     strPattern = I18nService.getLocalizedString( PROPERTY_FORMAT_MONTH, getLocale(  ) );
195                 }
196             }
197             else
198             {
199                 strPattern = I18nService.getLocalizedString( PROPERTY_FORMAT_YEAR, getLocale(  ) );
200             }
201 
202             strDateLabel = getFormattedDate( c, strPattern );
203         }
204 
205         return strDateLabel;
206     }
207 
208     private String getFormattedDate( Calendar c, String strFormatPattern )
209     {
210         SimpleDateFormat formatter = new SimpleDateFormat( strFormatPattern, getLocale(  ) );
211 
212         return formatter.format( c.getTime(  ) );
213     }
214 }