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.rss.web;
35  
36  import fr.paris.lutece.plugins.rss.business.RssFeed;
37  import fr.paris.lutece.plugins.rss.business.RssFeedHome;
38  import fr.paris.lutece.plugins.rss.business.parameter.RssFeedParameterHome;
39  import fr.paris.lutece.plugins.rss.business.portlet.RssPortletHome;
40  import fr.paris.lutece.plugins.rss.service.RssContentLoader;
41  import fr.paris.lutece.plugins.rss.service.RssContentService;
42  import fr.paris.lutece.plugins.rss.service.RssParsingException;
43  import fr.paris.lutece.portal.business.portlet.PortletType;
44  import fr.paris.lutece.portal.business.portlet.PortletTypeHome;
45  import fr.paris.lutece.portal.business.rbac.RBAC;
46  import fr.paris.lutece.portal.business.style.Style;
47  import fr.paris.lutece.portal.business.style.StyleHome;
48  import fr.paris.lutece.portal.business.user.AdminUser;
49  import fr.paris.lutece.portal.service.admin.AccessDeniedException;
50  import fr.paris.lutece.portal.service.i18n.I18nService;
51  import fr.paris.lutece.portal.service.message.AdminMessage;
52  import fr.paris.lutece.portal.service.message.AdminMessageService;
53  import fr.paris.lutece.portal.service.rbac.RBACService;
54  import fr.paris.lutece.portal.service.template.AppTemplateService;
55  import fr.paris.lutece.portal.service.user.AdminUserResourceIdService;
56  import fr.paris.lutece.portal.service.util.AppLogService;
57  import fr.paris.lutece.portal.service.util.AppPropertiesService;
58  import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
59  import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
60  import fr.paris.lutece.portal.web.constants.Messages;
61  import fr.paris.lutece.util.ReferenceItem;
62  import fr.paris.lutece.util.ReferenceList;
63  import fr.paris.lutece.util.html.HtmlTemplate;
64  import fr.paris.lutece.util.html.Paginator;
65  import fr.paris.lutece.util.url.UrlItem;
66  
67  import org.apache.commons.lang3.StringUtils;
68  
69  import java.util.Collection;
70  import java.util.HashMap;
71  import java.util.List;
72  import java.util.Map;
73  
74  import javax.servlet.http.HttpServletRequest;
75  
76  
77  /**
78   *
79   * @author Pierre
80   */
81  public class RssFeedsJspBean extends PluginAdminPageJspBean
82  {
83      public static final String RIGHT_RSS_FEEDS_MANAGEMENT = "RSS_FEEDS_MANAGEMENT";
84  
85      // Templates
86      private static final String TEMPLATE_FEEDS = "admin/plugins/rss/manage_rss_feeds.html";
87      private static final String TEMPLATE_CREATE_RSS_FEED = "admin/plugins/rss/create_rss_feed.html";
88      private static final String TEMPLATE_MODIFY_RSS_FEED = "admin/plugins/rss/modify_rss_feed.html";
89      private static final String TEMPLATE_MANAGE_ADVANCED_PARAMETERS = "admin/plugins/rss/manage_advanced_parameters.html";
90  
91      // Parameters
92      private static final String PARAMETER_RSS_FEED_ID = "id_rss_feed";
93      private static final String PARAMETER_RSS_FEED_NAME = "rss_feed_name";
94      private static final String PARAMETER_RSS_FEED_URL = "rss_feed_url";
95      private static final String PARAMETER_RSS_FEED_IS_ACTIVE = "rss_feed_is_active";
96      private static final String PARAMETER_RSS_FEED_NEW_ORDER = "new_order";
97      private static final String PARAMETER_PAGE_INDEX_ACTIVE = "page_index_active";
98      private static final String PARAMETER_ITEMS_PER_PAGE_ACTIVE = "items_per_page_active";
99      private static final String PARAMETER_PAGE_INDEX_INACTIVE = "page_index_inactive";
100     private static final String PARAMETER_ITEMS_PER_PAGE_INACTIVE = "items_per_page_inactive";
101     private static final String PARAMETER_WORKGROUP_KEY = "workgroup_key";
102     private static final String PARAMETER_INCLUDE_STYLE = "rss_style";
103 
104     // Properties
105     private static final String PROPERTY_PAGE_TITLE_FEEDS = "rss.manage_rss_feeds.pageTitle";
106     private static final String PROPERTY_PAGE_TITLE_CREATE = "rss.create_rss_feed.pageTitle";
107     private static final String PROPERTY_PAGE_TITLE_MODIFY = "rss.modify_rss_feed.pageTitle";
108     private static final String PROPERTY_RSS_PER_PAGE = "rss.rssPerPage";
109     private static final String PROPERTY_RSS_INCLUDE_BEGIN = "rss.manage_rss_feeds.include.begin";
110     private static final String PROPERTY_RSS_INCLUDE_END = "rss.manage_rss_feeds.include.end";
111 
112     //Bookmarks
113     private static final String MARK_ACTIVE_RSS_FEEDS_LIST = "active_rss_feeds_list";
114     private static final String MARK_INACTIVE_RSS_FEEDS_LIST = "inactive_rss_feeds_list";
115     private static final String MARK_RSS_FEED = "rss_feed";
116     private static final String MARK_NB_ACTIVE_RSS_FEED = "nb_active_rss_feed";
117     private static final String MARK_PAGINATOR_ACTIVE = "paginator_active";
118     private static final String MARK_NB_ITEMS_PER_PAGE_ACTIVE = "nb_items_per_page_active";
119     private static final String MARK_PAGINATOR_INACTIVE = "paginator_inactive";
120     private static final String MARK_NB_ITEMS_PER_PAGE_INACTIVE = "nb_items_per_page_inactive";
121     private static final String MARK_USER_WORKGROUP_LIST = "user_workgroup_list";
122     private static final String MARK_WORKGROUP_SELECTED = "selected_workgroup";
123     private static final String MARK_RSS_INCLUDE_TAG = "rss_include_tag";
124     private static final String MARK_LIST_STYLE_RSS = "rss_style_list";
125     private static final String MARK_PERMISSION_ADVANCED_PARAMETER = "permission_advanced_parameter";
126 
127     // JSP
128     private static final String JSP_DELETE_RSS_FEED = "jsp/admin/plugins/rss/DoDeleteRssFeed.jsp";
129     private static final String JSP_ACTIVATE_RSS_FEED = "jsp/admin/plugins/rss/DoActivateRssFeed.jsp";
130 
131     //Messages
132     private static final String MESSAGE_CONFIRM_DELETE_RSS_FEED = "rss.message.confirmDeleteRssFeed";
133     private static final String MESSAGE_RSS_LINKED_PORTLET = "rss.message.linkedToPortlet";
134     private static final String MESSAGE_ACCESS_DENIED = "rss.message.accesDenied";
135 
136     //Constante
137     private static final String CONSTANTE_RSS_PORTLET_TYPE = "RSS_PORTLET";
138     private static final String ZERO = "0";
139     private static final String TRUE = "true";
140 
141     //Variables
142     private int _nItemsPerPageActive;
143     private String _strCurrentPageIndexActive;
144     private int _nItemsPerPageInactive;
145     private String _strCurrentPageIndexInactive;
146 
147     /**
148      * Returns external rss feeds management form
149      *
150      * @param request The Http request
151      * @return Html form
152      */
153     public String getManageRssFeeds( HttpServletRequest request )
154     {
155         setPageTitleProperty( PROPERTY_PAGE_TITLE_FEEDS );
156         _nItemsPerPageActive = getItemsPerPage( request, true );
157         _strCurrentPageIndexActive = getPageIndex( request, true );
158         _nItemsPerPageInactive = getItemsPerPage( request, false );
159         _strCurrentPageIndexInactive = getPageIndex( request, false );
160 
161         List<RssFeed> listRssFeedActive = RssFeedHome.getRssFeeds( true );
162         int nActiveRssFeeds = listRssFeedActive.size(  );
163         listRssFeedActive = (List<RssFeed>) AdminWorkgroupService.getAuthorizedCollection( listRssFeedActive,
164                 getUser(  ) );
165 
166         HashMap<String, Object> model = new HashMap<String, Object>(  );
167         String strIncludeBegin = I18nService.getLocalizedString( PROPERTY_RSS_INCLUDE_BEGIN, getLocale(  ) );
168         String strIncludeEnd = I18nService.getLocalizedString( PROPERTY_RSS_INCLUDE_END, getLocale(  ) );
169 
170         for ( RssFeed rssFeed : listRssFeedActive )
171         {
172             String strRssMarker = strIncludeBegin + RssFeedInclude.getRssMarkerPrefix(  ) +
173                 String.valueOf( rssFeed.getId(  ) ) + strIncludeEnd;
174             rssFeed.setIncludeTag( strRssMarker );
175         }
176 
177         boolean bPermissionAdvancedParameter = RBACService.isAuthorized( AdminUser.RESOURCE_TYPE,
178                 RBAC.WILDCARD_RESOURCES_ID, AdminUserResourceIdService.PERMISSION_MANAGE_ADVANCED_PARAMETERS,
179                 getUser(  ) );
180 
181         Paginator paginator_active = new Paginator( listRssFeedActive, _nItemsPerPageActive, getHomeUrl( request ),
182                 PARAMETER_PAGE_INDEX_ACTIVE, _strCurrentPageIndexActive );
183 
184         List<RssFeed> listRssFeedInactive = RssFeedHome.getRssFeeds( false );
185         listRssFeedInactive = (List<RssFeed>) AdminWorkgroupService.getAuthorizedCollection( listRssFeedInactive,
186                 getUser(  ) );
187 
188         Paginator paginator_inactive = new Paginator( listRssFeedInactive, _nItemsPerPageInactive,
189                 getHomeUrl( request ), PARAMETER_PAGE_INDEX_INACTIVE, _strCurrentPageIndexInactive );
190 
191         model.put( MARK_PAGINATOR_ACTIVE, paginator_active );
192         model.put( MARK_PAGINATOR_INACTIVE, paginator_inactive );
193         model.put( MARK_NB_ITEMS_PER_PAGE_ACTIVE, "" + _nItemsPerPageActive );
194         model.put( MARK_NB_ITEMS_PER_PAGE_INACTIVE, "" + _nItemsPerPageInactive );
195         model.put( MARK_ACTIVE_RSS_FEEDS_LIST, paginator_active.getPageItems(  ) );
196         model.put( MARK_INACTIVE_RSS_FEEDS_LIST, paginator_inactive.getPageItems(  ) );
197         model.put( MARK_NB_ACTIVE_RSS_FEED, Integer.toString( nActiveRssFeeds ) );
198         model.put( MARK_PERMISSION_ADVANCED_PARAMETER, bPermissionAdvancedParameter );
199 
200         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_FEEDS, getLocale(  ), model );
201 
202         return getAdminPage( templateList.getHtml(  ) );
203     }
204 
205     /**
206      * Confirms the removal of a feed
207      *
208      * @param request The Http request
209      * @return The Jsp URL of the process result
210      */
211     public String doConfirmDeleteRssFeed( HttpServletRequest request )
212     {
213         String strIdFeed = request.getParameter( PARAMETER_RSS_FEED_ID );
214         int nIdFeed = Integer.parseInt( strIdFeed );
215         String strActive = request.getParameter( PARAMETER_RSS_FEED_IS_ACTIVE );
216         UrlItem deleteUrl = new UrlItem( JSP_DELETE_RSS_FEED );
217         deleteUrl.addParameter( PARAMETER_RSS_FEED_ID, strIdFeed );
218         deleteUrl.addParameter( PARAMETER_RSS_FEED_IS_ACTIVE, strActive );
219 
220         String strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_RSS_LINKED_PORTLET, AdminMessage.TYPE_STOP );
221 
222         if ( checkNoPortletLinked( nIdFeed ) )
223         {
224             RssFeed rss = RssFeedHome.findByPrimaryKey( nIdFeed, strActive.equalsIgnoreCase( TRUE ) );
225             Object[] messageArgs = { rss.getName(  ) };
226             strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_DELETE_RSS_FEED, messageArgs,
227                     deleteUrl.getUrl(  ), AdminMessage.TYPE_CONFIRMATION );
228         }
229 
230         return strUrl;
231     }
232 
233     /**
234      * Confirms the De/activation of a feed
235      *
236      * @param request The Http request
237      * @return The Jsp URL of the process result
238      */
239     public String doConfirmActivateRssFeed( HttpServletRequest request )
240     {
241         String strIdFeed = request.getParameter( PARAMETER_RSS_FEED_ID );
242         int nIdFeed = Integer.parseInt( strIdFeed );
243         String strActive = request.getParameter( PARAMETER_RSS_FEED_IS_ACTIVE );
244         UrlItem activateUrl = new UrlItem( JSP_ACTIVATE_RSS_FEED );
245         activateUrl.addParameter( PARAMETER_RSS_FEED_ID, strIdFeed );
246         activateUrl.addParameter( PARAMETER_RSS_FEED_IS_ACTIVE, strActive );
247 
248         String strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_RSS_LINKED_PORTLET, AdminMessage.TYPE_STOP );
249 
250         if ( checkNoPortletLinked( nIdFeed ) )
251         {
252             RssFeed rss = RssFeedHome.findByPrimaryKey( nIdFeed, strActive.equalsIgnoreCase( TRUE ) );
253             Object[] messageArgs = { rss.getName(  ) };
254             strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_DELETE_RSS_FEED, messageArgs,
255                     activateUrl.getUrl(  ), AdminMessage.TYPE_CONFIRMATION );
256         }
257 
258         return strUrl;
259     }
260 
261     /**
262      * Returns the creation form of a feed
263      *
264      * @param request The Http request
265      * @return Html form
266      */
267     public String getCreateRssFeed( HttpServletRequest request )
268     {
269         setPageTitleProperty( PROPERTY_PAGE_TITLE_CREATE );
270 
271         HashMap<String, Object> model = new HashMap<String, Object>(  );
272         ReferenceList refListWorkGroups = AdminWorkgroupService.getUserWorkgroups( getUser(  ), getLocale(  ) );
273 
274         ReferenceList refListStyleRss = getStyleList(  );
275 
276         model.put( MARK_LIST_STYLE_RSS, refListStyleRss );
277         model.put( MARK_USER_WORKGROUP_LIST, refListWorkGroups );
278 
279         //RSS-24 : the first workgroup will be selected by default
280         if ( !refListWorkGroups.isEmpty(  ) )
281         {
282             model.put( MARK_WORKGROUP_SELECTED, refListWorkGroups.get( 0 ).getCode(  ) );
283         }
284 
285         for ( ReferenceItem param : RssFeedParameterHome.findAll( getPlugin(  ) ) )
286         {
287             model.put( param.getCode(  ), param.getName(  ) );
288         }
289 
290         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_RSS_FEED, getLocale(  ), model );
291 
292         return getAdminPage( template.getHtml(  ) );
293     }
294 
295     /**
296      * Process the data capture form of a new rss feed
297      *
298      * @param request The Http Request
299      * @return The Jsp URL of the process result
300      */
301     public String doCreateRssFeed( HttpServletRequest request )
302     {
303         String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP_KEY );
304         String strIdIncludeStyle = request.getParameter( PARAMETER_INCLUDE_STYLE );
305         boolean bActive = request.getParameter( PARAMETER_RSS_FEED_IS_ACTIVE ).equalsIgnoreCase( TRUE );
306 
307         RssFeedins/rss/business/RssFeed.html#RssFeed">RssFeed rss = new RssFeed(  );
308         rss.setName( request.getParameter( PARAMETER_RSS_FEED_NAME ) );
309         rss.setUrl( request.getParameter( PARAMETER_RSS_FEED_URL ) );
310         rss.setWorkgroup( strWorkgroup );
311         rss.setIdIncludeStyle( Integer.parseInt( strIdIncludeStyle ) );
312         rss.setIsActive( bActive );
313 
314         // Mandatory fields
315         if ( request.getParameter( PARAMETER_RSS_FEED_NAME ).equals( "" ) ||
316                 request.getParameter( PARAMETER_RSS_FEED_URL ).equals( "" ) )
317         {
318             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
319         }
320 
321         RssFeedHome.create( rss );
322 
323         // Load the content to fetch the RSS feed a first time
324         if ( bActive )
325         {
326             RssContentService.getInstance(  ).getRssContent( rss.getId(  ) );
327         }
328 
329         return getHomeUrl( request );
330     }
331 
332     /**
333      * Process modification of a feed
334      * @param request The Http request
335      * @return String The url of the administration console
336      */
337     public String doModifyRssFeed( HttpServletRequest request )
338     {
339         int nId = Integer.parseInt( request.getParameter( PARAMETER_RSS_FEED_ID ) );
340         String strFeedUrl = request.getParameter( PARAMETER_RSS_FEED_URL );
341         String strFeedName = request.getParameter( PARAMETER_RSS_FEED_NAME );
342         String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP_KEY );
343         String strIdIncludeStyle = request.getParameter( PARAMETER_INCLUDE_STYLE );
344         boolean bActive = request.getParameter( PARAMETER_RSS_FEED_IS_ACTIVE ).equalsIgnoreCase( TRUE );
345 
346         RssFeed rss = RssFeedHome.findByPrimaryKey( nId, bActive );
347         rss.setName( strFeedName );
348         rss.setUrl( strFeedUrl );
349         rss.setWorkgroup( strWorkgroup );
350         rss.setIdIncludeStyle( Integer.parseInt( strIdIncludeStyle ) );
351 
352         // Mandatory fields
353         if ( request.getParameter( PARAMETER_RSS_FEED_URL ).equals( "" ) ||
354                 request.getParameter( PARAMETER_RSS_FEED_NAME ).equals( "" ) )
355         {
356             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
357         }
358 
359         RssFeedHome.update( rss );
360 
361         return getHomeUrl( request );
362     }
363 
364     /**
365      * Returns the form to update info about a rss feed
366      *
367      * @param request The Http request
368      * @return The HTML form to update info
369      */
370     public String getModifyRssFeed( HttpServletRequest request )
371     {
372         setPageTitleProperty( PROPERTY_PAGE_TITLE_MODIFY );
373 
374         HashMap<String, Object> model = new HashMap<String, Object>(  );
375 
376         ReferenceList refListWorkGroups = AdminWorkgroupService.getUserWorkgroups( getUser(  ), getLocale(  ) );
377         model.put( MARK_USER_WORKGROUP_LIST, refListWorkGroups );
378 
379         ReferenceList refListStyleRss = getStyleList(  );
380         model.put( MARK_LIST_STYLE_RSS, refListStyleRss );
381 
382         int nId = Integer.parseInt( request.getParameter( PARAMETER_RSS_FEED_ID ) );
383         boolean bActive = TRUE.equalsIgnoreCase( request.getParameter( PARAMETER_RSS_FEED_IS_ACTIVE ) );
384         RssFeed rssFeed = RssFeedHome.findByPrimaryKey( nId, bActive );
385         model.put( MARK_RSS_FEED, rssFeed );
386 
387         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_RSS_FEED, getLocale(  ), model );
388 
389         return getAdminPage( template.getHtml(  ) );
390     }
391 
392     /**
393      * Process removal of a feed
394      * @param request The Http request
395      * @return String The url of the administration console
396      */
397     public String doDeleteRssFeed( HttpServletRequest request )
398     {
399         int nId = Integer.parseInt( request.getParameter( PARAMETER_RSS_FEED_ID ) );
400         boolean bActive = request.getParameter( PARAMETER_RSS_FEED_IS_ACTIVE ).equalsIgnoreCase( TRUE );
401         RssFeed rssFeed = RssFeedHome.findByPrimaryKey( nId, bActive );
402         RssFeedHome.remove( rssFeed );
403 
404         return getHomeUrl( request );
405     }
406 
407     /**
408      * Process reloading of an active feed
409      * @param request The Http request
410      * @return String The url of the administration console
411      */
412     public String doFetchRssFeed( HttpServletRequest request )
413     {
414         int nId = Integer.parseInt( request.getParameter( PARAMETER_RSS_FEED_ID ) );
415 
416         try
417         {
418             RssContentLoader.fetchRssFeed( nId );
419         }
420         catch ( RssParsingException ex )
421         {
422             AppLogService.error( ex.getMessage(  ), ex );
423         }
424 
425         return getHomeUrl( request );
426     }
427 
428     /**
429      * Process Des/activation of a feed
430      * @param request The Http request
431      * @return String The url of the administration console
432      */
433     public String doActivateRssFeed( HttpServletRequest request )
434     {
435         int nId = Integer.parseInt( request.getParameter( PARAMETER_RSS_FEED_ID ) );
436         boolean bActive = request.getParameter( PARAMETER_RSS_FEED_IS_ACTIVE ).equalsIgnoreCase( TRUE );
437 
438         RssFeed rssFeed = RssFeedHome.findByPrimaryKey( nId, bActive );
439 
440         //Deactivate the feed
441         RssFeedHome.setActive( rssFeed, !bActive );
442 
443         return getHomeUrl( request );
444     }
445 
446     /**
447      * Change the order of an active feed in the list
448      * @param request The Http request
449      * @return String The url of the administration console
450      */
451     public String doChangeRssFeedOrder( HttpServletRequest request )
452     {
453         int nId = Integer.parseInt( request.getParameter( PARAMETER_RSS_FEED_ID ) );
454         int nNewOrder = Integer.parseInt( request.getParameter( PARAMETER_RSS_FEED_NEW_ORDER ) );
455 
456         RssFeed rssFeed = RssFeedHome.findByPrimaryKey( nId, true );
457 
458         RssFeedHome.updateOrder( rssFeed, nNewOrder );
459 
460         return getHomeUrl( request );
461     }
462 
463     /**
464      * Used by the paginator to fetch a number of items
465      * @param request The HttpRequest
466      * @param bActive <code>true</code> to get the number of items for the active feed list
467      * @return The number of items
468      */
469     private int getItemsPerPage( HttpServletRequest request, boolean bActive )
470     {
471         int nItemsPerPage;
472         String strItemsPerPage = request.getParameter( ( bActive ? PARAMETER_ITEMS_PER_PAGE_ACTIVE
473                                                                  : PARAMETER_ITEMS_PER_PAGE_INACTIVE ) );
474 
475         if ( strItemsPerPage != null )
476         {
477             nItemsPerPage = Integer.parseInt( strItemsPerPage );
478         }
479         else
480         {
481             if ( ( bActive ? _nItemsPerPageActive : _nItemsPerPageInactive ) != 0 )
482             {
483                 nItemsPerPage = ( bActive ? _nItemsPerPageActive : _nItemsPerPageInactive );
484             }
485             else
486             {
487                 nItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_RSS_PER_PAGE, 10 );
488             }
489         }
490 
491         return nItemsPerPage;
492     }
493 
494     /**
495      * Fetches the page index
496      * @param request The HttpRequest
497      * @param bActive <code>true</code> to get the page index for the active feed list
498      * @return The PageIndex
499      */
500     private String getPageIndex( HttpServletRequest request, boolean bActive )
501     {
502         String strPageIndex = request.getParameter( bActive ? PARAMETER_PAGE_INDEX_ACTIVE : PARAMETER_PAGE_INDEX_INACTIVE );
503         strPageIndex = ( strPageIndex != null ) ? strPageIndex
504                                                 : ( bActive ? _strCurrentPageIndexActive : _strCurrentPageIndexInactive );
505 
506         return strPageIndex;
507     }
508 
509     /**
510      * Checks if the feed is linked to a portlet
511      * @param nIdRssFeed The id of the rss feed
512      * @return boolean
513      */
514     public boolean checkNoPortletLinked( int nIdRssFeed )
515     {
516         return RssPortletHome.checkNoPortletLinked( nIdRssFeed );
517     }
518 
519     /**
520      * Return the reference list for rss style
521      * @return the reference list for rss style
522      */
523     public ReferenceList getStyleList(  )
524     {
525         Collection<Style> stylesList = StyleHome.getStylesList(  );
526 
527         ReferenceList stylesListWithLabels = new ReferenceList(  );
528 
529         stylesListWithLabels.addItem( -1, "-Aucun style-" );
530 
531         for ( Style style : stylesList )
532         {
533             PortletType portletType = PortletTypeHome.findByPrimaryKey( style.getPortletTypeId(  ) );
534 
535             if ( ( portletType.getId(  ) != null ) && portletType.getId(  ).equals( CONSTANTE_RSS_PORTLET_TYPE ) )
536             {
537                 stylesListWithLabels.addItem( style.getId(  ), style.getDescription(  ) );
538             }
539         }
540 
541         return stylesListWithLabels;
542     }
543 
544     /**
545      * Return RSS advanced parameters
546      * @param request The Http request
547      * @return Html form
548      */
549     public String getManageAdvancedParameters( HttpServletRequest request )
550         throws AccessDeniedException
551     {
552         if ( !RBACService.isAuthorized( AdminUser.RESOURCE_TYPE, RBAC.WILDCARD_RESOURCES_ID,
553                     AdminUserResourceIdService.PERMISSION_MANAGE_ADVANCED_PARAMETERS, getUser(  ) ) )
554         {
555             throw new AccessDeniedException( MESSAGE_ACCESS_DENIED );
556         }
557 
558         Map<String, Object> model = new HashMap<>(  );
559 
560         for ( ReferenceItem param : RssFeedParameterHome.findAll( getPlugin(  ) ) )
561         {
562             model.put( param.getCode(  ), param.getName(  ) );
563         }
564 
565         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MANAGE_ADVANCED_PARAMETERS, getLocale(  ),
566                 model );
567 
568         return getAdminPage( template.getHtml(  ) );
569     }
570 
571     /**
572      * Modify RSS feed parameters default values
573      * @param request the request
574      * @return JSP return to the feature home
575      * @throws AccessDeniedException if the user is not authorized to manage advanced parameters
576      */
577     public String doModifyRssAdvancedParameters( HttpServletRequest request )
578         throws AccessDeniedException
579     {
580         if ( !RBACService.isAuthorized( AdminUser.RESOURCE_TYPE, RBAC.WILDCARD_RESOURCES_ID,
581                     AdminUserResourceIdService.PERMISSION_MANAGE_ADVANCED_PARAMETERS, getUser(  ) ) )
582         {
583             throw new AccessDeniedException( MESSAGE_ACCESS_DENIED );
584         }
585 
586         for ( ReferenceItem param : RssFeedParameterHome.findAll( getPlugin(  ) ) )
587         {
588             String strParamValue = request.getParameter( param.getCode(  ) );
589             param.setName( StringUtils.isBlank( strParamValue ) ? ZERO : strParamValue );
590             RssFeedParameterHome.update( param, getPlugin(  ) );
591         }
592 
593         return getHomeUrl( request );
594     }
595 }