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.document.service.publishing.PublishingService;
37  import fr.paris.lutece.plugins.rss.business.RssFeedHome;
38  import fr.paris.lutece.plugins.rss.business.RssGeneratedFile;
39  import fr.paris.lutece.plugins.rss.business.RssGeneratedFileHome;
40  import fr.paris.lutece.plugins.rss.service.RssGeneratorService;
41  import fr.paris.lutece.plugins.rss.service.RssService;
42  import fr.paris.lutece.portal.business.portlet.Portlet;
43  import fr.paris.lutece.portal.business.rss.IResourceRss;
44  import fr.paris.lutece.portal.service.message.AdminMessage;
45  import fr.paris.lutece.portal.service.message.AdminMessageService;
46  import fr.paris.lutece.portal.service.portlet.PortletService;
47  import fr.paris.lutece.portal.service.template.AppTemplateService;
48  import fr.paris.lutece.portal.service.util.AppLogService;
49  import fr.paris.lutece.portal.service.util.AppPathService;
50  import fr.paris.lutece.portal.service.util.AppPropertiesService;
51  import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
52  import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
53  import fr.paris.lutece.portal.web.constants.Messages;
54  import fr.paris.lutece.util.ReferenceList;
55  import fr.paris.lutece.util.filesystem.UploadUtil;
56  import fr.paris.lutece.util.html.HtmlTemplate;
57  import fr.paris.lutece.util.html.Paginator;
58  
59  import org.apache.commons.lang3.StringUtils;
60  
61  import java.util.Arrays;
62  import java.util.Collection;
63  import java.util.HashMap;
64  import java.util.List;
65  import java.util.Map;
66  
67  import javax.servlet.http.HttpServletRequest;
68  
69  
70  /**
71   * This class provides the user interface to manage pushrss objects
72   * features ( publishing, unselecting, ... )
73   */
74  public class RssJspBean extends PluginAdminPageJspBean
75  {
76      /////////////////////////////////////////////////////////////////////////////////
77      // Constants
78      public static final String RIGHT_RSS_MANAGEMENT = "RSS_MANAGEMENT";
79      private static final String PARAMETER_PUSH_RSS_PORTLET_ID = "rss_portlet_id";
80      private static final String PARAMETER_PUSH_RSS_ID = "rss_id";
81      private static final String PARAMETER_PUSH_RSS_NAME = "rss_name";
82      private static final String PARAMETER_PUSH_RSS_MAX_ITEMS = "rss_max_items";
83      private static final String PARAMETER_PUSH_RSS_ENCODING = "rss_encoding";
84      private static final String PARAMETER_PUSH_RSS_FEED_TYPE = "rss_feed_type";
85      private static final String PARAMETER_PUSH_RSS_DESCRIPTION = "rss_description";
86      private static final String PARAMETER_RSS_TYPE = "rss_type";
87      private static final String PARAMETER_RSS_RESOURCE_KEY = "rss_resource_key";
88      private static final String PARAMETER_PAGE_INDEX = "page_index";
89      private static final String PARAMETER_ITEMS_PER_PAGE = "items_per_page";
90      private static final String PARAMETER_WORKGROUP_KEY = "workgroup_key";
91      private static final String PARAMETER_CANCEL = "cancel";
92      private static final String PARAMETER_APPLY = "apply";
93      private static final String TEMPLATE_MANAGE_RSS_FILE = "admin/plugins/rss/manage_rss_file.html";
94      private static final String TEMPLATE_CREATE_PUSH_RSS_FILE = "admin/plugins/rss/create_rss_file.html";
95      private static final String TEMPLATE_CREATE_PUSH_RSS_FILE_PORTLET = "admin/plugins/rss/create_rss_file_portlet.html";
96      private static final String TEMPLATE_CREATE_PUSH_RSS_FILE_RESOURCE = "admin/plugins/rss/create_rss_file_resource.html";
97      private static final String TEMPLATE_MODIFY_PUSH_RSS_FILE_PORTLET = "admin/plugins/rss/modify_rss_file_portlet.html";
98      private static final String TEMPLATE_MODIFY_PUSH_RSS_FILE_RESOURCE = "admin/plugins/rss/modify_rss_file_resource.html";
99      private static final String MARK_RSS_FILE = "rssFile";
100     private static final String MARK_PUSH_RSS_LIST = "rss_files_list";
101     private static final String MARK_PUSH_RSS_URL = "rss_file_url";
102     private static final String MARK_PORTLET_LIST = "portlet_list";
103     private static final String MARK_RESOURCE_LIST = "resource_list";
104     private static final String MARK_PAGINATOR = "paginator";
105     private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
106     private static final String MARK_USER_WORKGROUP_LIST = "user_workgroup_list";
107     private static final String MARK_ENCODING_LIST = "encoding_list";
108     private static final String MARK_FEED_TYPE_LIST = "feed_type_list";
109     private static final String MARK_WORKGROUP_SELECTED = "selected_workgroup";
110     private static final String MARK_RSS_TYPE = "rss_type";
111     private static final String MARK_RSS_NAME = "rss_name";
112     private static final String MARK_RSS_MAX_ITEMS = "rss_max_items";
113     private static final String MARK_RSS_ENCODING = "rss_encoding";
114     private static final String MARK_RSS_FEED_TYPE = "rss_feed_type";
115     private static final String MARK_RESOURCE_RSS = "resource_rss";
116     private static final String MARK_RESOURCE_RSS_CONFIG = "resource_rss_config";
117     private static final int STATE_OK = 0;
118     private static final int STATE_PORTLET_MISSING = 1;
119     private static final String PROPERTY_PATH_PLUGIN_WAREHOUSE = "path.plugins.warehouse";
120     private static final String PROPERTY_FILE_TYPE = "rss.file.type";
121     private static final String PROPERTY_NAME_MAX_LENGTH = "rss.name.max.length";
122     private static final String PROPERTY_PAGE_TITLE_FILES = "rss.manage_rss_file.pageTitle";
123     private static final String PROPERTY_PAGE_TITLE_CREATE = "rss.create_rss_file.pageTitle";
124     private static final String PROPERTY_PAGE_TITLE_MODIFY = "rss.modify_rss_file.pageTitle";
125     private static final String PROPERTY_RSS_PER_PAGE = "rss.rssPerPage";
126     private static final String PROPERTY_RSS_ENCODING = "rss.encoding";
127     private static final String PROPERTY_RSS_FEED_TYPE = "rss.feedType";
128 
129     //Messages
130     private static final String MESSAGE_FILENAME_TOO_LONG = "rss.message.filenameTooLong";
131     private static final String MESSAGE_FILENAME_ALREADY_EXISTS = "rss.message.filenameAlreadyExists";
132     private static final String MESSAGE_NO_DOCUMENT_PORTLET = "rss.message.NoDocumentPortlet";
133     private static final String MESSAGE_RESOURCE = "rss.message.noResource";
134     private static final String MESSAGE_CONFIRM_DELETE_RSS_FILE = "rss.message.confirmRemoveRssFile";
135     private static final String MESSAGE_RSS_LINKED_FEED = "rss.message.linkedToFeed";
136     private static final String MESSAGE_MAX_ITEMS = "rss.message.maxItems";
137     private static final String MESSAGE_NO_ENCODING = "rss.message.noEncoding";
138     private static final String MESSAGE_NO_FEED_TYPE = "rss.message.noFeedType";
139 
140     //JSPs
141     private static final String JSP_CREATE_RESOURCE_RSS_FILE = "jsp/admin/plugins/rss/DoCreateRssFile.jsp";
142     private static final String JSP_MODIFY_RESOURCE_RSS_FILE = "jsp/admin/plugins/rss/ModifyRssFile.jsp";
143     private static final String JSP_MANAGE_RSS_FILE = "jsp/admin/plugins/rss/ManageRssFiles.jsp";
144     private static final String JSP_DELETE_RSS_FILE = "jsp/admin/plugins/rss/DoDeleteRssFile.jsp";
145     private static final String REGEX_ID = "^[\\d]+$";
146     private static final String WORKGROUP_ALL = "all";
147     private static final String STRING_EMPTY = "";
148     private static final String PORTLET = "portlet";
149     private static final String RESOURCE_RSS = "resourceRss";
150     private int _nItemsPerPage;
151     private String _strCurrentPageIndex;
152 
153     /**
154      * Returns  rss files management form
155      *
156      * @param request The Http request
157      * @return Html form
158      */
159     public String getManageRssFile( HttpServletRequest request ) //Implement paginator
160     {
161         setPageTitleProperty( PROPERTY_PAGE_TITLE_FILES );
162         _nItemsPerPage = getItemsPerPage( request );
163         _strCurrentPageIndex = getPageIndex( request );
164 
165         List<RssGeneratedFile> listRssFileList = RssGeneratedFileHome.getRssFileList(  );
166         listRssFileList = (List<RssGeneratedFile>) AdminWorkgroupService.getAuthorizedCollection( listRssFileList,
167                 getUser(  ) );
168 
169         Paginator paginator = new Paginator( listRssFileList, _nItemsPerPage, getHomeUrl( request ),
170                 PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
171         HashMap<String, Object> model = new HashMap<String, Object>(  );
172         model.put( MARK_PAGINATOR, paginator );
173         model.put( MARK_NB_ITEMS_PER_PAGE, "" + _nItemsPerPage );
174         model.put( MARK_PUSH_RSS_LIST, paginator.getPageItems(  ) );
175         model.put( MARK_PUSH_RSS_URL, getRssFileUrl( "", request ) );
176 
177         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MANAGE_RSS_FILE, getLocale(  ), model );
178 
179         return getAdminPage( templateList.getHtml(  ) );
180     }
181 
182     /**
183      * Gets the available feed types
184      * @return the feed types
185      */
186     private List<String> getFeedTypes(  )
187     {
188         return Arrays.asList( AppPropertiesService.getProperty( PROPERTY_RSS_FEED_TYPE ).split( "," ) );
189     }
190 
191     /**
192      * Gets the available encodings
193      * @return the encodings
194      */
195     private List<String> getEncodings(  )
196     {
197         return Arrays.asList( AppPropertiesService.getProperty( PROPERTY_RSS_ENCODING ).split( "," ) );
198     }
199 
200     /**
201      * Modification of a push RSS file
202      *
203      * @return The Jsp URL of the process result
204      * @param request requete Http
205      */
206     public String doModifyRssFilePortlet( HttpServletRequest request )
207     {
208         // Recovery of parameters processing
209         if ( request.getParameter( PARAMETER_CANCEL ) != null )
210         {
211             return getHomeUrl( request );
212         }
213 
214         String strRssFileId = request.getParameter( PARAMETER_PUSH_RSS_ID );
215         String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP_KEY );
216         String strMaxItems = request.getParameter( PARAMETER_PUSH_RSS_MAX_ITEMS );
217         String strEncoding = request.getParameter( PARAMETER_PUSH_RSS_ENCODING );
218         String strFeedType = request.getParameter( PARAMETER_PUSH_RSS_FEED_TYPE );
219 
220         int nRssFileId = Integer.parseInt( strRssFileId );
221         String strPortletId = request.getParameter( PARAMETER_PUSH_RSS_PORTLET_ID );
222 
223         if ( ( strPortletId == null ) || !strPortletId.matches( REGEX_ID ) )
224         {
225             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_DOCUMENT_PORTLET, AdminMessage.TYPE_STOP );
226         }
227 
228         if ( StringUtils.isBlank( strFeedType ) )
229         {
230             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_FEED_TYPE, AdminMessage.TYPE_STOP );
231         }
232 
233         if ( !getFeedTypes(  ).contains( strFeedType ) )
234         {
235             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_FEED_TYPE, AdminMessage.TYPE_STOP );
236         }
237 
238         if ( StringUtils.isBlank( strEncoding ) )
239         {
240             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_ENCODING, AdminMessage.TYPE_STOP );
241         }
242 
243         int nMaxItems;
244 
245         if ( StringUtils.isBlank( strMaxItems ) )
246         {
247             nMaxItems = 0;
248         }
249         else
250         {
251             try
252             {
253                 nMaxItems = Integer.parseInt( strMaxItems );
254             }
255             catch ( NumberFormatException nfe )
256             {
257                 AppLogService.error( nfe.getMessage(  ), nfe );
258 
259                 return AdminMessageService.getMessageUrl( request, MESSAGE_MAX_ITEMS, AdminMessage.TYPE_STOP );
260             }
261         }
262 
263         int nPortletId = Integer.parseInt( strPortletId );
264         String strRssFileName = request.getParameter( PARAMETER_PUSH_RSS_NAME );
265         String strRssFileDescription = request.getParameter( PARAMETER_PUSH_RSS_DESCRIPTION );
266 
267         RssGeneratedFileess/RssGeneratedFile.html#RssGeneratedFile">RssGeneratedFile rssFile = new RssGeneratedFile(  );
268         rssFile.setPortletId( nPortletId );
269         rssFile.setId( nRssFileId );
270         rssFile.setName( strRssFileName );
271         rssFile.setState( STATE_OK );
272         rssFile.setWorkgroup( strWorkgroup );
273         rssFile.setDescription( strRssFileDescription );
274         rssFile.setMaxItems( nMaxItems );
275         rssFile.setFeedType( strFeedType );
276         rssFile.setEncoding( strEncoding );
277 
278         // Update the database with the new push RSS file
279         RssGeneratedFileHome.update( rssFile );
280 
281         // Check if the portlet does exist
282         if ( !RssGeneratedFileHome.checkRssFilePortlet( nPortletId ) )
283         {
284             rssFile.setState( STATE_PORTLET_MISSING );
285         }
286 
287         // Format the new file name
288         strRssFileName = UploadUtil.cleanFileName( strRssFileName );
289 
290         // Call the create xml document method
291         String strRssDocument = RssGeneratorService.createRssDocument( nPortletId, rssFile.getDescription(  ),
292                 rssFile.getEncoding(  ), rssFile.getFeedType(  ), rssFile.getMaxItems(  ), request );
293 
294         // Call the create file method
295         RssGeneratorService.createFileRss( strRssFileName, strRssDocument );
296 
297         // Update the push Rss object in the database
298         RssGeneratedFileHome.update( rssFile );
299 
300         // Display the page of publishing
301         return getHomeUrl( request );
302     }
303 
304     /**
305      * Modification of a push RSS file
306      *
307      * @return The Jsp URL of the process result
308      * @param request requete Http
309      */
310     public String doModifyRssFileResource( HttpServletRequest request )
311     {
312         if ( request.getParameter( PARAMETER_CANCEL ) != null )
313         {
314             return getHomeUrl( request );
315         }
316 
317         // Recovery of parameters processing
318         String strRssFileId = request.getParameter( PARAMETER_PUSH_RSS_ID );
319 
320         //String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP_KEY );
321         int nRssFileId = Integer.parseInt( strRssFileId );
322 
323         String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP_KEY );
324         String strRssFileName = request.getParameter( PARAMETER_PUSH_RSS_NAME );
325         String strMaxItems = request.getParameter( PARAMETER_PUSH_RSS_MAX_ITEMS );
326         String strEncoding = request.getParameter( PARAMETER_PUSH_RSS_ENCODING );
327         String strFeedType = request.getParameter( PARAMETER_PUSH_RSS_FEED_TYPE );
328 
329         String strResourceRssKey = request.getParameter( PARAMETER_RSS_RESOURCE_KEY );
330         IResourceRss resourceRss = RssService.getInstance(  ).getResourceRssInstance( strResourceRssKey, getLocale(  ) );
331 
332         if ( request.getParameter( PARAMETER_APPLY ) != null )
333         {
334             return getJspModifyRssResource( request, strRssFileId, request.getParameter( PARAMETER_PUSH_RSS_NAME ),
335                 request.getParameter( PARAMETER_WORKGROUP_KEY ), request.getParameter( PARAMETER_RSS_TYPE ),
336                 request.getParameter( PARAMETER_RSS_RESOURCE_KEY ), resourceRss.getParameterToApply( request ) );
337         }
338 
339         String strNameMaxLength = AppPropertiesService.getProperty( PROPERTY_NAME_MAX_LENGTH );
340 
341         if ( strRssFileName.length(  ) > Integer.parseInt( strNameMaxLength ) )
342         {
343             return AdminMessageService.getMessageUrl( request, MESSAGE_FILENAME_TOO_LONG, AdminMessage.TYPE_STOP );
344         }
345 
346         // Format the new file name
347         strRssFileName = UploadUtil.cleanFileName( strRssFileName );
348 
349         // Check the type of the name
350         String strFileType = AppPropertiesService.getProperty( PROPERTY_FILE_TYPE );
351 
352         if ( !strRssFileName.toLowerCase(  ).endsWith( strFileType ) )
353         {
354             strRssFileName = strRssFileName + strFileType;
355         }
356 
357         if ( ( resourceRss != null ) && ( request.getParameter( PARAMETER_CANCEL ) == null ) )
358         {
359             String strError = resourceRss.doValidateConfigForm( request, getLocale(  ) );
360 
361             if ( strError != null )
362             {
363                 return strError;
364             }
365         }
366 
367         if ( StringUtils.isBlank( strFeedType ) )
368         {
369             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_FEED_TYPE, AdminMessage.TYPE_STOP );
370         }
371 
372         if ( !getFeedTypes(  ).contains( strFeedType ) )
373         {
374             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_FEED_TYPE, AdminMessage.TYPE_STOP );
375         }
376 
377         if ( StringUtils.isBlank( strEncoding ) )
378         {
379             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_ENCODING, AdminMessage.TYPE_STOP );
380         }
381 
382         int nMaxItems;
383 
384         if ( StringUtils.isBlank( strMaxItems ) )
385         {
386             // set to 0 -- no limit
387             nMaxItems = 0;
388         }
389         else
390         {
391             try
392             {
393                 nMaxItems = Integer.parseInt( strMaxItems );
394             }
395             catch ( NumberFormatException nfe )
396             {
397                 AppLogService.error( nfe.getMessage(  ), nfe );
398 
399                 return AdminMessageService.getMessageUrl( request, MESSAGE_MAX_ITEMS, AdminMessage.TYPE_STOP );
400             }
401         }
402 
403         // String strRssFileDescription = request.getParameter( PARAMETER_PUSH_RSS_DESCRIPTION );
404         RssGeneratedFileess/RssGeneratedFile.html#RssGeneratedFile">RssGeneratedFile rssFile = new RssGeneratedFile(  );
405         rssFile.setId( nRssFileId );
406         rssFile.setName( strRssFileName );
407         rssFile.setState( STATE_OK );
408         rssFile.setWorkgroup( strWorkgroup );
409         rssFile.setDescription( resourceRss.getDescription(  ) );
410         rssFile.setTypeResourceRss( resourceRss.getResourceRssType(  ).getKey(  ) );
411         rssFile.setMaxItems( nMaxItems );
412         rssFile.setFeedType( strFeedType );
413         rssFile.setEncoding( strEncoding );
414 
415         resourceRss.setId( rssFile.getId(  ) );
416         resourceRss.setEncoding( strEncoding );
417         resourceRss.setFeedType( strFeedType );
418 
419         // Check if the resource does exist
420         if ( !resourceRss.checkResource(  ) )
421         {
422             rssFile.setState( STATE_PORTLET_MISSING );
423         }
424 
425         // Update the database with the new push RSS file
426         RssGeneratedFileHome.update( rssFile );
427 
428         //sauvegarde du coté directory
429         resourceRss.doUpdateConfig( request, getLocale(  ) );
430 
431         // Check if a RSS file exists for this portlet
432         //String strRssDocument = RssGeneratorService.createRssDocument( nPortletId, strRssFileDescription );
433         String strRss = FeedUtil.getFeed( resourceRss );
434 
435         // Call the create file method
436         RssGeneratorService.createFileRss( strRssFileName, strRss );
437 
438         // Display the page of publishing
439         return getHomeUrl( request );
440     }
441 
442     /**
443      * Creates the push RSS file corresponding to the given portlet
444      *
445      * @return The Jsp URL of the process result
446      * @param request requete Http
447      */
448     public String doCreateRssFile( HttpServletRequest request )
449     {
450         if ( request.getParameter( PARAMETER_CANCEL ) != null )
451         {
452             return getHomeUrl( request );
453         }
454 
455         String strRssType = request.getParameter( PARAMETER_RSS_TYPE );
456         String strRssResourceName = request.getParameter( PARAMETER_RSS_RESOURCE_KEY );
457 
458         if ( ( strRssType == null ) )
459         {
460             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_DOCUMENT_PORTLET, AdminMessage.TYPE_STOP );
461         }
462 
463         if ( ( strRssType.equals( PORTLET ) ) )
464         {
465             return getCreateRssFilePortlet( request );
466         }
467         else if ( strRssType.equals( RESOURCE_RSS ) )
468         {
469             if ( ( strRssResourceName == null ) )
470             {
471                 return AdminMessageService.getMessageUrl( request, MESSAGE_NO_DOCUMENT_PORTLET, AdminMessage.TYPE_STOP );
472             }
473             else
474             {
475                 IResourceRss resourceRss = RssService.getInstance(  )
476                                                      .getResourceRssInstance( strRssResourceName, getLocale(  ) );
477 
478                 if ( resourceRss.contentResourceRss(  ) )
479                 {
480                     HashMap<String, Object> model = new HashMap<String, Object>(  );
481 
482                     if ( request.getParameter( PARAMETER_PUSH_RSS_NAME ) != null )
483                     {
484                         model.put( MARK_RSS_NAME, request.getParameter( PARAMETER_PUSH_RSS_NAME ) );
485                     }
486                     else
487                     {
488                         model.put( MARK_RSS_NAME, STRING_EMPTY );
489                     }
490 
491                     if ( request.getParameter( PARAMETER_PUSH_RSS_MAX_ITEMS ) != null )
492                     {
493                         model.put( MARK_RSS_MAX_ITEMS, request.getParameter( PARAMETER_PUSH_RSS_MAX_ITEMS ) );
494                     }
495                     else
496                     {
497                         model.put( MARK_RSS_MAX_ITEMS, STRING_EMPTY );
498                     }
499 
500                     if ( request.getParameter( PARAMETER_PUSH_RSS_MAX_ITEMS ) != null )
501                     {
502                         model.put( MARK_RSS_MAX_ITEMS, request.getParameter( PARAMETER_PUSH_RSS_MAX_ITEMS ) );
503                     }
504                     else
505                     {
506                         model.put( MARK_RSS_MAX_ITEMS, STRING_EMPTY );
507                     }
508 
509                     if ( request.getParameter( PARAMETER_PUSH_RSS_FEED_TYPE ) != null )
510                     {
511                         model.put( MARK_RSS_FEED_TYPE, request.getParameter( PARAMETER_PUSH_RSS_FEED_TYPE ) );
512                     }
513                     else
514                     {
515                         model.put( MARK_RSS_FEED_TYPE, STRING_EMPTY );
516                     }
517 
518                     if ( request.getParameter( PARAMETER_PUSH_RSS_ENCODING ) != null )
519                     {
520                         model.put( MARK_RSS_ENCODING, request.getParameter( PARAMETER_PUSH_RSS_ENCODING ) );
521                     }
522                     else
523                     {
524                         model.put( MARK_RSS_ENCODING, STRING_EMPTY );
525                     }
526 
527                     ReferenceList refListWorkGroups = AdminWorkgroupService.getUserWorkgroups( getUser(  ),
528                             getLocale(  ) );
529 
530                     model.put( MARK_USER_WORKGROUP_LIST, refListWorkGroups );
531 
532                     ReferenceList refListEncoding = getRefListEncoding(  );
533 
534                     model.put( MARK_ENCODING_LIST, refListEncoding );
535 
536                     ReferenceList refListFeedType = getRefListFeedType(  );
537                     model.put( MARK_FEED_TYPE_LIST, refListFeedType );
538 
539                     //RSS-24 : the first workgroup will be selected by default
540                     if ( !refListWorkGroups.isEmpty(  ) )
541                     {
542                         if ( request.getParameter( PARAMETER_WORKGROUP_KEY ) != null )
543                         {
544                             model.put( MARK_WORKGROUP_SELECTED, request.getParameter( PARAMETER_WORKGROUP_KEY ) );
545                         }
546                         else
547                         {
548                             model.put( MARK_WORKGROUP_SELECTED, WORKGROUP_ALL );
549                         }
550                     }
551 
552                     model.put( MARK_RSS_TYPE, RESOURCE_RSS );
553                     model.put( MARK_RESOURCE_RSS, resourceRss.getResourceRssType(  ) );
554                     model.put( MARK_RESOURCE_RSS_CONFIG,
555                         resourceRss.getDisplayCreateConfigForm( request, getLocale(  ) ) );
556 
557                     setPageTitleProperty( PROPERTY_PAGE_TITLE_CREATE );
558 
559                     HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_PUSH_RSS_FILE_RESOURCE,
560                             getLocale(  ), model );
561 
562                     return getAdminPage( template.getHtml(  ) );
563                 }
564                 else
565                 {
566                     return AdminMessageService.getMessageUrl( request, MESSAGE_RESOURCE, AdminMessage.TYPE_STOP );
567                 }
568             }
569         }
570 
571         return null;
572     }
573 
574     /**
575      * Builds the reference list of supported encoding
576      * @return the ReferenceList
577      */
578     private ReferenceList getRefListEncoding(  )
579     {
580         List<String> listEncodings = getEncodings(  );
581         ReferenceList refList = new ReferenceList(  );
582 
583         // ut8 will be the default one
584         for ( String strEncoding : listEncodings )
585         {
586             refList.addItem( strEncoding, strEncoding );
587         }
588 
589         return refList;
590     }
591 
592     /**
593      * Builds the reference list of Feed types
594      * @return the ReferenceList
595      */
596     private ReferenceList getRefListFeedType(  )
597     {
598         List<String> listFeedType = getFeedTypes(  );
599         ReferenceList refList = new ReferenceList(  );
600 
601         for ( String strFeedType : listFeedType )
602         {
603             refList.addItem( strFeedType, strFeedType );
604         }
605 
606         return refList;
607     }
608 
609     /**
610      * Creates the push RSS file corresponding to the given portlet
611      *
612      * @return The Jsp URL of the process result
613      * @param request requete Http
614      */
615     public String doCreateRssFilePortlet( HttpServletRequest request )
616     {
617         if ( request.getParameter( PARAMETER_CANCEL ) != null )
618         {
619             return getHomeUrl( request );
620         }
621 
622         String strPortletId = request.getParameter( PARAMETER_PUSH_RSS_PORTLET_ID );
623         String strRssFileName = request.getParameter( PARAMETER_PUSH_RSS_NAME );
624         String strRssFileDescription = request.getParameter( PARAMETER_PUSH_RSS_DESCRIPTION );
625         String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP_KEY );
626         String strRssMaxItems = request.getParameter( PARAMETER_PUSH_RSS_MAX_ITEMS );
627         String strFeedType = request.getParameter( PARAMETER_PUSH_RSS_FEED_TYPE );
628         String strEncoding = request.getParameter( PARAMETER_PUSH_RSS_ENCODING );
629 
630         if ( ( strPortletId == null ) || !strPortletId.matches( REGEX_ID ) )
631         {
632             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_DOCUMENT_PORTLET, AdminMessage.TYPE_STOP );
633         }
634 
635         int nPortletId = Integer.parseInt( strPortletId );
636 
637         //Mandatory fields
638         if ( request.getParameter( PARAMETER_PUSH_RSS_NAME ).equals( "" ) ||
639                 request.getParameter( PARAMETER_PUSH_RSS_DESCRIPTION ).equals( "" ) )
640         {
641             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
642         }
643 
644         // Check the file name length
645         String strNameMaxLength = AppPropertiesService.getProperty( PROPERTY_NAME_MAX_LENGTH );
646 
647         if ( strRssFileName.length(  ) > Integer.parseInt( strNameMaxLength ) )
648         {
649             return AdminMessageService.getMessageUrl( request, MESSAGE_FILENAME_TOO_LONG, AdminMessage.TYPE_STOP );
650         }
651 
652         // Format the new file name
653         strRssFileName = UploadUtil.cleanFileName( strRssFileName );
654 
655         // Check the type of the name
656         String strFileType = AppPropertiesService.getProperty( PROPERTY_FILE_TYPE );
657 
658         if ( !strRssFileName.toLowerCase(  ).endsWith( strFileType ) )
659         {
660             strRssFileName = strRssFileName + strFileType;
661         }
662 
663         // Verifies whether the file's name exists
664         if ( RssGeneratedFileHome.checkRssFileFileName( strRssFileName ) )
665         {
666             return AdminMessageService.getMessageUrl( request, MESSAGE_FILENAME_ALREADY_EXISTS, AdminMessage.TYPE_STOP );
667         }
668 
669         if ( StringUtils.isBlank( strFeedType ) )
670         {
671             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_FEED_TYPE, AdminMessage.TYPE_STOP );
672         }
673 
674         if ( !getFeedTypes(  ).contains( strFeedType ) )
675         {
676             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_FEED_TYPE, AdminMessage.TYPE_STOP );
677         }
678 
679         if ( StringUtils.isBlank( strEncoding ) )
680         {
681             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_ENCODING, AdminMessage.TYPE_STOP );
682         }
683 
684         int nMaxItems;
685 
686         if ( StringUtils.isBlank( strRssMaxItems ) )
687         {
688             // set to 0 -- no limit
689             nMaxItems = 0;
690         }
691         else
692         {
693             try
694             {
695                 nMaxItems = Integer.parseInt( strRssMaxItems );
696             }
697             catch ( NumberFormatException nfe )
698             {
699                 AppLogService.error( nfe.getMessage(  ), nfe );
700 
701                 return AdminMessageService.getMessageUrl( request, MESSAGE_MAX_ITEMS, AdminMessage.TYPE_STOP );
702             }
703         }
704 
705         // Check if a RSS file exists for this portlet
706         String strRssDocument = RssGeneratorService.createRssDocument( nPortletId, strRssFileDescription, strEncoding,
707                 strFeedType, nMaxItems, request );
708 
709         // Call the create file method
710         RssGeneratorService.createFileRss( strRssFileName, strRssDocument );
711 
712         // Update the database with the new push RSS file
713         RssGeneratedFileess/RssGeneratedFile.html#RssGeneratedFile">RssGeneratedFile rssFile = new RssGeneratedFile(  );
714         rssFile.setPortletId( nPortletId );
715         rssFile.setName( strRssFileName );
716         rssFile.setState( STATE_OK );
717         rssFile.setDescription( strRssFileDescription );
718         rssFile.setWorkgroup( strWorkgroup );
719         rssFile.setMaxItems( nMaxItems );
720         rssFile.setFeedType( strFeedType );
721         rssFile.setEncoding( strEncoding );
722 
723         RssGeneratedFileHome.create( rssFile );
724 
725         return getHomeUrl( request );
726     }
727 
728     /**
729      * Returns the creation form of a rss file
730      *
731      * @param request The Http request
732      * @return Html form
733      */
734     public String getCreateRssFile( HttpServletRequest request )
735     {
736         setPageTitleProperty( PROPERTY_PAGE_TITLE_CREATE );
737 
738         ReferenceList referenceList = RssService.getInstance(  ).getRefListResourceRssType( getLocale(  ) );
739 
740         HashMap<String, Object> model = new HashMap<String, Object>(  );
741         model.put( MARK_RESOURCE_LIST, referenceList );
742 
743         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_PUSH_RSS_FILE, getLocale(  ), model );
744 
745         return getAdminPage( template.getHtml(  ) );
746     }
747 
748     /**
749      * Returns the creation form of a rss file
750      *
751      * @param request The Http request
752      * @return Html form
753      */
754     public String getCreateRssFilePortlet( HttpServletRequest request )
755     {
756         setPageTitleProperty( PROPERTY_PAGE_TITLE_CREATE );
757 
758         ReferenceList refListWorkGroups = AdminWorkgroupService.getUserWorkgroups( getUser(  ), getLocale(  ) );
759 
760         Collection<Portlet> listInvolvedPortlets = PublishingService.getInstance(  ).getPublishedPortlets(  );
761         //test authorization on all portlets
762         listInvolvedPortlets = PortletService.getInstance(  )
763                                              .getAuthorizedPortletCollection( listInvolvedPortlets, getUser(  ) );
764 
765         ReferenceList referenceList = new ReferenceList(  );
766 
767         for ( Portlet portlet : listInvolvedPortlets )
768         {
769             referenceList.addItem( portlet.getId(  ), portlet.getName(  ) );
770         }
771 
772         HashMap<String, Object> model = new HashMap<String, Object>(  );
773         model.put( MARK_PORTLET_LIST, referenceList );
774         model.put( MARK_USER_WORKGROUP_LIST, refListWorkGroups );
775 
776         ReferenceList refListEncoding = getRefListEncoding(  );
777 
778         model.put( MARK_RSS_MAX_ITEMS, STRING_EMPTY );
779 
780         model.put( MARK_ENCODING_LIST, refListEncoding );
781         model.put( MARK_RSS_ENCODING, STRING_EMPTY );
782 
783         ReferenceList refListFeedType = getRefListFeedType(  );
784         model.put( MARK_FEED_TYPE_LIST, refListFeedType );
785         model.put( MARK_RSS_FEED_TYPE, STRING_EMPTY );
786 
787         //RSS-24 : the first workgroup will be selected by default
788         if ( !refListWorkGroups.isEmpty(  ) )
789         {
790             model.put( MARK_WORKGROUP_SELECTED, refListWorkGroups.get( 0 ).getCode(  ) );
791         }
792 
793         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_PUSH_RSS_FILE_PORTLET, getLocale(  ),
794                 model );
795 
796         return getAdminPage( template.getHtml(  ) );
797     }
798 
799     /**
800      * Returns the creation form of a rss file
801      *
802      * @param request The Http request
803      * @return Html form
804      */
805     public String doCreateRssFileResource( HttpServletRequest request )
806     {
807         if ( request.getParameter( PARAMETER_CANCEL ) != null )
808         {
809             return getHomeUrl( request );
810         }
811 
812         String strWorkgroup = request.getParameter( PARAMETER_WORKGROUP_KEY );
813         String strRssFileName = request.getParameter( PARAMETER_PUSH_RSS_NAME );
814         String strRssMaxItems = request.getParameter( PARAMETER_PUSH_RSS_MAX_ITEMS );
815         String strEncoding = request.getParameter( PARAMETER_PUSH_RSS_ENCODING );
816         String strFeedType = request.getParameter( PARAMETER_PUSH_RSS_FEED_TYPE );
817 
818         String strResourceRssKey = request.getParameter( PARAMETER_RSS_RESOURCE_KEY );
819         IResourceRss resourceRss = RssService.getInstance(  ).getResourceRssInstance( strResourceRssKey, getLocale(  ) );
820 
821         if ( request.getParameter( PARAMETER_APPLY ) != null )
822         {
823             return getJspCreateRssResource( request, request.getParameter( PARAMETER_PUSH_RSS_NAME ),
824                 request.getParameter( PARAMETER_WORKGROUP_KEY ), request.getParameter( PARAMETER_RSS_TYPE ),
825                 request.getParameter( PARAMETER_RSS_RESOURCE_KEY ), resourceRss.getParameterToApply( request ) );
826         }
827 
828         if ( strRssFileName.equals( "" ) )
829         {
830             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
831         }
832 
833         String strNameMaxLength = AppPropertiesService.getProperty( PROPERTY_NAME_MAX_LENGTH );
834 
835         if ( strRssFileName.length(  ) > Integer.parseInt( strNameMaxLength ) )
836         {
837             return AdminMessageService.getMessageUrl( request, MESSAGE_FILENAME_TOO_LONG, AdminMessage.TYPE_STOP );
838         }
839 
840         // Format the new file name
841         strRssFileName = UploadUtil.cleanFileName( strRssFileName );
842 
843         // Check the type of the name
844         String strFileType = AppPropertiesService.getProperty( PROPERTY_FILE_TYPE );
845 
846         if ( !strRssFileName.toLowerCase(  ).endsWith( strFileType ) )
847         {
848             strRssFileName = strRssFileName + strFileType;
849         }
850 
851         // Verifies whether the file's name exists
852         if ( RssGeneratedFileHome.checkRssFileFileName( strRssFileName ) )
853         {
854             return AdminMessageService.getMessageUrl( request, MESSAGE_FILENAME_ALREADY_EXISTS, AdminMessage.TYPE_STOP );
855         }
856 
857         if ( ( resourceRss != null ) && ( request.getParameter( PARAMETER_CANCEL ) == null ) )
858         {
859             String strError = resourceRss.doValidateConfigForm( request, getLocale(  ) );
860 
861             if ( strError != null )
862             {
863                 return strError;
864             }
865         }
866 
867         if ( StringUtils.isBlank( strFeedType ) )
868         {
869             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_FEED_TYPE, AdminMessage.TYPE_STOP );
870         }
871 
872         if ( !getFeedTypes(  ).contains( strFeedType ) )
873         {
874             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_FEED_TYPE, AdminMessage.TYPE_STOP );
875         }
876 
877         if ( StringUtils.isBlank( strEncoding ) )
878         {
879             return AdminMessageService.getMessageUrl( request, MESSAGE_NO_ENCODING, AdminMessage.TYPE_STOP );
880         }
881 
882         int nMaxItems;
883 
884         if ( StringUtils.isBlank( strRssMaxItems ) )
885         {
886             // set to 0 -- no limit
887             nMaxItems = 0;
888         }
889         else
890         {
891             try
892             {
893                 nMaxItems = Integer.parseInt( strRssMaxItems );
894             }
895             catch ( NumberFormatException nfe )
896             {
897                 AppLogService.error( nfe.getMessage(  ), nfe );
898 
899                 return AdminMessageService.getMessageUrl( request, MESSAGE_MAX_ITEMS, AdminMessage.TYPE_STOP );
900             }
901         }
902 
903         RssGeneratedFileess/RssGeneratedFile.html#RssGeneratedFile">RssGeneratedFile rssFile = new RssGeneratedFile(  );
904         rssFile.setName( strRssFileName );
905         rssFile.setState( STATE_OK );
906         rssFile.setDescription( resourceRss.getDescription(  ) );
907         rssFile.setWorkgroup( strWorkgroup );
908         rssFile.setTypeResourceRss( resourceRss.getResourceRssType(  ).getKey(  ) );
909         rssFile.setMaxItems( nMaxItems );
910         rssFile.setFeedType( strFeedType );
911         rssFile.setEncoding( strEncoding );
912         RssGeneratedFileHome.create( rssFile );
913 
914         resourceRss.setEncoding( strEncoding );
915         resourceRss.setFeedType( strFeedType );
916         resourceRss.setId( rssFile.getId(  ) );
917 
918         //sauvegarde du coté directory
919         resourceRss.doSaveConfig( request, getLocale(  ) );
920 
921         String strRss = FeedUtil.getFeed( resourceRss );
922 
923         // Call the create file method
924         RssGeneratorService.createFileRss( strRssFileName, strRss );
925 
926         return getJspManageRssFile( request );
927     }
928 
929     /**
930      * return url of the jsp manage workflow
931      * @param request The HTTP request
932      * @return url of the jsp manage workflow
933      */
934     private String getJspManageRssFile( HttpServletRequest request )
935     {
936         return AppPathService.getBaseUrl( request ) + JSP_MANAGE_RSS_FILE;
937     }
938 
939     /**
940      * return url of the jsp create ResourceRss
941      * @param request The HTTP request
942      * @return url of the jsp create ResourceRss
943      */
944     private String getJspCreateRssResource( HttpServletRequest request, String strRssName, String strRssWorkgroup,
945         String rss_type, String resourceKey, Map<String, String> parameterList )
946     {
947         String strParam = new String(  );
948 
949         for ( String parameter : parameterList.keySet(  ) )
950         {
951             strParam += ( parameter + "=" + parameterList.get( parameter ) + "&" );
952         }
953 
954         return AppPathService.getBaseUrl( request ) + JSP_CREATE_RESOURCE_RSS_FILE + "?" + PARAMETER_PUSH_RSS_NAME +
955         "=" + strRssName + "&" + PARAMETER_WORKGROUP_KEY + "=" + strRssWorkgroup + "&" + PARAMETER_RSS_TYPE + "=" +
956         rss_type + "&" + PARAMETER_RSS_RESOURCE_KEY + "=" + resourceKey + "&" + strParam;
957     }
958 
959     /**
960      * return url of the jsp modify ResourceRss
961      * @param request The HTTP request
962      * @return url of the jsp modify ResourceRss
963      */
964     private String getJspModifyRssResource( HttpServletRequest request, String id_rss, String strRssName,
965         String strRssWorkgroup, String rss_type, String resourceKey, Map<String, String> parameterList )
966     {
967         String strParam = new String(  );
968 
969         for ( String parameter : parameterList.keySet(  ) )
970         {
971             strParam += ( parameter + "=" + parameterList.get( parameter ) + "&" );
972         }
973 
974         return AppPathService.getBaseUrl( request ) + JSP_MODIFY_RESOURCE_RSS_FILE + "?" + PARAMETER_PUSH_RSS_NAME +
975         "=" + strRssName + "&" + PARAMETER_WORKGROUP_KEY + "=" + strRssWorkgroup + "&" + PARAMETER_PUSH_RSS_ID + "=" +
976         id_rss + "&" + PARAMETER_RSS_TYPE + "=" + rss_type + "&" + PARAMETER_RSS_RESOURCE_KEY + "=" + resourceKey +
977         "&" + strParam;
978     }
979 
980     /**
981      * Returns the form to update a rss file
982      *
983      * @param request The Http request
984      * @return The HTML form to update info
985      */
986     public String getModifyRssFile( HttpServletRequest request )
987     {
988         setPageTitleProperty( PROPERTY_PAGE_TITLE_MODIFY );
989 
990         ReferenceList refListWorkGroups = AdminWorkgroupService.getUserWorkgroups( getUser(  ), getLocale(  ) );
991         int nRssFileId = Integer.parseInt( request.getParameter( PARAMETER_PUSH_RSS_ID ) );
992         RssGeneratedFile rss = RssGeneratedFileHome.findByPrimaryKey( nRssFileId );
993 
994         HashMap<String, Object> model = new HashMap<String, Object>(  );
995 
996         if ( request.getParameter( PARAMETER_WORKGROUP_KEY ) != null )
997         {
998             rss.setWorkgroup( request.getParameter( PARAMETER_WORKGROUP_KEY ) );
999         }
1000 
1001         if ( request.getParameter( PARAMETER_PUSH_RSS_NAME ) != null )
1002         {
1003             rss.setName( request.getParameter( PARAMETER_PUSH_RSS_NAME ) );
1004         }
1005 
1006         model.put( MARK_RSS_FILE, rss );
1007         model.put( MARK_USER_WORKGROUP_LIST, refListWorkGroups );
1008 
1009         ReferenceList refListEncoding = getRefListEncoding(  );
1010 
1011         model.put( MARK_ENCODING_LIST, refListEncoding );
1012 
1013         ReferenceList refListFeedType = getRefListFeedType(  );
1014         model.put( MARK_FEED_TYPE_LIST, refListFeedType );
1015 
1016         HtmlTemplate template = null;
1017 
1018         if ( ( rss.getTypeResourceRss(  ) != null ) && ( rss.getPortletId(  ) == 0 ) )
1019         {
1020             IResourceRss resourceRss = RssService.getInstance(  )
1021                                                  .getResourceRssInstance( rss.getTypeResourceRss(  ), getLocale(  ) );
1022 
1023             model.put( MARK_RESOURCE_RSS, resourceRss.getResourceRssType(  ) );
1024             resourceRss.setId( rss.getId(  ) );
1025             model.put( MARK_RESOURCE_RSS_CONFIG, resourceRss.getDisplayModifyConfigForm( request, getLocale(  ) ) );
1026             template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_PUSH_RSS_FILE_RESOURCE, getLocale(  ), model );
1027         }
1028         else
1029         {
1030             Collection<Portlet> listInvolvedPortlets = PublishingService.getInstance(  ).getPublishedPortlets(  );
1031             //test authorization on all portlets
1032             listInvolvedPortlets = PortletService.getInstance(  )
1033                                                  .getAuthorizedPortletCollection( listInvolvedPortlets, getUser(  ) );
1034 
1035             ReferenceList referenceList = new ReferenceList(  );
1036 
1037             for ( Portlet portlet : listInvolvedPortlets )
1038             {
1039                 referenceList.addItem( portlet.getId(  ), portlet.getName(  ) );
1040             }
1041 
1042             model.put( MARK_PORTLET_LIST, referenceList );
1043 
1044             template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_PUSH_RSS_FILE_PORTLET, getLocale(  ), model );
1045         }
1046 
1047         return getAdminPage( template.getHtml(  ) );
1048     }
1049 
1050     ////////////////////////////////////////////////////////////////////////////
1051     // Private implementation
1052 
1053     /**
1054      * Utility method to build the URL of the given rssFile file
1055      *
1056      * @param strNameRssFile The HTML template to fill
1057      * @param request The HttpServletRequest
1058      * @return the URL to get the rssFile file
1059      */
1060     private String getRssFileUrl( String strNameRssFile, HttpServletRequest request )
1061     {
1062         String strBaseUrl = AppPathService.getBaseUrl( request );
1063         String strStockingDirectoryName = AppPropertiesService.getProperty( RssGeneratorService.PROPERTY_STORAGE_DIRECTORY_NAME );
1064         String strPluginWarehouse = AppPropertiesService.getProperty( PROPERTY_PATH_PLUGIN_WAREHOUSE );
1065 
1066         //Removes extra slash in the url
1067         if ( strPluginWarehouse.startsWith( "/" ) )
1068         {
1069             strPluginWarehouse = strPluginWarehouse.substring( 1 );
1070         }
1071 
1072         String strRssFileRepository = strPluginWarehouse + "/" + strStockingDirectoryName;
1073         strBaseUrl = strBaseUrl + strRssFileRepository + "/" + strNameRssFile;
1074 
1075         return strBaseUrl;
1076     }
1077 
1078     /**
1079      * Process removal of a file
1080      * @param request The Http request
1081      * @return String The url of the administration console
1082      */
1083     public String doDeleteRssFile( HttpServletRequest request )
1084     {
1085         int nIdFileRss = Integer.parseInt( request.getParameter( PARAMETER_PUSH_RSS_ID ) );
1086         RssGeneratedFile rssGeneratedFile = RssGeneratedFileHome.findByPrimaryKey( nIdFileRss );
1087 
1088         if ( ( rssGeneratedFile.getPortletId(  ) == 0 ) && ( rssGeneratedFile.getTypeResourceRss(  ) != null ) )
1089         {
1090             IResourceRss resourceRss = RssService.getInstance(  )
1091                                                  .getResourceRssInstance( rssGeneratedFile.getTypeResourceRss(  ),
1092                     getLocale(  ) );
1093             resourceRss.deleteResourceRssConfig( rssGeneratedFile.getId(  ) );
1094         }
1095 
1096         RssGeneratedFileHome.remove( nIdFileRss );
1097 
1098         return getHomeUrl( request );
1099     }
1100 
1101     /**
1102      * Confirms the removal of a rss file
1103      *
1104      * @param request The Http request
1105      * @return The Jsp URL of the process result
1106      */
1107     public String doConfirmDeleteRssFile( HttpServletRequest request )
1108     {
1109         String strIdFile = request.getParameter( PARAMETER_PUSH_RSS_ID );
1110         int nIdFile = Integer.parseInt( strIdFile );
1111         String strDeleteUrl = JSP_DELETE_RSS_FILE + "?" + PARAMETER_PUSH_RSS_ID + "=" + strIdFile;
1112         String strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_RSS_LINKED_FEED, AdminMessage.TYPE_STOP );
1113 
1114         if ( checkNoRssExternalFeed( nIdFile, request ) )
1115         {
1116             RssGeneratedFile rssFile = RssGeneratedFileHome.findByPrimaryKey( nIdFile );
1117             Object[] messageArgs = { rssFile.getName(  ) };
1118             strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_DELETE_RSS_FILE, messageArgs,
1119                     strDeleteUrl, AdminMessage.TYPE_CONFIRMATION );
1120         }
1121 
1122         return strUrl;
1123     }
1124 
1125     /**
1126      * Used by the paginator to fetch a number of items
1127      * @param request The HttpRequest
1128      * @return The number of items
1129      */
1130     private int getItemsPerPage( HttpServletRequest request )
1131     {
1132         int nItemsPerPage;
1133         String strItemsPerPage = request.getParameter( PARAMETER_ITEMS_PER_PAGE );
1134 
1135         if ( strItemsPerPage != null )
1136         {
1137             nItemsPerPage = Integer.parseInt( strItemsPerPage );
1138         }
1139         else
1140         {
1141             if ( _nItemsPerPage != 0 )
1142             {
1143                 nItemsPerPage = _nItemsPerPage;
1144             }
1145             else
1146             {
1147                 nItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_RSS_PER_PAGE, 10 );
1148             }
1149         }
1150 
1151         return nItemsPerPage;
1152     }
1153 
1154     /**
1155      * Fetches the page index
1156      * @param request The HttpRequest
1157      * @return The PageIndex
1158      */
1159     private String getPageIndex( HttpServletRequest request )
1160     {
1161         String strPageIndex = request.getParameter( PARAMETER_PAGE_INDEX );
1162         strPageIndex = ( strPageIndex != null ) ? strPageIndex : _strCurrentPageIndex;
1163 
1164         return strPageIndex;
1165     }
1166 
1167     /**
1168      * Checks whether the generated rss file is linked as an external rss feed
1169      * @param nIdRssFile the identifier of the rss file
1170      * @param request The HttpRequest
1171      * @return a boolean
1172      */
1173     public boolean checkNoRssExternalFeed( int nIdRssFile, HttpServletRequest request )
1174     {
1175         RssGeneratedFile rssFile = RssGeneratedFileHome.findByPrimaryKey( nIdRssFile );
1176         String strUrlFile = getRssFileUrl( rssFile.getName(  ), request );
1177 
1178         //if the url of the file is used as an external feed
1179         return RssFeedHome.checkUrlNotUsed( strUrlFile );
1180     }
1181 }