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.HashMap;
37  import java.util.List;
38  import java.util.Map;
39  import javax.servlet.http.HttpServletRequest;
40  import fr.paris.lutece.plugins.directories.util.DirectoriesConstants;
41  import fr.paris.lutece.plugins.genericattributes.business.Entry;
42  import fr.paris.lutece.plugins.genericattributes.business.EntryHome;
43  import fr.paris.lutece.plugins.genericattributes.business.Field;
44  import fr.paris.lutece.plugins.genericattributes.business.FieldHome;
45  import fr.paris.lutece.plugins.genericattributes.service.entrytype.IEntryTypeService;
46  import fr.paris.lutece.portal.service.i18n.I18nService;
47  import fr.paris.lutece.portal.service.message.AdminMessage;
48  import fr.paris.lutece.portal.service.message.AdminMessageService;
49  import fr.paris.lutece.portal.service.util.AppPathService;
50  import fr.paris.lutece.portal.util.mvc.admin.annotations.Controller;
51  import fr.paris.lutece.portal.util.mvc.commons.annotations.Action;
52  import fr.paris.lutece.portal.util.mvc.commons.annotations.View;
53  import fr.paris.lutece.portal.util.mvc.utils.MVCUtils;
54  import fr.paris.lutece.util.string.StringUtil;
55  import fr.paris.lutece.util.url.UrlItem;
56  import org.apache.commons.lang.StringUtils;
57  
58  /**
59   * JspBean to manage directories form fieldsl
60   * 
61   * @author
62   *
63   */
64  @Controller( controllerJsp = "ManageDirectoryFields.jsp", controllerPath = "jsp/admin/plugins/directories/", right = "DIRECTORIES_MANAGEMENT" )
65  public class DirectoryFieldsJspBean extends AbstractDirectoriesManagerJspBean
66  {
67      private static final long serialVersionUID = -1505164256619633838L;
68      // Urls
69      private static final String JSP_URL_MANAGE_DIRECTORYITEM_FORM_FIELDS = "jsp/admin/plugins/directories/ManageDirectoryFields.jsp";
70      // Views
71      private static final String VIEW_GET_MODIFY_FIELD_WITH_CONDITIONAL_QUESTIONS = "getModifyFieldCC";
72      // Parameters
73      private static final String PARAMETER_ID_FIELD = "id_field";
74      // templates
75      private static final String TEMPLATE_CREATE_FIELD = "admin/plugins/directories/entries/create_field.html";
76      private static final String TEMPLATE_MODIFY_FIELD = "admin/plugins/directories/entries/modify_field.html";
77      // properties
78      private static final String PROPERTY_CREATE_FIELD_TITLE = "directories.createField.title";
79      private static final String PROPERTY_MODIFY_FIELD_TITLE = "directories.modifyField.title";
80      // parameters form
81      private static final String PARAMETER_TITLE = "title";
82      private static final String PARAMETER_VALUE = "value";
83      private static final String PARAMETER_DEFAULT_VALUE = "default_value";
84      private static final String PARAMETER_NO_DISPLAY_TITLE = "no_display_title";
85      private static final String PARAMETER_COMMENT = "comment";
86      // Views
87      private static final String VIEW_MODIFY_FIELD = "modifyField";
88      private static final String VIEW_CREATE_FIELD = "createField";
89      private static final String VIEW_CONFIRM_REMOVE_FIELD = "confirmRemoveField";
90  
91      // Actions
92      private static final String ACTION_CREATE_FIELD = "createField";
93      private static final String ACTION_MODIFY_FIELD = "modifyField";
94      private static final String ACTION_MOVE_FIELD_UP = "moveFieldUp";
95      private static final String ACTION_MOVE_FIELD_DOWN = "moveFieldDown";
96      private static final String ACTION_REMOVE_FIELD = "removeField";
97  
98      // other constants
99      private static final String FIELD_TITLE_FIELD = "directories.createField.labelTitle";
100     private static final String FIELD_VALUE_FIELD = "directories.createField.labelValue";
101 
102     // Messages
103     private static final String MESSAGE_MANDATORY_FIELD = "portal.util.message.mandatoryField";
104     private static final String MESSAGE_FIELD_VALUE_FIELD = "directories.message.error.field_value_field";
105     private static final String MESSAGE_CONFIRM_REMOVE_FIELD = "directories.message.confirmRemoveField";
106 
107     /**
108      * Get the URL to modify a field. The field is assumed to allow conditional questions.
109      * 
110      * @param request
111      *            The request
112      * @param nIdField
113      *            The id of the field
114      * @return The URL of the page to modify the field
115      */
116     public static String getUrlModifyField( HttpServletRequest request, int nIdField )
117     {
118         UrlItem urlItem = new UrlItem( AppPathService.getBaseUrl( request ) + JSP_URL_MANAGE_DIRECTORYITEM_FORM_FIELDS );
119         urlItem.addParameter( MVCUtils.PARAMETER_VIEW, VIEW_GET_MODIFY_FIELD_WITH_CONDITIONAL_QUESTIONS );
120         urlItem.addParameter( PARAMETER_ID_FIELD, nIdField );
121         return urlItem.getUrl( );
122     }
123 
124     /**
125      * Gets the field creation page
126      * 
127      * @param request
128      *            The HTTP request
129      * @return the field creation page
130      */
131     @View( value = VIEW_CREATE_FIELD )
132     public String getCreateField( HttpServletRequest request )
133     {
134         String strIdEntry = request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY );
135         int nIdEntry = Integer.parseInt( strIdEntry );
136         Entry entry = EntryHome.findByPrimaryKey( nIdEntry );
137         Field field = new Field( );
138         field.setParentEntry( entry );
139         Map<String, Object> model = new HashMap<>( );
140         model.put( DirectoriesConstants.MARK_ID_DIRECTORY, request.getParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY ) );
141         model.put( DirectoriesConstants.MARK_ENTRY, entry );
142         model.put( DirectoriesConstants.MARK_FIELD, field );
143         return getPage( PROPERTY_CREATE_FIELD_TITLE, TEMPLATE_CREATE_FIELD, model );
144     }
145 
146     /**
147      * Perform creation field
148      * 
149      * @param request
150      *            The HTTP request
151      * @return The URL to go after performing the action
152      */
153     @Action( ACTION_CREATE_FIELD )
154     public String doCreateField( HttpServletRequest request )
155     {
156         int nIdEntry = Integer.parseInt( request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY ) );
157         Entry entry = new Entry( );
158         entry.setIdEntry( nIdEntry );
159         Field field = new Field( );
160         field.setParentEntry( entry );
161         String strError = getFieldData( request, field );
162         if ( strError != null )
163         {
164             return redirect( request, strError );
165         }
166         FieldHome.create( field );
167         return redirect( request, DirectoryEntriesJspBean.getURLModifyEntry( request, nIdEntry ) );
168 
169     }
170 
171     /**
172      * Get the page to modify a field without displaying its conditional questions
173      * 
174      * @param request
175      *            The request
176      * @return The HTML content to display, or the next URL to redirect to
177      */
178     @View( VIEW_MODIFY_FIELD )
179     public String getModifyField( HttpServletRequest request )
180     {
181         int nIdField = Integer.parseInt( request.getParameter( PARAMETER_ID_FIELD ) );
182         Field field = FieldHome.findByPrimaryKey( nIdField );
183         Entry entry = EntryHome.findByPrimaryKey( field.getParentEntry( ).getIdEntry( ) );
184         field.setParentEntry( entry );
185         HashMap<String, Object> model = new HashMap<>( );
186         model.put( DirectoriesConstants.MARK_ENTRY, entry );
187         model.put( DirectoriesConstants.MARK_FIELD, field );
188         return getPage( PROPERTY_MODIFY_FIELD_TITLE, TEMPLATE_MODIFY_FIELD, model );
189     }
190 
191     /**
192      * Perform modification field
193      * 
194      * @param request
195      *            The HTTP request
196      * @return The URL to go after performing the action
197      */
198     @Action( ACTION_MODIFY_FIELD )
199     public String doModifyField( HttpServletRequest request )
200     {
201         String strIdField = request.getParameter( PARAMETER_ID_FIELD );
202         int nIdEntry = Integer.parseInt( request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY ) );
203         Field field = null;
204         int nIdField = Integer.parseInt( strIdField );
205         field = FieldHome.findByPrimaryKey( nIdField );
206         String strError = getFieldData( request, field );
207         if ( strError != null )
208         {
209             return strError;
210         }
211         FieldHome.update( field );
212         return redirect( request, DirectoryEntriesJspBean.getURLModifyEntry( request, nIdEntry ) );
213     }
214 
215     /**
216      * Move a field up
217      * 
218      * @param request
219      *            The request
220      * @return The next URL to redirect to
221      */
222     @Action( ACTION_MOVE_FIELD_UP )
223     public String doMoveFieldUp( HttpServletRequest request )
224     {
225         return doMoveField( request, true );
226     }
227 
228     /**
229      * Move a field down
230      * 
231      * @param request
232      *            The request
233      * @return The next URL to redirect to
234      */
235     @Action( ACTION_MOVE_FIELD_DOWN )
236     public String doMoveFieldDown( HttpServletRequest request )
237     {
238         return doMoveField( request, false );
239     }
240 
241     /**
242      * Move a field up or down
243      * 
244      * @param request
245      *            The request
246      * @param bMoveUp
247      *            True to move the field up, false to move it down
248      * @return The next URL to redirect to
249      */
250     private String doMoveField( HttpServletRequest request, boolean bMoveUp )
251     {
252         int nIdEntry = Integer.parseInt( request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY ) );
253         int nIdField = Integer.parseInt( request.getParameter( DirectoriesConstants.PARAMETER_ID_FIELD ) );
254         Field field = FieldHome.findByPrimaryKey( nIdField );
255         List<Field> listField = FieldHome.getFieldListByIdEntry( field.getParentEntry( ).getIdEntry( ) );
256         int nIndexField = getIndexFieldInTheFieldList( nIdField, listField );
257 
258         if ( nIndexField != -1 && ( ( bMoveUp && nIndexField > 0 ) || ( !bMoveUp && nIndexField < ( listField.size( ) - 1 ) ) ) )
259         {
260             Field fieldToInversePosition = listField.get( bMoveUp ? ( nIndexField - 1 ) : ( nIndexField + 1 ) );
261             int nNewPosition = fieldToInversePosition.getPosition( );
262             fieldToInversePosition.setPosition( field.getPosition( ) );
263             field.setPosition( nNewPosition );
264             FieldHome.update( field );
265             FieldHome.update( fieldToInversePosition );
266         }
267         return redirect( request, DirectoryEntriesJspBean.getURLModifyEntry( request, nIdEntry ) );
268     }
269 
270     /**
271      * Get the request data and if there is no error insert the data in the field specified in parameter. return null if there is no error or else return the
272      * error page URL
273      * 
274      * @param request
275      *            the request
276      * @param field
277      *            field
278      * @return null if there is no error or else return the error page URL
279      */
280     private String getFieldData( HttpServletRequest request, Field field )
281     {
282         String strTitle = request.getParameter( PARAMETER_TITLE );
283         String strValue = request.getParameter( PARAMETER_VALUE );
284         String strDefaultValue = request.getParameter( PARAMETER_DEFAULT_VALUE );
285         String strNoDisplayTitle = request.getParameter( PARAMETER_NO_DISPLAY_TITLE );
286         String strComment = request.getParameter( PARAMETER_COMMENT );
287         String strFieldError = null;
288         if ( StringUtils.isEmpty( strTitle ) )
289         {
290             strFieldError = FIELD_TITLE_FIELD;
291         }
292         else
293             if ( StringUtils.isEmpty( strValue ) )
294             {
295                 strFieldError = FIELD_VALUE_FIELD;
296             }
297             else
298                 if ( !StringUtil.checkCodeKey( strValue ) )
299                 {
300                     return AdminMessageService.getMessageUrl( request, MESSAGE_FIELD_VALUE_FIELD, AdminMessage.TYPE_STOP );
301                 }
302         if ( strFieldError != null )
303         {
304             Object [ ] tabRequiredFields = {
305                     I18nService.getLocalizedString( strFieldError, getLocale( ) )
306             };
307             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
308         }
309         field.setCode( IEntryTypeService.FIELD_ANSWER_CHOICE );
310         field.setTitle( strTitle );
311         field.setValue( strValue );
312         field.setComment( strComment );
313         field.setDefaultValue( strDefaultValue != null );
314         field.setNoDisplayTitle( strNoDisplayTitle != null );
315         // field.setParentEntry(EntryHome.findByPrimaryKey(nIdEntry));
316         return null; // No error
317     }
318 
319     /**
320      * Return the index in the list of the field whose key is specified in parameter
321      * 
322      * @param nIdField
323      *            the key of the field
324      * @param listField
325      *            the list of field
326      * @return the index in the list of the field whose key is specified in parameter
327      */
328     public static int getIndexFieldInTheFieldList( int nIdField, List<Field> listField )
329     {
330         int nIndex = 0;
331 
332         for ( Field field : listField )
333         {
334             if ( field.getIdField( ) == nIdField )
335             {
336                 return nIndex;
337             }
338             nIndex++;
339         }
340 
341         return nIndex;
342     }
343 
344     /**
345      * Gets the confirmation page of delete field
346      * 
347      * @param request
348      *            The HTTP request
349      * @return the html code to confirm
350      */
351     @View( value = VIEW_CONFIRM_REMOVE_FIELD )
352     public String getConfirmRemoveField( HttpServletRequest request )
353     {
354         String strIdField = request.getParameter( DirectoriesConstants.PARAMETER_ID_FIELD );
355         String strIdEntry = request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY );
356         String strIdDirectory = request.getParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY );
357         UrlItem url = new UrlItem( getActionUrl( ACTION_REMOVE_FIELD ) );
358         url.addParameter( DirectoriesConstants.PARAMETER_ID_FIELD, strIdField );
359         url.addParameter( DirectoriesConstants.PARAMETER_ID_ENTRY, strIdEntry );
360         url.addParameter( DirectoriesConstants.PARAMETER_ID_DIRECTORY, strIdDirectory );
361 
362         String strMessageUrl = AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE_FIELD, url.getUrl( ), AdminMessage.TYPE_CONFIRMATION );
363 
364         return redirect( request, strMessageUrl );
365     }
366 
367     /**
368      * Perform suppression field
369      * 
370      * @param request
371      *            The HTTP request
372      * @return The URL to go after performing the action
373      */
374     @Action( ACTION_REMOVE_FIELD )
375     public String doRemoveField( HttpServletRequest request )
376     {
377         int nIdField = Integer.parseInt( request.getParameter( DirectoriesConstants.PARAMETER_ID_FIELD ) );
378         int nIdEntry = Integer.parseInt( request.getParameter( DirectoriesConstants.PARAMETER_ID_ENTRY ) );
379         FieldHome.remove( nIdField );
380         return redirect( request, DirectoryEntriesJspBean.getURLModifyEntry( request, nIdEntry ) );
381     }
382 
383 }