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.folderlisting.web;
35  
36  import fr.paris.lutece.plugins.folderlisting.business.FolderListingDatabase;
37  import fr.paris.lutece.plugins.folderlisting.business.FolderListingDatabaseHome;
38  import fr.paris.lutece.plugins.folderlisting.business.portlet.FolderListingPortletHome;
39  import fr.paris.lutece.portal.service.message.AdminMessage;
40  import fr.paris.lutece.portal.service.message.AdminMessageService;
41  import fr.paris.lutece.portal.service.template.AppTemplateService;
42  import fr.paris.lutece.portal.service.util.AppPathService;
43  import fr.paris.lutece.portal.service.util.AppPropertiesService;
44  import fr.paris.lutece.portal.service.workgroup.AdminWorkgroupService;
45  import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
46  import fr.paris.lutece.portal.web.constants.Messages;
47  import fr.paris.lutece.util.ReferenceList;
48  import fr.paris.lutece.util.html.HtmlTemplate;
49  import fr.paris.lutece.util.html.Paginator;
50  
51  import java.io.File;
52  
53  import java.util.HashMap;
54  import java.util.List;
55  
56  import javax.servlet.http.HttpServletRequest;
57  
58  
59  /**
60   * Creates a new FolderListingDatabaseJspBean object.
61   */
62  public class FolderListingDatabaseJspBean extends PluginAdminPageJspBean
63  {
64      //////////////////////////////////////////////////////////////////////////////////////////
65      // Constants
66      public static final String RIGHT_FOLDERLISTING_MANAGEMENT = "FOLDERLISTING_MANAGEMENT";
67  
68      // Markers
69      private static final String MARK_FOLDER_LIST = "folder_list";
70      private static final String MARK_FOLDER = "folder";
71      private static final String MARK_PAGINATOR = "paginator";
72      private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
73      private static final String MARK_WORKGROUP_LIST = "workgroup_list";
74  
75      // Parameters
76      private static final String PARAMETER_FOLDER_NAME = "folder_name";
77      private static final String PARAMETER_FOLDER_PATH = "folder_path";
78      private static final String PARAMETER_FOLDER_WORKGROUP = "folder_workgroup";
79      private static final String PARAMETER_ID_FOLDER = "id_folder";
80      private static final String PARAMETER_PAGE_INDEX = "page_index";
81  
82      // properties for page titles
83      private static final String PROPERTY_PAGE_TITLE_FOLDERS = "folderlisting.folders.pageTitle";
84      private static final String PROPERTY_PAGE_TITLE_CREATE = "folderlisting.create_folder.pageTitle";
85      private static final String PROPERTY_PAGE_TITLE_MODIFY = "folderlisting.modify_folder.pageTitle";
86      private static final String PROPERTY_FOLDER_PER_PAGE = "folderlisting.folderPerPage";
87  
88      // Messages
89      private static final String MESSAGE_FOLDER_INVALID = "folderlisting.message.folderInvalid";
90      private static final String MESSAGE_CONFIRM_DELETE_FOLDER = "folderlisting.message.confirmDeleteFolder";
91      private static final String MESSAGE_FOLDER_LINKED_PORTLET = "folderlisting.message.folderLinkedPortlet";
92  
93      // Templates
94      private static final String TEMPLATE_FOLDERS = "/admin/plugins/folderlisting/folders.html";
95      private static final String TEMPLATE_CREATE_FOLDER = "/admin/plugins/folderlisting/create_folder.html";
96      private static final String TEMPLATE_MODIFY_FOLDER = "/admin/plugins/folderlisting/modify_folder.html";
97  
98      //Jsp
99      private static final String JSP_DELETE_FOLDER = "jsp/admin/plugins/folderlisting/DoDeleteFolder.jsp";
100     private String _strCurrentPageIndex;
101     private int _nItemsPerPage;
102     private int _nDefaultItemsPerPage;
103 
104     public FolderListingDatabaseJspBean(  )
105     {
106         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_FOLDER_PER_PAGE, 10 );
107     }
108 
109     /**
110      * Returns the creation form of a folder
111      *
112      * @param request The Http request
113      *
114      * @return Html form
115      */
116     public String getCreateFolder( HttpServletRequest request )
117     {
118         HashMap<String, ReferenceList> model = new HashMap<String, ReferenceList>(  );
119         setPageTitleProperty( PROPERTY_PAGE_TITLE_CREATE );
120 
121         model.put( MARK_WORKGROUP_LIST, AdminWorkgroupService.getUserWorkgroups( getUser(  ), getLocale(  ) ) );
122 
123         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_FOLDER, getLocale(  ), model );
124 
125         return getAdminPage( template.getHtml(  ) );
126     }
127 
128     /**
129      * Returns folders management form
130      *
131      * @param request The Http request
132      *
133      * @return Html form
134      */
135     public String getManageFolders( HttpServletRequest request )
136     {
137         setPageTitleProperty( PROPERTY_PAGE_TITLE_FOLDERS );
138 
139         //_nItemsPerPage = getItemsPerPage( request );
140         _nItemsPerPage = Paginator.getItemsPerPage( request, Paginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage,
141                 _nDefaultItemsPerPage );
142         //_strCurrentPageIndex = getPageIndex( request );
143         _strCurrentPageIndex = Paginator.getPageIndex( request, Paginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
144 
145         List<FolderListingDatabase> listFolderList = FolderListingDatabaseHome.findFolderListingDatabasesList( getPlugin(  ) );
146         listFolderList = (List<FolderListingDatabase>) AdminWorkgroupService.getAuthorizedCollection( listFolderList,
147                 getUser(  ) );
148 
149         Paginator paginator = new Paginator( listFolderList, _nItemsPerPage, getHomeUrl( request ),
150                 PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
151         HashMap model = new HashMap(  );
152         model.put( MARK_PAGINATOR, paginator );
153         model.put( MARK_NB_ITEMS_PER_PAGE, "" + _nItemsPerPage );
154         model.put( MARK_FOLDER_LIST, paginator.getPageItems(  ) );
155 
156         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_FOLDERS, getLocale(  ), model );
157 
158         return getAdminPage( templateList.getHtml(  ) );
159     }
160 
161     /**
162      * Returns the form to update info about a folder
163      *
164      * @param request The Http request
165      *
166      * @return The HTML form to update info
167      */
168     public String getModifyFolder( HttpServletRequest request )
169     {
170         HashMap model = new HashMap(  );
171         setPageTitleProperty( PROPERTY_PAGE_TITLE_MODIFY );
172 
173         int nId = Integer.parseInt( request.getParameter( PARAMETER_ID_FOLDER ) );
174         FolderListingDatabase folder = FolderListingDatabaseHome.findByPrimaryKey( nId, getPlugin(  ) );
175 
176         model.put( MARK_FOLDER, folder );
177         model.put( MARK_WORKGROUP_LIST, AdminWorkgroupService.getUserWorkgroups( getUser(  ), getLocale(  ) ) );
178 
179         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_FOLDER, getLocale(  ), model );
180 
181         return getAdminPage( template.getHtml(  ) );
182     }
183 
184     /**
185      * Process the confirmation of a removal of a folder
186      *
187      * @param request The Http Request
188      *
189      * @return A dynamic url
190      */
191     public String doConfirmDelete( HttpServletRequest request )
192     {
193         String strIdFolder = request.getParameter( PARAMETER_ID_FOLDER );
194         int nIdFolder = Integer.parseInt( strIdFolder );
195         String strDeleteUrl = JSP_DELETE_FOLDER + "?" + PARAMETER_ID_FOLDER + "=" + strIdFolder;
196         String strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_FOLDER_LINKED_PORTLET,
197                 AdminMessage.TYPE_STOP );
198 
199         // Check whether a folder is linked to a portlet
200         if ( FolderListingPortletHome.checkNoFolderInPortlet( nIdFolder ) )
201         {
202             FolderListingDatabase folder = FolderListingDatabaseHome.findByPrimaryKey( nIdFolder, getPlugin(  ) );
203             Object[] messageArgs = { folder.getFolderName(  ) };
204             strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_DELETE_FOLDER, messageArgs,
205                     strDeleteUrl, AdminMessage.TYPE_CONFIRMATION );
206         }
207 
208         return strUrl;
209     }
210 
211     /**
212      * Process the data capture form of a new Folder
213      *
214      * @param request The Http Request
215      *
216      * @return The Jsp URL of the process result
217      */
218     public String doCreateFolder( HttpServletRequest request )
219     {
220         FolderListingDatabase folder = new FolderListingDatabase(  );
221         String strFolderPath = request.getParameter( PARAMETER_FOLDER_PATH );
222         strFolderPath = cleanPath( strFolderPath );
223         folder.setFolderName( request.getParameter( PARAMETER_FOLDER_NAME ) );
224         folder.setFolderPath( strFolderPath );
225         folder.setWorkgroup( request.getParameter( PARAMETER_FOLDER_WORKGROUP ) );
226 
227         // Mandatory fields
228         if ( request.getParameter( PARAMETER_FOLDER_NAME ).equals( "" ) ||
229                 request.getParameter( PARAMETER_FOLDER_PATH ).equals( "" ) )
230         {
231             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
232         }
233 
234         String strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_FOLDER_INVALID, AdminMessage.TYPE_STOP );
235 
236         if ( isValidFolder( folder.getFolderPath(  ) ) )
237         {
238             FolderListingDatabaseHome.create( folder, getPlugin(  ) );
239             strUrl = getHomeUrl( request );
240         }
241 
242         return strUrl;
243     }
244 
245     /**
246      * Process folder removal
247      *
248      * @param request The Http request
249      *
250      * @return String The url of the administration console
251      */
252     public String doDeleteFolder( HttpServletRequest request )
253     {
254         int nId = Integer.parseInt( request.getParameter( PARAMETER_ID_FOLDER ) );
255         FolderListingDatabaseHome.remove( nId, getPlugin(  ) );
256 
257         return getHomeUrl( request );
258     }
259 
260     /**
261      * Process folder modification
262      *
263      * @param request The Http request
264      *
265      * @return String The url of the administration console
266      */
267     public String doModifyFolder( HttpServletRequest request )
268     {
269         int nIdFolder = Integer.parseInt( request.getParameter( PARAMETER_ID_FOLDER ) );
270         String strFolderPath = request.getParameter( PARAMETER_FOLDER_PATH );
271         String strFolderName = request.getParameter( PARAMETER_FOLDER_NAME );
272         strFolderPath = cleanPath( strFolderPath );
273 
274         // Mandatory fields
275         if ( request.getParameter( PARAMETER_FOLDER_PATH ).equals( "" ) ||
276                 request.getParameter( PARAMETER_FOLDER_NAME ).equals( "" ) )
277         {
278             return AdminMessageService.getMessageUrl( request, Messages.MANDATORY_FIELDS, AdminMessage.TYPE_STOP );
279         }
280 
281         FolderListingDatabase folder = FolderListingDatabaseHome.findByPrimaryKey( nIdFolder, getPlugin(  ) );
282         folder.setFolderName( strFolderName );
283         folder.setFolderPath( strFolderPath );
284         folder.setWorkgroup( request.getParameter( PARAMETER_FOLDER_WORKGROUP ) );
285 
286         String strUrl = AdminMessageService.getMessageUrl( request, MESSAGE_FOLDER_INVALID, AdminMessage.TYPE_STOP );
287 
288         if ( isValidFolder( folder.getFolderPath(  ) ) )
289         {
290             FolderListingDatabaseHome.update( folder, getPlugin(  ) );
291             strUrl = getHomeUrl( request );
292         }
293 
294         return strUrl;
295     }
296 
297     /**
298      * Verifies whether the folder is valid
299      * @param strFolderPath The Path of the folder
300      * @return true if the folder is a valid folder
301      */
302     private boolean isValidFolder( String strFolderPath )
303     {
304         strFolderPath = "/" + strFolderPath;
305 
306         String strAbsolutePath = AppPathService.getAbsolutePathFromRelativePath( strFolderPath );
307         boolean bValue = false;
308 
309         if ( new File( strAbsolutePath ).exists(  ) )
310         {
311             bValue = true;
312         }
313 
314         return bValue;
315     }
316 
317     /**
318      * Cleans the path of the folder path
319      * @param strPath
320      * @return
321      */
322     private String cleanPath( String strPath )
323     {
324         if ( !strPath.startsWith( "/" ) )
325         {
326             strPath = "/" + strPath;
327         }
328 
329         return strPath;
330     }
331 }