1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.plugins.genericattributes.service.entrytype;
35
36 import java.awt.image.BufferedImage;
37 import java.io.ByteArrayInputStream;
38 import java.io.ByteArrayOutputStream;
39 import java.io.IOException;
40 import java.text.SimpleDateFormat;
41 import java.util.Calendar;
42 import java.util.List;
43 import java.util.Locale;
44 import java.util.Optional;
45
46 import javax.imageio.ImageIO;
47 import javax.servlet.http.HttpServletRequest;
48
49 import org.apache.commons.lang3.StringUtils;
50
51 import fr.paris.lutece.plugins.genericattributes.business.Entry;
52 import fr.paris.lutece.plugins.genericattributes.business.Field;
53 import fr.paris.lutece.plugins.genericattributes.business.GenericAttributeError;
54 import fr.paris.lutece.plugins.genericattributes.business.MandatoryError;
55 import fr.paris.lutece.plugins.genericattributes.business.Response;
56 import fr.paris.lutece.plugins.genericattributes.util.FileAttributesUtils;
57 import fr.paris.lutece.plugins.genericattributes.util.GenericAttributesUtils;
58 import fr.paris.lutece.portal.business.file.File;
59 import fr.paris.lutece.portal.business.physicalfile.PhysicalFile;
60 import fr.paris.lutece.portal.service.i18n.I18nService;
61 import fr.paris.lutece.portal.service.message.AdminMessage;
62 import fr.paris.lutece.portal.service.message.AdminMessageService;
63 import fr.paris.lutece.portal.service.util.AppLogService;
64 import fr.paris.lutece.portal.service.util.AppPropertiesService;
65 import fr.paris.lutece.portal.web.upload.MultipartHttpServletRequest;
66 import fr.paris.lutece.util.filesystem.FileSystemUtil;
67
68
69
70
71
72
73 public abstract class AbstractEntryTypeCamera extends AbstractEntryTypeImage
74 {
75 private static final String PROPERTY_IMAGE_TITLE = AppPropertiesService.getProperty( "genericattributes.image.prefix.title", "default" );
76 private static final String PROPERTY_IMAGE_TITLE_DATE_FORMAT = AppPropertiesService.getProperty( "genericattributes.image.date.format.title",
77 "YYYY-MM-DD hh:mm:ss" );
78
79
80
81
82 @Override
83 public String getRequestData( Entry entry, HttpServletRequest request, Locale locale )
84 {
85 initCommonRequestData( entry, request );
86 String strCode = request.getParameter( PARAMETER_ENTRY_CODE );
87 String strTitle = request.getParameter( PARAMETER_TITLE );
88 String strHelpMessage = ( request.getParameter( PARAMETER_HELP_MESSAGE ) != null ) ? request.getParameter( PARAMETER_HELP_MESSAGE ).trim( ) : null;
89 String strComment = request.getParameter( PARAMETER_COMMENT );
90 String strMaxImageSize = request.getParameter( PARAMETER_MAX_IMAGE_SIZE );
91 String strMandatory = request.getParameter( PARAMETER_MANDATORY );
92 String strWidth = request.getParameter( PARAMETER_WIDTH );
93 String strHeight = request.getParameter( PARAMETER_HEIGHT );
94 String strUnique = request.getParameter( PARAMETER_UNIQUE );
95 String strCSSClass = request.getParameter( PARAMETER_CSS_CLASS );
96 String strOnlyDisplayInBack = request.getParameter( PARAMETER_ONLY_DISPLAY_IN_BACK );
97 String strErrorMessage = request.getParameter( PARAMETER_ERROR_MESSAGE );
98
99 String strTypeImage = request.getParameter( PARAMETER_IMAGE_TYPE );
100
101 int nWidth = -1;
102 int nheight = -1;
103 int nMaxImageSize = -1;
104
105 String strFieldError = StringUtils.EMPTY;
106
107 if ( StringUtils.isBlank( strTitle ) )
108 {
109 strFieldError = ERROR_FIELD_TITLE;
110 }
111
112 else
113 if ( StringUtils.isBlank( strWidth ) )
114 {
115 strFieldError = ERROR_FIELD_WIDTH;
116 }
117
118 if ( StringUtils.isNotBlank( strFieldError ) )
119 {
120 Object [ ] tabRequiredFields = {
121 I18nService.getLocalizedString( strFieldError, locale )
122 };
123
124 return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
125 }
126
127 try
128 {
129 nWidth = Integer.parseInt( strWidth );
130 }
131 catch( NumberFormatException ne )
132 {
133 strFieldError = ERROR_FIELD_WIDTH;
134 }
135
136 try
137 {
138 if ( StringUtils.isNotBlank( strHeight ) )
139 {
140 nheight = Integer.parseInt( strHeight );
141 }
142 }
143 catch( NumberFormatException ne )
144 {
145 strFieldError = ERROR_FIELD_HEIGHT;
146 }
147
148 try
149 {
150 if ( StringUtils.isNotBlank( strMaxImageSize ) )
151 {
152 nMaxImageSize = Integer.parseInt( strMaxImageSize );
153 }
154 }
155 catch( NumberFormatException ne )
156 {
157 strFieldError = ERROR_FIELD_HEIGHT;
158 }
159
160 if ( StringUtils.isNotBlank( strFieldError ) )
161 {
162 Object [ ] tabRequiredFields = {
163 I18nService.getLocalizedString( strFieldError, locale )
164 };
165
166 return AdminMessageService.getMessageUrl( request, MESSAGE_NUMERIC_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
167 }
168
169 entry.setTitle( strTitle );
170 entry.setHelpMessage( strHelpMessage );
171 entry.setComment( strComment );
172 entry.setCSSClass( strCSSClass );
173 entry.setErrorMessage( strErrorMessage );
174 entry.setCode( strCode );
175
176 GenericAttributesUtils.createOrUpdateField( entry, FIELD_IMAGE_TYPE, null, strTypeImage );
177 GenericAttributesUtils.createOrUpdateField( entry, FIELD_WIDTH, null, String.valueOf( nWidth ) );
178 GenericAttributesUtils.createOrUpdateField( entry, FIELD_HEIGHT, null, String.valueOf( nheight ) );
179 GenericAttributesUtils.createOrUpdateField( entry, FIELD_MAX_SIZE, null, String.valueOf( nMaxImageSize ) );
180
181 entry.setMandatory( strMandatory != null );
182 entry.setOnlyDisplayInBack( strOnlyDisplayInBack != null );
183 entry.setUnique( strUnique != null );
184 return null;
185 }
186
187
188
189
190 @Override
191 public GenericAttributeError getResponseData( Entry entry, HttpServletRequest request, List<Response> listResponse, Locale locale )
192 {
193 if ( !( request instanceof MultipartHttpServletRequest ) )
194 {
195 return entry.isMandatory( ) ? new MandatoryError( entry, locale ) : null;
196 }
197
198 GenericAttributeError genAttError = null;
199 String sourceBase = request.getParameter( ( IEntryTypeService.PREFIX_ATTRIBUTE + entry.getIdEntry( ) ) );
200
201 if ( sourceBase != null )
202 {
203 genAttError = doCheckforImages( sourceBase, entry, request.getLocale( ) );
204
205 if ( genAttError != null )
206 {
207 return genAttError;
208 }
209
210 listResponse.add( getResponseFromImage( request, sourceBase, entry, true ) );
211
212 if ( !entry.isMandatory( ) )
213 {
214 return genAttError;
215 }
216
217 if ( entry.isMandatory( ) && ( StringUtils.isBlank( sourceBase ) || StringUtils.isEmpty( sourceBase ) ) )
218 {
219 if ( StringUtils.isNotEmpty( entry.getErrorMessage( ) ) )
220 {
221 GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
222 error.setMandatoryError( true );
223 error.setErrorMessage( entry.getErrorMessage( ) );
224
225 return error;
226 }
227
228 return new MandatoryError( entry, locale );
229 }
230 }
231
232 return genAttError;
233 }
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248 protected Response getResponseFromImage( HttpServletRequest request, String imageSource, Entry entry, boolean bCreatePhysicalFile )
249 {
250 Response/genericattributes/business/Response.html#Response">Response response = new Response( );
251 response.setEntry( entry );
252 String fileName = null;
253 SimpleDateFormat dt = new SimpleDateFormat( PROPERTY_IMAGE_TITLE_DATE_FORMAT );
254
255 Field imageTypeField = entry.getFieldByCode( FIELD_IMAGE_TYPE );
256 String imageType = Optional.ofNullable( imageTypeField ).map( i -> "." + i.getValue( ) ).orElse( "" );
257
258 Calendar c = Calendar.getInstance( );
259 String [ ] imageTitle = PROPERTY_IMAGE_TITLE.trim( ).split( "," );
260 if ( imageTitle != null )
261 {
262 fileName = "";
263 for ( String imgTitle : imageTitle )
264 {
265 if ( request.getParameter( imgTitle ) != null && StringUtils.isNotBlank( request.getParameter( imgTitle ) ) )
266 {
267
268 fileName = fileName.concat( request.getParameter( imgTitle ) ).concat( "-" );
269 }
270 }
271 }
272
273 if ( StringUtils.isNotBlank( imageSource ) && StringUtils.isNotEmpty( imageSource ) )
274 {
275 File file = new File( );
276
277 if ( fileName != null )
278 {
279 file.setTitle( fileName + dt.format( c.getTime( ) ) + imageType );
280 }
281 else
282 {
283 file.setTitle( entry.getTitle( ) + dt.format( c.getTime( ) ) + imageType );
284 }
285 file.setExtension( imageType );
286 if ( bCreatePhysicalFile )
287 {
288 file.setMimeType( FileSystemUtil.getMIMEType( file.getTitle( ) ) );
289
290 PhysicalFile physicalFile = new PhysicalFile( );
291 String base64Image = imageSource.split( "," ) [1];
292 byte [ ] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary( base64Image );
293 physicalFile.setValue( imageBytes );
294 file.setPhysicalFile( physicalFile );
295 file.setSize( imageBytes.length );
296 }
297
298 response.setFile( file );
299 response.setIsImage( true );
300 response.setToStringValueResponse( imageSource );
301 }
302 else
303 {
304 response.setToStringValueResponse( StringUtils.EMPTY );
305 }
306
307 response.setIterationNumber( getResponseIterationValue( request ) );
308
309 return response;
310 }
311
312 @Override
313 public String getResponseValueForRecap( Entry entry, HttpServletRequest request, Response response, Locale locale )
314 {
315 if ( ( response.getFile( ) != null ) && StringUtils.isNotBlank( response.getToStringValueResponse( ) ) )
316 {
317 return response.getToStringValueResponse( );
318 }
319
320 return StringUtils.EMPTY;
321 }
322
323
324
325
326
327
328
329
330
331
332
333
334 public GenericAttributeError doCheckforImages( String imageSource, Entry entry, Locale locale )
335 {
336 BufferedImage image = null;
337 GenericAttributeErrores/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError genAttError = new GenericAttributeError( );
338 genAttError.setMandatoryError( false );
339
340 Object [ ] args = {
341 entry.getTitle( )
342 };
343 genAttError.setErrorMessage( I18nService.getLocalizedString( MESSAGE_ERROR_NOT_AN_IMAGE, args, locale ) );
344 genAttError.setTitleQuestion( entry.getTitle( ) );
345
346 if ( ( imageSource != null ) && ( imageSource.split( "," ).length > 1 ) )
347 {
348 String base64Image = imageSource.split( "," ) [1];
349 byte [ ] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary( base64Image );
350 ByteArrayInputStream bis = new ByteArrayInputStream( imageBytes );
351
352 try
353 {
354 image = ImageIO.read( bis );
355 bis.close( );
356 }
357 catch( IOException e )
358 {
359 return genAttError;
360 }
361 }
362
363 if ( ( image == null ) && StringUtils.isNotBlank( imageSource ) )
364 {
365 return genAttError;
366 }
367
368 return doCheckSize( image, entry, locale );
369 }
370
371
372
373
374
375
376
377
378
379
380 public GenericAttributeError doCheckSize( BufferedImage image, Entry entry, Locale locale )
381 {
382 int nMaxSize = Integer.parseInt( entry.getFieldByCode( FIELD_MAX_SIZE ).getValue( ) );
383
384 Field imageTypeField = entry.getFieldByCode( FIELD_IMAGE_TYPE );
385 String imageType = imageTypeField != null ? imageTypeField.getValue( ) : "png";
386
387
388
389 if ( nMaxSize == GenericAttributesUtils.CONSTANT_ID_NULL )
390 {
391 nMaxSize = AppPropertiesService.getPropertyInt( FileAttributesUtils.PROPERTY_UPLOAD_FILE_DEFAULT_MAX_SIZE, 5242880 );
392 }
393
394
395 if ( ( nMaxSize != GenericAttributesUtils.CONSTANT_ID_NULL ) && ( image != null ) )
396 {
397 boolean bHasFileMaxSizeError = false;
398 ByteArrayOutputStream tmp = new ByteArrayOutputStream( );
399
400 try
401 {
402 ImageIO.write( image, imageType, tmp );
403 tmp.close( );
404 }
405 catch( IOException e )
406 {
407 AppLogService.error( e );
408
409 String strMessage = "IOException when reading Image Size";
410 GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
411 error.setMandatoryError( false );
412 error.setTitleQuestion( entry.getTitle( ) );
413 error.setErrorMessage( strMessage );
414
415 return error;
416 }
417
418 Integer contentLength = tmp.size( );
419
420 if ( contentLength > nMaxSize )
421 {
422 bHasFileMaxSizeError = true;
423 }
424
425 if ( bHasFileMaxSizeError )
426 {
427 Object [ ] params = {
428 nMaxSize
429 };
430 String strMessage = I18nService.getLocalizedString( FileAttributesUtils.PROPERTY_MESSAGE_ERROR_UPLOADING_FILE_FILE_MAX_SIZE, params, locale );
431 GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
432 error.setMandatoryError( false );
433 error.setTitleQuestion( entry.getTitle( ) );
434 error.setErrorMessage( strMessage );
435
436 return error;
437 }
438 }
439
440 return null;
441 }
442 }