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.suggest.web;
35  
36  import fr.paris.lutece.plugins.suggest.business.ExportFormat;
37  import fr.paris.lutece.plugins.suggest.business.ExportFormatHome;
38  import fr.paris.lutece.plugins.suggest.service.ExportFormatResourceIdService;
39  import fr.paris.lutece.plugins.suggest.utils.SuggestUtils;
40  import fr.paris.lutece.portal.business.rbac.RBAC;
41  import fr.paris.lutece.portal.service.fileupload.FileUploadService;
42  import fr.paris.lutece.portal.service.i18n.I18nService;
43  import fr.paris.lutece.portal.service.message.AdminMessage;
44  import fr.paris.lutece.portal.service.message.AdminMessageService;
45  import fr.paris.lutece.portal.service.plugin.Plugin;
46  import fr.paris.lutece.portal.service.rbac.RBACService;
47  import fr.paris.lutece.portal.service.template.AppTemplateService;
48  import fr.paris.lutece.portal.service.util.AppLogService;
49  import fr.paris.lutece.portal.service.util.AppPathService;
50  import fr.paris.lutece.portal.service.util.AppPropertiesService;
51  import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
52  import fr.paris.lutece.portal.web.constants.Parameters;
53  import fr.paris.lutece.portal.web.upload.MultipartHttpServletRequest;
54  import fr.paris.lutece.util.html.HtmlTemplate;
55  import fr.paris.lutece.util.html.Paginator;
56  import fr.paris.lutece.util.url.UrlItem;
57  
58  import org.apache.commons.fileupload.FileItem;
59  
60  import org.xml.sax.InputSource;
61  import org.xml.sax.XMLReader;
62  
63  import java.io.ByteArrayInputStream;
64  import java.io.IOException;
65  import java.io.OutputStream;
66  
67  import java.util.HashMap;
68  import java.util.List;
69  import java.util.Locale;
70  import java.util.Map;
71  
72  import javax.servlet.http.HttpServletRequest;
73  import javax.servlet.http.HttpServletResponse;
74  
75  import javax.xml.parsers.SAXParser;
76  import javax.xml.parsers.SAXParserFactory;
77  import javax.xml.stream.XMLInputFactory;
78  
79  
80  
81  
82  
83  
84  public class ExportFormatJspBean extends PluginAdminPageJspBean
85  {
86      private static final long serialVersionUID = 2892557628133467782L;
87  
88      
89      private static final String TEMPLATE_MANAGE_EXPORT = "admin/plugins/suggest/manage_export_format.html";
90      private static final String TEMPLATE_CREATE_EXPORT = "admin/plugins/suggest/create_export_format.html";
91      private static final String TEMPLATE_MODIFY_EXPORT = "admin/plugins/suggest/modify_export_format.html";
92  
93      
94      private static final String MARK_EXPORT_LIST = "export_list";
95      private static final String MARK_EXPORT = "export";
96      private static final String MARK_PAGINATOR = "paginator";
97      private static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
98  
99      
100     private static final String PARAMETER_ID_EXPORT = "id_export";
101     private static final String PARAMETER_TITLE = "title";
102     private static final String PARAMETER_DESCRIPTION = "description";
103     private static final String PARAMETER_EXTENSION = "extension";
104     private static final String PARAMETER_PAGE_INDEX = "page_index";
105 
106     
107     private static final String EMPTY_STRING = "";
108     private static final String CONSTANT_MIME_TYPE_OCTETSTREAM = "application/octet-stream";
109 
110     
111     private static final String MESSAGE_CONFIRM_REMOVE_EXPORT = "suggest.message.confirmRemoveExportFormat";
112     private static final String MESSAGE_MANDATORY_FIELD = "suggest.message.mandatory.field";
113     private static final String MESSAGE_ERROR_DURING_DOWNLOAD_FILE = "suggest.message.errorDuringDownloadFile";
114     private static final String MESSAGE_YOU_ARE_NOT_ALLOWED_TO_DOWLOAD_THIS_FILE = "suggest.message.youAreNotAllowedToDownloadFile";
115     private static final String FIELD_TITLE = "suggest.createExportFormat.labelTitle";
116     private static final String FIELD_DESCRIPTION = "suggest.createExportFormat.labelDescription";
117     private static final String FIELD_EXTENSION = "suggest.createExportFormat.labelExtension";
118     private static final String FIELD_XSL = "suggest.createExportFormat.labelXsl";
119     private static final String MESSAGE_STYLESHEET_NOT_VALID = "suggest.message.stylesheetNotValid";
120 
121     
122     private static final String PROPERTY_ITEM_PER_PAGE = "suggest.itemsPerPage";
123     private static final String PROPERTY_MANAGE_EXPORT_FORMAT_TITLE = "suggest.manageExportFormat.pageTitle";
124     private static final String PROPERTY_MODIFY_EXPORT_FORMAT_TITLE = "suggest.modifyExportFormat.title";
125     private static final String PROPERTY_CREATE_EXPORT_FORMAT_TITLE = "suggest.createExportFormat.title";
126 
127     
128     private static final String JSP_MANAGE_EXPORT_FORMAT = "jsp/admin/plugins/suggest/ManageExportFormat.jsp";
129     private static final String JSP_DO_REMOVE_EXPORT_FORMAT = "jsp/admin/plugins/suggest/DoRemoveExportFormat.jsp";
130 
131     
132     private int _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( PROPERTY_ITEM_PER_PAGE, 15 );
133     private String _strCurrentPageIndexExport;
134     private int _nItemsPerPageExportFormat;
135 
136     
137 
138 
139 
140 
141 
142 
143     public String getManageExportFormat( HttpServletRequest request )
144     {
145         Plugin plugin = getPlugin( );
146         Locale locale = getLocale( );
147         Map<String, Object> model = new HashMap<>( );
148         List<ExportFormat> listExportFormat = ExportFormatHome.getList( plugin );
149         listExportFormat = (List<ExportFormat>) RBACService.getAuthorizedCollection( listExportFormat, ExportFormatResourceIdService.PERMISSION_MANAGE,
150                 getUser( ) );
151         _strCurrentPageIndexExport = Paginator.getPageIndex( request, Paginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndexExport );
152         _nItemsPerPageExportFormat = Paginator.getItemsPerPage( request, Paginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPageExportFormat, _nDefaultItemsPerPage );
153 
154         Paginator<ExportFormat> paginator = new Paginator<>( listExportFormat, _nItemsPerPageExportFormat, getJspManageExportFormat( request ),
155                 PARAMETER_PAGE_INDEX, _strCurrentPageIndexExport );
156 
157         model.put( MARK_PAGINATOR, paginator );
158         model.put( MARK_NB_ITEMS_PER_PAGE, EMPTY_STRING + _nItemsPerPageExportFormat );
159         model.put( MARK_EXPORT_LIST, paginator.getPageItems( ) );
160         setPageTitleProperty( PROPERTY_MANAGE_EXPORT_FORMAT_TITLE );
161 
162         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MANAGE_EXPORT, locale, model );
163 
164         return getAdminPage( templateList.getHtml( ) );
165     }
166 
167     
168 
169 
170 
171 
172 
173 
174     public String getCreateExportFormat( HttpServletRequest request )
175     {
176         if ( !RBACService.isAuthorized( ExportFormat.RESOURCE_TYPE, RBAC.WILDCARD_RESOURCES_ID, ExportFormatResourceIdService.PERMISSION_MANAGE, getUser( ) ) )
177         {
178             return getManageExportFormat( request );
179         }
180 
181         Locale locale = getLocale( );
182         Map<String, Object> model = new HashMap<>( );
183         setPageTitleProperty( PROPERTY_CREATE_EXPORT_FORMAT_TITLE );
184 
185         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_CREATE_EXPORT, locale, model );
186 
187         return getAdminPage( template.getHtml( ) );
188     }
189 
190     
191 
192 
193 
194 
195 
196 
197     public String doCreateExportFormat( HttpServletRequest request )
198     {
199         if ( !RBACService.isAuthorized( ExportFormat.RESOURCE_TYPE, RBAC.WILDCARD_RESOURCES_ID, ExportFormatResourceIdService.PERMISSION_MANAGE, getUser( ) ) )
200         {
201             return getJspManageExportFormat( request );
202         }
203 
204         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
205         ExportFormatsiness/ExportFormat.html#ExportFormat">ExportFormat exportFormat = new ExportFormat( );
206         String strError = getExportFormatData( multipartRequest, exportFormat );
207 
208         if ( strError != null )
209         {
210             return strError;
211         }
212 
213         ExportFormatHome.create( exportFormat, getPlugin( ) );
214 
215         return getJspManageExportFormat( request );
216     }
217 
218     
219 
220 
221 
222 
223 
224 
225     public String getModifyExportFormat( HttpServletRequest request )
226     {
227         Plugin plugin = getPlugin( );
228         Locale locale = getLocale( );
229         ExportFormat exportFormat;
230         String strIdExport = request.getParameter( PARAMETER_ID_EXPORT );
231         Map<String, Object> model = new HashMap<>( );
232         int nIdExport = -1;
233 
234         if ( ( strIdExport != null ) && !strIdExport.equals( EMPTY_STRING )
235                 && RBACService.isAuthorized( ExportFormat.RESOURCE_TYPE, strIdExport, ExportFormatResourceIdService.PERMISSION_MANAGE, getUser( ) ) )
236         {
237             try
238             {
239                 nIdExport = Integer.parseInt( strIdExport );
240             }
241             catch( NumberFormatException ne )
242             {
243                 AppLogService.error( ne.getMessage( ), ne );
244 
245                 return getManageExportFormat( request );
246             }
247         }
248         else
249         {
250             return getManageExportFormat( request );
251         }
252 
253         exportFormat = ExportFormatHome.findByPrimaryKey( nIdExport, plugin );
254         model.put( MARK_EXPORT, exportFormat );
255         setPageTitleProperty( PROPERTY_MODIFY_EXPORT_FORMAT_TITLE );
256 
257         HtmlTemplate template = AppTemplateService.getTemplate( TEMPLATE_MODIFY_EXPORT, locale, model );
258 
259         return getAdminPage( template.getHtml( ) );
260     }
261 
262     
263 
264 
265 
266 
267 
268 
269     public String doModifyExportFormat( HttpServletRequest request )
270     {
271         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
272         Plugin plugin = getPlugin( );
273         ExportFormat exportFormat;
274         String strIdExport = multipartRequest.getParameter( PARAMETER_ID_EXPORT );
275         int nIdExport = -1;
276 
277         if ( ( strIdExport != null ) && !strIdExport.equals( EMPTY_STRING )
278                 && RBACService.isAuthorized( ExportFormat.RESOURCE_TYPE, strIdExport, ExportFormatResourceIdService.PERMISSION_MANAGE, getUser( ) ) )
279         {
280             try
281             {
282                 nIdExport = Integer.parseInt( strIdExport );
283             }
284             catch( NumberFormatException ne )
285             {
286                 AppLogService.error( ne.getMessage( ), ne );
287 
288                 return getHomeUrl( request );
289             }
290         }
291         else
292         {
293             return getHomeUrl( request );
294         }
295 
296         exportFormat = ExportFormatHome.findByPrimaryKey( nIdExport, plugin );
297 
298         String strError = getExportFormatData( multipartRequest, exportFormat );
299 
300         if ( strError != null )
301         {
302             return strError;
303         }
304 
305         ExportFormatHome.update( exportFormat, getPlugin( ) );
306 
307         return getJspManageExportFormat( request );
308     }
309 
310     
311 
312 
313 
314 
315 
316 
317     public String getConfirmRemoveExportFormat( HttpServletRequest request )
318     {
319         if ( request.getParameter( PARAMETER_ID_EXPORT ) == null )
320         {
321             return getHomeUrl( request );
322         }
323 
324         String strIdExport = request.getParameter( PARAMETER_ID_EXPORT );
325         UrlItem url = new UrlItem( JSP_DO_REMOVE_EXPORT_FORMAT );
326         url.addParameter( PARAMETER_ID_EXPORT, strIdExport );
327 
328         return AdminMessageService.getMessageUrl( request, MESSAGE_CONFIRM_REMOVE_EXPORT, url.getUrl( ), AdminMessage.TYPE_CONFIRMATION );
329     }
330 
331     
332 
333 
334 
335 
336 
337 
338     public String doRemoveExportFormat( HttpServletRequest request )
339     {
340         String strIdExport = request.getParameter( PARAMETER_ID_EXPORT );
341         int nIdExport = -1;
342 
343         if ( ( request.getParameter( PARAMETER_ID_EXPORT ) == null )
344                 || !RBACService.isAuthorized( ExportFormat.RESOURCE_TYPE, strIdExport, ExportFormatResourceIdService.PERMISSION_MANAGE, getUser( ) ) )
345         {
346             return getJspManageExportFormat( request );
347         }
348 
349         try
350         {
351             nIdExport = Integer.parseInt( strIdExport );
352         }
353         catch( NumberFormatException ne )
354         {
355             AppLogService.error( ne.getMessage( ), ne );
356 
357             return getHomeUrl( request );
358         }
359 
360         if ( nIdExport != -1 )
361         {
362             ExportFormatHome.remove( nIdExport, getPlugin( ) );
363         }
364 
365         return getJspManageExportFormat( request );
366     }
367 
368     
369 
370 
371 
372 
373 
374 
375 
376 
377 
378     private String getExportFormatData( MultipartHttpServletRequest multipartRequest, ExportFormat exportFormat )
379     {
380         String strTitle = multipartRequest.getParameter( PARAMETER_TITLE );
381         String strDescription = multipartRequest.getParameter( PARAMETER_DESCRIPTION );
382         String strExtension = multipartRequest.getParameter( PARAMETER_EXTENSION );
383 
384         String strFieldError = EMPTY_STRING;
385         FileItem fileSource = multipartRequest.getFile( Parameters.STYLESHEET_SOURCE );
386         String strFilename = FileUploadService.getFileNameOnly( fileSource );
387 
388         if ( ( strTitle == null ) || strTitle.trim( ).equals( EMPTY_STRING ) )
389         {
390             strFieldError = FIELD_TITLE;
391         }
392 
393         else
394             if ( ( strDescription == null ) || strDescription.trim( ).equals( EMPTY_STRING ) )
395             {
396                 strFieldError = FIELD_DESCRIPTION;
397             }
398             else
399                 if ( ( strExtension == null ) || strExtension.trim( ).equals( EMPTY_STRING ) )
400                 {
401                     strFieldError = FIELD_EXTENSION;
402                 }
403 
404                 else
405                     if ( ( strFilename == null ) || ( strFilename.equals( "" ) && ( exportFormat.getXsl( ) == null ) ) )
406                     {
407                         strFieldError = FIELD_XSL;
408                     }
409 
410         
411         if ( !strFieldError.equals( EMPTY_STRING ) )
412         {
413             Object [ ] tabRequiredFields = {
414                 I18nService.getLocalizedString( strFieldError, getLocale( ) )
415             };
416 
417             return AdminMessageService.getMessageUrl( multipartRequest, MESSAGE_MANDATORY_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
418         }
419 
420         byte [ ] baXslSource = fileSource.get( );
421 
422         
423         if ( ( strFilename != null ) && !strFilename.equals( "" ) && ( isValid( baXslSource ) != null ) )
424         {
425             Object [ ] args = {
426                 isValid( baXslSource )
427             };
428 
429             return AdminMessageService.getMessageUrl( multipartRequest, MESSAGE_STYLESHEET_NOT_VALID, args, AdminMessage.TYPE_STOP );
430         }
431 
432         exportFormat.setTitle( strTitle );
433         exportFormat.setDescription( strDescription );
434         exportFormat.setExtension( strExtension );
435 
436         if ( ( strFilename != null ) && !strFilename.equals( "" ) )
437         {
438             exportFormat.setXsl( baXslSource );
439         }
440 
441         return null;
442     }
443 
444     
445 
446 
447 
448 
449 
450 
451 
452 
453     public String doDownloadXslFile( HttpServletRequest request, HttpServletResponse response )
454     {
455         Plugin plugin = getPlugin( );
456         ExportFormat exportFormat;
457         String strIdExport = request.getParameter( PARAMETER_ID_EXPORT );
458         int nIdExport = -1;
459 
460         if ( ( strIdExport != null ) && !strIdExport.equals( EMPTY_STRING )
461                 && RBACService.isAuthorized( ExportFormat.RESOURCE_TYPE, strIdExport, ExportFormatResourceIdService.PERMISSION_MANAGE, getUser( ) ) )
462         {
463             try
464             {
465                 nIdExport = Integer.parseInt( strIdExport );
466             }
467             catch( NumberFormatException ne )
468             {
469                 AppLogService.error( ne.getMessage( ), ne );
470 
471                 return AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_DURING_DOWNLOAD_FILE, AdminMessage.TYPE_STOP );
472             }
473         }
474         else
475         {
476             return AdminMessageService.getMessageUrl( request, MESSAGE_YOU_ARE_NOT_ALLOWED_TO_DOWLOAD_THIS_FILE, AdminMessage.TYPE_STOP );
477         }
478 
479         exportFormat = ExportFormatHome.findByPrimaryKey( nIdExport, plugin );
480 
481         if ( exportFormat != null )
482         {
483             try
484             {
485                 byte [ ] byteFileOutPut = exportFormat.getXsl( );
486                 SuggestUtils.addHeaderResponse( request, response, exportFormat.getTitle( ) + ".xsl" );
487                 response.setContentType( CONSTANT_MIME_TYPE_OCTETSTREAM );
488                 response.setContentLength( byteFileOutPut.length );
489 
490                 OutputStream os = response.getOutputStream( );
491                 os.write( byteFileOutPut );
492                 os.close( );
493             }
494             catch( IOException e )
495             {
496                 AppLogService.error( e.getMessage( ), e );
497 
498                 return AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_DURING_DOWNLOAD_FILE, AdminMessage.TYPE_STOP );
499             }
500         }
501 
502         return getJspManageExportFormat( request );
503     }
504 
505     
506 
507 
508 
509 
510 
511 
512     private String isValid( byte [ ] baXslSource )
513     {
514         String strError = null;
515 
516         try
517         {
518             SAXParserFactory factory = SAXParserFactory.newInstance( );
519             ( ( XMLReader) factory ).setProperty( XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE );
520             SAXParser analyzer = factory.newSAXParser( );
521             InputSource is = new InputSource( new ByteArrayInputStream( baXslSource ) );
522             analyzer.getXMLReader( ).parse( is );
523         }
524         catch( Exception e )
525         {
526             strError = e.getMessage( );
527         }
528 
529         return strError;
530     }
531 
532     
533 
534 
535 
536 
537 
538 
539     private String getJspManageExportFormat( HttpServletRequest request )
540     {
541         return AppPathService.getBaseUrl( request ) + JSP_MANAGE_EXPORT_FORMAT;
542     }
543 }