View Javadoc
1   /*
2    * Copyright (c) 2002-2020, City of 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.directories.web;
35  
36  import java.util.ArrayList;
37  import java.util.HashMap;
38  import java.util.List;
39  import java.util.Map;
40  import javax.servlet.http.HttpServletRequest;
41  import org.apache.commons.lang.StringUtils;
42  import fr.paris.lutece.plugins.directories.service.DirectoriesPlugin;
43  import fr.paris.lutece.plugins.directories.service.EntryService;
44  import fr.paris.lutece.plugins.directories.service.EntryTypeService;
45  import fr.paris.lutece.plugins.directories.util.DirectoriesConstants;
46  import fr.paris.lutece.plugins.genericattributes.business.Entry;
47  import fr.paris.lutece.plugins.genericattributes.business.EntryFilter;
48  import fr.paris.lutece.plugins.genericattributes.business.EntryHome;
49  import fr.paris.lutece.plugins.genericattributes.business.EntryType;
50  import fr.paris.lutece.plugins.genericattributes.business.EntryTypeHome;
51  import fr.paris.lutece.plugins.genericattributes.business.Field;
52  import fr.paris.lutece.plugins.genericattributes.business.FieldHome;
53  import fr.paris.lutece.plugins.genericattributes.business.ResponseFilter;
54  import fr.paris.lutece.plugins.genericattributes.business.ResponseHome;
55  import fr.paris.lutece.plugins.genericattributes.service.entrytype.EntryTypeServiceManager;
56  import fr.paris.lutece.plugins.genericattributes.service.entrytype.IEntryTypeService;
57  import fr.paris.lutece.portal.service.admin.AccessDeniedException;
58  import fr.paris.lutece.portal.service.admin.AdminUserService;
59  import fr.paris.lutece.portal.service.message.AdminMessage;
60  import fr.paris.lutece.portal.service.message.AdminMessageService;
61  import fr.paris.lutece.portal.service.template.AppTemplateService;
62  import fr.paris.lutece.portal.service.util.AppPathService;
63  import fr.paris.lutece.portal.util.mvc.admin.MVCAdminJspBean;
64  import fr.paris.lutece.portal.util.mvc.admin.annotations.Controller;
65  import fr.paris.lutece.portal.util.mvc.commons.annotations.Action;
66  import fr.paris.lutece.portal.util.mvc.commons.annotations.View;
67  import fr.paris.lutece.portal.util.mvc.utils.MVCUtils;
68  import fr.paris.lutece.util.html.HtmlTemplate;
69  import fr.paris.lutece.util.url.UrlItem;
70  
71  /**
72   * JspBean to manage directory entries model entries
73   * 
74   * @author
75   *
76   */
77  @Controller( controllerJsp = "ManageDirectoryEntries.jsp", controllerPath = "jsp/admin/plugins/directories/", right = "DIRECTORIES_MANAGEMENT" )
78  public class DirectoryEntriesJspBean extends MVCAdminJspBean
79  {
80      private static final long serialVersionUID = -6682482064278399335L;
81      // Messages
82      private static final String MESSAGE_CONFIRM_REMOVE_ENTRY = "directories.message.confirmRemoveEntry";
83      private static final String MESSAGE_CANT_REMOVE_ENTRY = "advert.message.cantRemoveEntry";
84      private static final String MESSAGE_CANT_REMOVE_ENTRY_RESOURCES_ATTACHED = "directories.message.cantRemoveEntry.resourceAttached";
85      private static final String PROPERTY_CREATE_ENTRY_TITLE = "directories.createEntry.titleQuestion";
86      private static final String PROPERTY_MANAGE_DIRECTORY_ENTRIES = "directories.manage_directory_entries.lightTitle";
87      private static final String PROPERTY_CREATE_ENTITY = "directories.entity.create.title";
88  
89      // Views
90      private static final String VIEW_GET_CREATE_ENTRY = "getCreateEntry";
91      private static final String VIEW_GET_MODIFY_ENTRY = "getModifyEntry";
92      private static final String VIEW_CONFIRM_REMOVE_ENTRY = "confirmRemoveEntry";
93      private static final String VIEW_MANAGE_DIRECTORY_ENTRIES = "manageDirectoryEntries";
94      private static final String VIEW_CREATE_DIRECTORY_ENTRIES_RESPONSE = "createDirectoryResponse";
95      // Actions
96      private static final String ACTION_DO_CREATE_ENTRY = "doCreateEntry";
97      private static final String ACTION_DO_MODIFY_ENTRY = "doModifyEntry";
98      private static final String ACTION_DO_REMOVE_ENTRY = "doRemoveEntry";
99      private static final String ACTION_DO_CHANGE_ORDER_ENTRY = "doChangeOrderEntry";
100     // Templates
101     private static final String TEMPLATE_MANAGE_DIRECTORY = "/admin/plugins/directories/manage_directory_entries.html";
102     private static final String TEMPLATE_CREATE_DIRECTORY_ENTRIES_RESPONSE = "/admin/plugins/directories/create_directory_response.html";
103     private static final String TEMPLATE_HTML_CODE_FORM_ADMIN = "admin/plugins/directories/html_code_form.html";
104     // Local variables
105     private EntryService _entryService = EntryService.getService( );
106 
107     /**
108      * Get the HTML code to create an entry
109      * 
110      * @param request
111      *            The request
112      * @return The HTML code to display or the next URL to redirect to
113      */
114     @View( value = VIEW_MANAGE_DIRECTORY_ENTRIES )
115     public String getManageDirectoryEntries( HttpServletRequest request )
116     {
117         String strIdDirectory = request.getParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY );
118         int nIdDirectory = Integer.parseInt( strIdDirectory );
119         Map<String, Object> model = getModel( );
120         model.put( DirectoriesConstants.PARAMETER_ID_DIRECTORY, nIdDirectory );
121         EntryService.addListEntryToModel( model, nIdDirectory );
122         return getPage( PROPERTY_MANAGE_DIRECTORY_ENTRIES, TEMPLATE_MANAGE_DIRECTORY, model );
123     }
124 
125     /**
126      * Returns the form to create a directory
127      * 
128      * @param request
129      *            The HTTP request
130      * @return the HTML code of the directory entries model
131      * @throws AccessDeniedException
132      *             If the user is not authorized to access this feature
133      */
134     @View( VIEW_CREATE_DIRECTORY_ENTRIES_RESPONSE )
135     public synchronized String getViewCreateDirectory( HttpServletRequest request ) throws AccessDeniedException
136     {
137         String strIdDirectory = request.getParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY );
138         int nIdDirectory = Integer.parseInt( strIdDirectory );
139         Map<String, Object> model = getModel( );
140         List<Entry> listEntryFirstLevel = EntryService.getDirectoryEntryList( nIdDirectory, true );
141         StringBuilder strBuilder = new StringBuilder( );
142         for ( Entry entry : listEntryFirstLevel )
143         {
144             EntryService.getHtmlEntry( model, entry.getIdEntry( ), strBuilder, getLocale( ), false );
145         }
146         model.put( DirectoriesConstants.MARK_STR_ENTRY, strBuilder.toString( ) );
147         HtmlTemplate templateForm = AppTemplateService.getTemplate( TEMPLATE_HTML_CODE_FORM_ADMIN, getLocale( ), model );
148         model.put( DirectoriesConstants.MARK_FORM_HTML, templateForm.getHtml( ) );
149         return getPage( PROPERTY_CREATE_ENTITY, TEMPLATE_CREATE_DIRECTORY_ENTRIES_RESPONSE, model );
150     }
151 
152     /**
153      * Get the HTML code to create an entry
154      * 
155      * @param request
156      *            The request
157      * @return The HTML code to display or the next URL to redirect to
158      */
159     @View( value = VIEW_GET_CREATE_ENTRY )
160     public String getCreateEntry( HttpServletRequest request )
161     {
162         String strIdDirectory = request.getParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY );
163         String strIdType = request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY_TYPE );
164         int nIdDirectory = Integer.parseInt( strIdDirectory );
165         int nIdType = Integer.parseInt( strIdType );
166         Entry entry = new Entry( );
167         entry.setEntryType( EntryTypeHome.findByPrimaryKey( nIdType ) );
168         String strIdField = request.getParameter( DirectoriesConstants.PARAMETER_ID_FIELD );
169         int nIdField = -1;
170         if ( StringUtils.isNotEmpty( strIdField ) && StringUtils.isNumeric( strIdField ) )
171         {
172             nIdField = Integer.parseInt( strIdField );
173             Field field = new Field( );
174             field.setIdField( nIdField );
175             entry.setFieldDepend( field );
176         }
177         entry.setIdResource( nIdDirectory );
178         entry.setResourceType( DirectoriesPlugin.RESOURCE_TYPE );
179         Map<String, Object> model = new HashMap<>( );
180         model.put( DirectoriesConstants.MARK_ENTRY, entry );
181         model.put( DirectoriesConstants.MARK_WEBAPP_URL, AppPathService.getBaseUrl( request ) );
182         model.put( DirectoriesConstants.MARK_LOCALE, AdminUserService.getLocale( request ).getLanguage( ) );
183         model.put( DirectoriesConstants.MARK_ENTRY_TYPE_SERVICE, EntryTypeServiceManager.getEntryTypeService( entry ) );
184         String strTemplate = EntryTypeServiceManager.getEntryTypeService( entry ).getTemplateCreate( entry, false );
185         if ( strTemplate == null )
186         {
187             return doCreateEntry( request );
188         }
189         model.put( DirectoriesConstants.PARAMETER_ID_DIRECTORY, nIdDirectory );
190         return getPage( PROPERTY_CREATE_ENTRY_TITLE, strTemplate, model );
191     }
192 
193     /**
194      * Do create an entry
195      * 
196      * @param request
197      *            the request
198      * @return The HTML code to display or the next URL to redirect to
199      */
200     @Action( ACTION_DO_CREATE_ENTRY )
201     public String doCreateEntry( HttpServletRequest request )
202     {
203         String strIdDirectory = request.getParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY );
204         String strIdType = request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY_TYPE );
205         int nIdDirectory = Integer.parseInt( strIdDirectory );
206         Field fieldDepend = null;
207         if ( ( request.getParameter( DirectoriesConstants.PARAMETER_CANCEL ) == null ) && StringUtils.isNotEmpty( strIdType )
208                 && StringUtils.isNumeric( strIdType ) )
209         {
210             int nIdType = Integer.parseInt( strIdType );
211             EntryType entryType = new EntryType( );
212             entryType.setIdType( nIdType );
213             Entry entry = new Entry( );
214             entry.setEntryType( EntryTypeService.getInstance( ).getEntryType( nIdType ) );
215             String strIdField = request.getParameter( DirectoriesConstants.PARAMETER_ID_FIELD );
216             int nIdField = -1;
217             if ( StringUtils.isNotEmpty( strIdField ) && StringUtils.isNumeric( strIdField ) )
218             {
219                 nIdField = Integer.parseInt( strIdField );
220                 fieldDepend = new Field( );
221                 fieldDepend.setIdField( nIdField );
222                 entry.setFieldDepend( fieldDepend );
223             }
224             String strError = EntryService.doCreateOrModifyEntry( entry, request );
225             if ( strError != null )
226             {
227                 return redirect( request, strError );
228             }
229             entry.setIdResource( nIdDirectory );
230             entry.setResourceType( DirectoriesPlugin.RESOURCE_TYPE );
231             entry.setIdEntry( EntryHome.create( entry ) );
232             if ( entry.getFields( ) != null )
233             {
234                 for ( Field field : entry.getFields( ) )
235                 {
236                     field.setParentEntry( entry );
237                     FieldHome.create( field );
238                 }
239             }
240             if ( request.getParameter( DirectoriesConstants.PARAMETER_APPLY ) != null )
241             {
242                 return redirect( request, VIEW_GET_MODIFY_ENTRY, DirectoriesConstants.PARAMETER_ID_ENTRY, entry.getIdEntry( ) );
243             }
244         }
245         if ( fieldDepend != null )
246         {
247             return redirect( request, DirectoryFieldsJspBean.getUrlModifyField( request, fieldDepend.getIdField( ) ) );
248         }
249         return redirect( request, getURLModify( request, strIdDirectory ) );
250     }
251 
252     /**
253      * Gets the entry modification page
254      * 
255      * @param request
256      *            The HTTP request
257      * @return The entry modification page
258      */
259     @View( VIEW_GET_MODIFY_ENTRY )
260     public String getModifyEntry( HttpServletRequest request )
261     {
262         String strIdEntry = request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY );
263         int nIdEntry = Integer.parseInt( strIdEntry );
264         Entry entry = EntryHome.findByPrimaryKey( nIdEntry );
265         int nIdDirectory = entry.getIdResource( );
266         IEntryTypeService entryTypeService = EntryTypeServiceManager.getEntryTypeService( entry );
267         Map<String, Object> model = new HashMap<String, Object>( );
268         UrlItem urlItem = new UrlItem( AppPathService.getBaseUrl( request ) + getViewUrl( VIEW_GET_MODIFY_ENTRY ) );
269         urlItem.addParameter( DirectoriesConstants.PARAMETER_ID_ENTRY, strIdEntry );
270         model.put( DirectoriesConstants.MARK_ENTRY, entry );
271         model.put( DirectoriesConstants.MARK_LIST, entry.getFields( ) );
272         model.put( DirectoriesConstants.MARK_WEBAPP_URL, AppPathService.getBaseUrl( request ) );
273         model.put( DirectoriesConstants.MARK_LOCALE, AdminUserService.getLocale( request ).getLanguage( ) );
274         model.put( DirectoriesConstants.MARK_ENTRY_TYPE_SERVICE, EntryTypeServiceManager.getEntryTypeService( entry ) );
275         model.put( DirectoriesConstants.PARAMETER_ID_DIRECTORY, nIdDirectory );
276         return getPage( "modify", entryTypeService.getTemplateModify( entry, false ), model );
277     }
278 
279     /**
280      * Perform the entry modification
281      * 
282      * @param request
283      *            The HTTP request
284      * @return The URL to go after performing the action
285      */
286     @Action( ACTION_DO_MODIFY_ENTRY )
287     public String doModifyEntry( HttpServletRequest request )
288     {
289         String strIdDirectory = request.getParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY );
290         String strIdEntry = request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY );
291         if ( StringUtils.isNotEmpty( strIdEntry ) && StringUtils.isNumeric( strIdEntry ) )
292         {
293             int nIdEntry = Integer.parseInt( strIdEntry );
294             Entry entry = EntryHome.findByPrimaryKey( nIdEntry );
295             if ( request.getParameter( DirectoriesConstants.PARAMETER_CANCEL ) == null )
296             {
297                 String strError = EntryService.doCreateOrModifyEntry( entry, request );
298                 if ( strError != null )
299                 {
300                     return redirect( request, strError );
301                 }
302                 EntryHome.update( entry );
303                 if ( entry.getFields( ) != null )
304                 {
305                     for ( Field field : entry.getFields( ) )
306                     {
307                         Field fieldStored = FieldHome.findByPrimaryKey( field.getIdField( ) );
308                         if ( fieldStored != null )
309                         {
310                             FieldHome.update( field );
311                         }
312                         else
313                         {
314                             FieldHome.create( field );
315                         }
316                     }
317                 }
318             }
319             if ( request.getParameter( DirectoriesConstants.PARAMETER_APPLY ) != null )
320             {
321                 return redirect( request, VIEW_GET_MODIFY_ENTRY, DirectoriesConstants.PARAMETER_ID_ENTRY, nIdEntry );
322             }
323         }
324         return redirect( request, getURLModify( request, strIdDirectory ) );
325     }
326 
327     /**
328      * Get the URL to modify an entry
329      * 
330      * @param request
331      *            The request
332      * @param nIdEntry
333      *            The id of the entry
334      * @return The URL to modify the given entry
335      */
336     public static String getURLModifyEntry( HttpServletRequest request, int nIdEntry )
337     {
338         UrlItem urlItem = new UrlItem( AppPathService.getBaseUrl( request ) + DirectoriesConstants.JSP_MANAGE_DIRECTORY_ENTRIES );
339         urlItem.addParameter( MVCUtils.PARAMETER_VIEW, VIEW_GET_MODIFY_ENTRY );
340         urlItem.addParameter( DirectoriesConstants.PARAMETER_ID_ENTRY, nIdEntry );
341         return urlItem.getUrl( );
342     }
343 
344     /**
345      * Get the URL to modify a directory entries model
346      * 
347      * @param request
348      *            The request
349      * @param nIdDirectory
350      *            The id of the directory
351      * @return The URL to modify the given directory entries model
352      */
353     public static String getURLModify( HttpServletRequest request, int nIdDirectory )
354     {
355         return getURLModify( request, Integer.toString( nIdDirectory ) );
356     }
357 
358     /**
359      * Get the URL to modify a directory entries model
360      * 
361      * @param request
362      *            The request
363      * @param strIdDirectory
364      *            The id of the directory
365      * @return The URL to modify the given directory entries model
366      */
367     public static String getURLModify( HttpServletRequest request, String strIdDirectory )
368     {
369         UrlItem urlItem = new UrlItem( AppPathService.getBaseUrl( request ) + DirectoriesConstants.JSP_MANAGE_DIRECTORY_ENTRIES );
370         urlItem.addParameter( MVCUtils.PARAMETER_VIEW, VIEW_MANAGE_DIRECTORY_ENTRIES );
371         urlItem.addParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY, strIdDirectory );
372         return urlItem.getUrl( );
373     }
374 
375     /**
376      * Gets the confirmation page of delete entry
377      * 
378      * @param request
379      *            The HTTP request
380      * @return the confirmation page of delete entry
381      */
382     @View( VIEW_CONFIRM_REMOVE_ENTRY )
383     public String getConfirmRemoveEntry( HttpServletRequest request )
384     {
385         String strIdEntry = request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY );
386         int nIdEntry = Integer.parseInt( strIdEntry );
387         ResponseFilter responsefilter = new ResponseFilter( );
388         responsefilter.setIdEntry( nIdEntry );
389         if ( !ResponseHome.getResponseList( responsefilter ).isEmpty( ) )
390         {
391             return redirect( request, AdminMessageService.getMessageUrl( request, MESSAGE_CANT_REMOVE_ENTRY_RESOURCES_ATTACHED, AdminMessage.TYPE_STOP ) );
392         }
393         UrlItem url = new UrlItem( getActionUrl( ACTION_DO_REMOVE_ENTRY ) );
394         url.addParameter( DirectoriesConstants.PARAMETER_ID_ENTRY, strIdEntry );
395         return redirect( request, AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE_ENTRY, url.getUrl( ), AdminMessage.TYPE_CONFIRMATION ) );
396     }
397 
398     /**
399      * Perform the entry removal
400      * 
401      * @param request
402      *            The HTTP request
403      * @return The URL to go after performing the action
404      */
405     @Action( ACTION_DO_REMOVE_ENTRY )
406     public String doRemoveEntry( HttpServletRequest request )
407     {
408         String strIdEntry = request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY );
409         int nIdEntry = Integer.parseInt( strIdEntry );
410         Entry entry = EntryHome.findByPrimaryKey( nIdEntry );
411         List<String> listErrors = new ArrayList<>( );
412         if ( !_entryService.checkForRemoval( strIdEntry, listErrors, getLocale( ) ) )
413         {
414             String strCause = AdminMessageService.getFormattedList( listErrors, getLocale( ) );
415             Object [ ] args = {
416                     strCause
417             };
418             return AdminMessageService.getMessageUrl( request, MESSAGE_CANT_REMOVE_ENTRY, args, AdminMessage.TYPE_STOP );
419         }
420         // Update order
421         List<Entry> listEntry;
422         EntryFilter filter = new EntryFilter( );
423         filter.setIdResource( entry.getIdResource( ) );
424         filter.setResourceType( DirectoriesPlugin.PLUGIN_NAME );
425         listEntry = EntryHome.getEntryList( filter );
426         if ( entry.getFieldDepend( ) == null )
427         {
428             _entryService.moveDownEntryOrder( listEntry.size( ), entry );
429         }
430         else
431         {
432             // conditional questions
433             EntryHome.decrementOrderByOne( entry.getPosition( ), entry.getFieldDepend( ).getIdField( ), entry.getIdResource( ), entry.getResourceType( ) );
434         }
435         EntryHome.remove( nIdEntry );
436         return redirect( request, getURLModify( request, entry.getIdResource( ) ) );
437     }
438 
439     /**
440      * Change the attribute's order (move up or move down in the list)
441      * 
442      * @param request
443      *            the request
444      * @return The URL of the form management page
445      */
446     @Action( ACTION_DO_CHANGE_ORDER_ENTRY )
447     public String doChangeOrderEntry( HttpServletRequest request )
448     {
449         String strIdDirectory = request.getParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY );
450         int nIdDirectory = Integer.parseInt( strIdDirectory );
451         Integer nEntryId = Integer.parseInt( request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY ) );
452         Integer nOrderToSet = Integer
453                 .parseInt( request.getParameter( DirectoriesConstants.PARAMETER_ORDER_ID + request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY ) ) );
454         Entry entryToChangeOrder = EntryHome.findByPrimaryKey( nEntryId );
455         int nActualOrder = entryToChangeOrder.getPosition( );
456         if ( nOrderToSet != nActualOrder )
457         {
458             if ( nOrderToSet < entryToChangeOrder.getPosition( ) )
459             {
460                 _entryService.moveUpEntryOrder( nOrderToSet, entryToChangeOrder );
461             }
462             else
463             {
464                 _entryService.moveDownEntryOrder( nOrderToSet, entryToChangeOrder );
465             }
466         }
467         return redirect( request, getURLModify( request, nIdDirectory ) );
468     }
469 
470 }