View Javadoc
1   /*
2    * Copyright (c) 2002-2022, 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.genericattributes.service.entrytype;
35  
36  import java.util.List;
37  import java.util.Locale;
38  
39  import javax.servlet.http.HttpServletRequest;
40  import org.apache.commons.collections.CollectionUtils;
41  import org.apache.commons.fileupload.FileItem;
42  import org.apache.commons.lang3.StringUtils;
43  
44  import fr.paris.lutece.plugins.genericattributes.business.Entry;
45  import fr.paris.lutece.plugins.genericattributes.business.Field;
46  import fr.paris.lutece.plugins.genericattributes.business.GenericAttributeError;
47  import fr.paris.lutece.plugins.genericattributes.business.MandatoryError;
48  import fr.paris.lutece.plugins.genericattributes.business.Response;
49  import fr.paris.lutece.plugins.genericattributes.util.GenericAttributesUtils;
50  import fr.paris.lutece.portal.business.regularexpression.RegularExpression;
51  import fr.paris.lutece.portal.service.fileimage.FileImagePublicService;
52  import fr.paris.lutece.portal.service.i18n.I18nService;
53  import fr.paris.lutece.portal.service.image.ImageResourceManager;
54  import fr.paris.lutece.portal.service.message.AdminMessage;
55  import fr.paris.lutece.portal.service.message.AdminMessageService;
56  import fr.paris.lutece.portal.service.plugin.Plugin;
57  import fr.paris.lutece.portal.service.regularexpression.RegularExpressionService;
58  import fr.paris.lutece.portal.service.util.AppException;
59  import fr.paris.lutece.portal.service.util.AppLogService;
60  import fr.paris.lutece.util.ReferenceList;
61  import fr.paris.lutece.util.string.StringUtil;
62  import fr.paris.lutece.portal.web.upload.MultipartHttpServletRequest;
63  
64  /**
65   * Abstract entry type for text
66   */
67  public abstract class AbstractEntryTypeText extends EntryTypeService
68  {
69  	private static final String MESSAGE_ERROR_FILE_IMAGE = "Error importing file.";
70      /**
71       * {@inheritDoc}
72       */
73      @Override
74      public String getRequestData( Entry entry, HttpServletRequest request, Locale locale )
75      {
76          initCommonRequestData( entry, request );
77          String strCode = request.getParameter( PARAMETER_ENTRY_CODE );
78          String strTitle = request.getParameter( PARAMETER_TITLE );
79          String strHelpMessage = ( request.getParameter( PARAMETER_HELP_MESSAGE ) != null ) ? request.getParameter( PARAMETER_HELP_MESSAGE ).trim( ) : null;
80          String strComment = request.getParameter( PARAMETER_COMMENT );
81          String strValue = request.getParameter( PARAMETER_VALUE );
82          String strMandatory = request.getParameter( PARAMETER_MANDATORY );
83          String strWidth = request.getParameter( PARAMETER_WIDTH );
84          String strMaxSizeEnter = request.getParameter( PARAMETER_MAX_SIZE_ENTER );
85          String strConfirmField = request.getParameter( PARAMETER_CONFIRM_FIELD );
86          String strConfirmFieldTitle = request.getParameter( PARAMETER_CONFIRM_FIELD_TITLE );
87          String strUnique = request.getParameter( PARAMETER_UNIQUE );
88          String strCSSClass = request.getParameter( PARAMETER_CSS_CLASS );
89          String strOnlyDisplayInBack = request.getParameter( PARAMETER_ONLY_DISPLAY_IN_BACK );
90          String strErrorMessage = request.getParameter( PARAMETER_ERROR_MESSAGE );
91          String strIndexed = request.getParameter( PARAMETER_INDEXED );
92          String strPlaceholder = request.getParameter( PARAMETER_PLACEHOLDER );
93          FileItem imageFileItem = null;
94          if( request instanceof MultipartHttpServletRequest ) 
95          {
96              MultipartHttpServletRequest multipartRequest = ( MultipartHttpServletRequest ) request;
97              imageFileItem = multipartRequest.getFile( PARAMETER_ILLUSTRATION_IMAGE );
98          }
99  
100         int nWidth = -1;
101         int nMaxSizeEnter = -1;
102 
103         String strFieldError = StringUtils.EMPTY;
104 
105         if ( StringUtils.isBlank( strTitle ) )
106         {
107             strFieldError = ERROR_FIELD_TITLE;
108         }
109 
110         else
111             if ( StringUtils.isBlank( strWidth ) )
112             {
113                 strFieldError = ERROR_FIELD_WIDTH;
114             }
115 
116         if ( ( strConfirmField != null ) && StringUtils.isBlank( strConfirmFieldTitle ) )
117         {
118             strFieldError = FIELD_CONFIRM_FIELD_TITLE;
119         }
120 
121         if ( StringUtils.isNotBlank( strFieldError ) )
122         {
123             Object [ ] tabRequiredFields = {
124                     I18nService.getLocalizedString( strFieldError, locale )
125             };
126 
127             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
128         }
129 
130         try
131         {
132             nWidth = Integer.parseInt( strWidth );
133         }
134         catch( NumberFormatException ne )
135         {
136             strFieldError = ERROR_FIELD_WIDTH;
137         }
138 
139         try
140         {
141             if ( StringUtils.isNotBlank( strMaxSizeEnter ) )
142             {
143                 nMaxSizeEnter = Integer.parseInt( strMaxSizeEnter );
144             }
145         }
146         catch( NumberFormatException ne )
147         {
148             strFieldError = FIELD_MAX_SIZE_ENTER;
149         }
150 
151         if ( StringUtils.isNotBlank( strFieldError ) )
152         {
153             Object [ ] tabRequiredFields = {
154                     I18nService.getLocalizedString( strFieldError, locale )
155             };
156 
157             return AdminMessageService.getMessageUrl( request, MESSAGE_NUMERIC_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
158         }
159 
160         entry.setTitle( strTitle );
161         entry.setHelpMessage( strHelpMessage );
162         entry.setComment( strComment );
163         entry.setCSSClass( strCSSClass );
164         entry.setIndexed( strIndexed != null );
165         entry.setErrorMessage( strErrorMessage );
166         entry.setCode( strCode );
167 
168         if ( imageFileItem != null && imageFileItem.getSize( ) > 0 )
169         {
170             try
171             {
172                 String strFileStoreKey = ImageResourceManager.addImageResource( FileImagePublicService.IMAGE_RESOURCE_TYPE_ID, imageFileItem );
173                 GenericAttributesUtils.createOrUpdateField( entry, FIELD_ILLUSTRATION_IMAGE, imageFileItem.getName( ), strFileStoreKey );
174             }
175             catch ( Exception e ) 
176             {
177             	AppLogService.error( MESSAGE_ERROR_FILE_IMAGE, e );
178                 throw new AppException( MESSAGE_ERROR_FILE_IMAGE, e );
179             }
180         }
181         
182         GenericAttributesUtils.createOrUpdateField( entry, FIELD_TEXT_CONF, null, strValue );
183         GenericAttributesUtils.createOrUpdateField( entry, FIELD_WIDTH, null, String.valueOf( nWidth ) );
184         GenericAttributesUtils.createOrUpdateField( entry, FIELD_MAX_SIZE, null, String.valueOf( nMaxSizeEnter ) );
185         GenericAttributesUtils.createOrUpdateField( entry, FIELD_PLACEHOLDER, null, strPlaceholder != null ? strPlaceholder : StringUtils.EMPTY );
186         
187         entry.setMandatory( strMandatory != null );
188         entry.setOnlyDisplayInBack( strOnlyDisplayInBack != null );
189 
190         boolean confirm = false;
191         String fieldTitle = null;
192         if ( strConfirmField != null )
193         {
194             confirm = true;
195             fieldTitle = strConfirmFieldTitle;
196         }
197 
198         GenericAttributesUtils.createOrUpdateField( entry, FIELD_CONFIRM, fieldTitle, String.valueOf( confirm ) );
199         entry.setUnique( strUnique != null );
200         return null;
201     }
202 
203     /**
204      * {@inheritDoc}
205      */
206     @Override
207     public ReferenceList getReferenceListRegularExpression( Entry entry, Plugin plugin )
208     {
209         ReferenceList refListRegularExpression = null;
210 
211         if ( RegularExpressionService.getInstance( ).isAvailable( ) )
212         {
213             refListRegularExpression = new ReferenceList( );
214 
215             List<RegularExpression> listRegularExpression = RegularExpressionService.getInstance( ).getAllRegularExpression( );
216 
217             for ( RegularExpression regularExpression : listRegularExpression )
218             {
219                 if ( !entry.getFieldByCode( FIELD_TEXT_CONF ).getRegularExpressionList( ).contains( regularExpression ) )
220                 {
221                     refListRegularExpression.addItem( regularExpression.getIdExpression( ), regularExpression.getTitle( ) );
222                 }
223             }
224         }
225 
226         return refListRegularExpression;
227     }
228 
229     /**
230      * {@inheritDoc}
231      */
232     @Override
233     public GenericAttributeError getResponseData( Entry entry, HttpServletRequest request, List<Response> listResponse, Locale locale )
234     {
235         String strValueEntry = request.getParameter( PREFIX_ATTRIBUTE + entry.getIdEntry( ) ).trim( );
236         Field confirmField = entry.getFieldByCode( FIELD_CONFIRM );
237 
238         boolean bConfirmField = confirmField != null && Boolean.valueOf( confirmField.getValue( ) );
239 
240         String strValueEntryConfirmField = null;
241 
242         if ( bConfirmField )
243         {
244             strValueEntryConfirmField = request.getParameter( PREFIX_ATTRIBUTE + entry.getIdEntry( ) + SUFFIX_CONFIRM_FIELD ).trim( );
245         }
246 
247         List<RegularExpression> listRegularExpression = entry.getFieldByCode( FIELD_TEXT_CONF ).getRegularExpressionList( );
248         Response/genericattributes/business/Response.html#Response">Response response = new Response( );
249         response.setEntry( entry );
250 
251         if ( strValueEntry == null )
252         {
253             return null;
254         }
255 
256         response.setResponseValue( strValueEntry );
257 
258         if ( StringUtils.isNotBlank( response.getResponseValue( ) ) )
259         {
260             response.setToStringValueResponse( getResponseValueForRecap( entry, request, response, locale ) );
261         }
262         else
263         {
264             response.setToStringValueResponse( StringUtils.EMPTY );
265         }
266 
267         response.setIterationNumber( getResponseIterationValue( request ) );
268 
269         listResponse.add( response );
270 
271         return checkErrors( entry, confirmField, strValueEntry, strValueEntryConfirmField, listRegularExpression, bConfirmField, locale );
272     }
273 
274     private GenericAttributeError checkErrors( Entry entry, Field confirmField, String strValueEntry, String strValueEntryConfirmField,
275             List<RegularExpression> listRegularExpression, boolean bConfirmField, Locale locale )
276     {
277         // Checks if the entry value contains XSS characters
278         if ( StringUtil.containsXssCharacters( strValueEntry ) )
279         {
280             GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
281             error.setMandatoryError( false );
282             error.setTitleQuestion( entry.getTitle( ) );
283             error.setErrorMessage( I18nService.getLocalizedString( MESSAGE_XSS_FIELD, locale ) );
284 
285             return error;
286         }
287 
288         if ( entry.isMandatory( ) && StringUtils.isBlank( strValueEntry ) )
289         {
290             if ( StringUtils.isNotEmpty( entry.getErrorMessage( ) ) )
291             {
292                 GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
293                 error.setMandatoryError( true );
294                 error.setErrorMessage( entry.getErrorMessage( ) );
295 
296                 return error;
297             }
298 
299             return new MandatoryError( entry, locale );
300         }
301 
302         if ( ( !strValueEntry.equals( StringUtils.EMPTY ) ) && CollectionUtils.isNotEmpty( listRegularExpression )
303                 && RegularExpressionService.getInstance( ).isAvailable( ) )
304         {
305             for ( RegularExpression regularExpression : listRegularExpression )
306             {
307                 if ( !RegularExpressionService.getInstance( ).isMatches( strValueEntry, regularExpression ) )
308                 {
309                     GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
310                     error.setMandatoryError( false );
311                     error.setTitleQuestion( entry.getTitle( ) );
312                     error.setErrorMessage( regularExpression.getErrorMessage( ) );
313 
314                     return error;
315                 }
316             }
317         }
318 
319         if ( bConfirmField && ( ( strValueEntryConfirmField == null ) || !strValueEntry.equals( strValueEntryConfirmField ) ) )
320         {
321             GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
322             error.setMandatoryError( false );
323             error.setTitleQuestion( confirmField.getTitle( ) );
324             error.setErrorMessage( I18nService.getLocalizedString( MESSAGE_CONFIRM_FIELD, new String [ ] {
325                     entry.getTitle( )
326             }, locale ) );
327 
328             return error;
329         }
330         return null;
331     }
332 
333     /**
334      * {@inheritDoc}
335      */
336     @Override
337     public String getResponseValueForExport( Entry entry, HttpServletRequest request, Response response, Locale locale )
338     {
339         return response.getResponseValue( );
340     }
341 
342     /**
343      * {@inheritDoc}
344      */
345     @Override
346     public String getResponseValueForRecap( Entry entry, HttpServletRequest request, Response response, Locale locale )
347     {
348         return response.getResponseValue( );
349     }
350 }