View Javadoc
1   /*
2    * Copyright (c) 2002-2014, Mairie de 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.dila.web;
35  
36  import java.util.ArrayList;
37  import java.util.HashMap;
38  import java.util.List;
39  import java.util.Map;
40  
41  import javax.servlet.http.HttpServletRequest;
42  
43  import org.apache.commons.collections.CollectionUtils;
44  import org.apache.commons.lang.StringUtils;
45  
46  import fr.paris.lutece.plugins.dila.business.enums.ActionTypeEnum;
47  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.AudienceDTO;
48  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalCardChapterDTO;
49  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalCardDTO;
50  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalDTO;
51  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalFolderDTO;
52  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalFolderLinkDTO;
53  import fr.paris.lutece.plugins.dila.service.IDilaAudienceService;
54  import fr.paris.lutece.plugins.dila.service.IDilaLocalCardChapterService;
55  import fr.paris.lutece.plugins.dila.service.IDilaLocalCardService;
56  import fr.paris.lutece.plugins.dila.service.IDilaLocalFolderLinkService;
57  import fr.paris.lutece.plugins.dila.service.IDilaLocalFolderService;
58  import fr.paris.lutece.plugins.dila.service.IDilaLocalService;
59  import fr.paris.lutece.plugins.dila.service.IDilaValidationService;
60  import fr.paris.lutece.plugins.dila.utils.ListUtils;
61  import fr.paris.lutece.plugins.dila.utils.XMLConvertor;
62  import fr.paris.lutece.plugins.dila.utils.constants.DilaConstants;
63  import fr.paris.lutece.portal.service.message.AdminMessage;
64  import fr.paris.lutece.portal.service.message.AdminMessageService;
65  import fr.paris.lutece.portal.service.spring.SpringContextService;
66  import fr.paris.lutece.portal.service.template.AppTemplateService;
67  import fr.paris.lutece.portal.service.util.AppPathService;
68  import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
69  import fr.paris.lutece.portal.web.pluginaction.DefaultPluginActionResult;
70  import fr.paris.lutece.portal.web.pluginaction.IPluginActionResult;
71  import fr.paris.lutece.util.ReferenceList;
72  import fr.paris.lutece.util.datatable.DataTableManager;
73  import fr.paris.lutece.util.html.HtmlTemplate;
74  
75  
76  /**
77   * DilaJspBean
78   */
79  public class LocalCardJspBean extends PluginAdminPageJspBean
80  {
81      //Rights
82      public static final String RIGHT_MANAGE_LOCAL_CARD = "DILA_LOCAL_CARD_MANAGEMENT";
83  
84      /** Serial id */
85      private static final long serialVersionUID = -7968314250934413466L;
86  
87      //templates
88      private static final String TEMPLATE_MANAGE_LOCAL = "admin/plugins/dila/manage_fiche-locale.html";
89      private static final String TEMPLATE_CREATE_LOCAL_CARD = "admin/plugins/dila/create_fiche-locale.html";
90      private static final String TEMPLATE_MODIFY_LOCAL_CARD = "admin/plugins/dila/modify_fiche-locale.html";
91      private static final String TEMPLATE_CREATE_LOCAL_FOLDER = "admin/plugins/dila/create_dossier-local.html";
92      private static final String TEMPLATE_MODIFY_LOCAL_FOLDER = "admin/plugins/dila/modify_dossier-local.html";
93  
94      //jsp
95      private static final String JSP_MANAGE_LOCAL_NAME = "ManageLocalCard.jsp";
96  
97      //macro column names
98      private static final String MACRO_COLUMN_ACTIONS_LOCAL_CARD = "columnActionsFicheLocale";
99  
100     // PARAMETERS
101     private static final String PARAMETER_CHAPTER_ID = "chapterId";
102     private static final String PARAMETER_CHAPTERS_LIST = "chapters_list";
103     private static final String PARAMETER_LINK_ID = "linkId";
104     private static final String PARAMETER_LINK_LIST = "links_list";
105     private static final String PARAMETER_REFERENCE_ID = "referenceId";
106     private static final String PARAMETER_TYPE = "type";
107     private static final String PARAMETER_NAME = "nomFicheLocale";
108     private static final String PARAMETER_AUTHOR = "localCardAuthor";
109 
110     // marks
111     private static final String MARK_DATA_TABLE_LOCAL_CARD = "dataTableFicheLocale";
112     private static final String MARK_LOCAL_CARD = "ficheLocale";
113     private static final String MARK_LOCAL_FOLDER = "dossierLocal";
114     private static final String MARK_AUDIENCE = "audiences";
115     private static final String MARK_WEBAPP_URL = "webapp_url";
116     private static final String MARK_LOCALE = "locale";
117 
118     // Beans
119     private LocalCardDTO _cardBean;
120     private LocalFolderDTO _folderBean;
121     private String _strAction;
122     private transient DataTableManager<LocalDTO> _dataTableLocal;
123 
124     // Services
125     private IDilaLocalFolderService _dilaLocalFolderService = SpringContextService.getBean( "dilaLocalFolderService" );
126     private IDilaLocalService _dilaLocalService = SpringContextService.getBean( "dilaLocalService" );
127     private IDilaLocalCardService _dilaLocalCardService = SpringContextService.getBean( "dilaLocalCardService" );
128     private IDilaAudienceService _dilaAudienceService = SpringContextService.getBean( "dilaAudienceService" );
129     private IDilaLocalCardChapterService _dilaLocalCardChapterService = SpringContextService
130             .getBean( "dilaLocalCardChapterService" );
131     private IDilaLocalFolderLinkService _dilaLocalFolderLinkService = SpringContextService
132             .getBean( "dilaLocalFolderLinkService" );
133     private IDilaValidationService _dilaValidationService = SpringContextService.getBean( "dilaValidationService" );
134 
135     /**
136      * Return management local cards and folders
137      * @param request the request
138      * @return the page
139      */
140     public String getManageLocalCard( HttpServletRequest request )
141     {
142         Map<String, Object> model = new HashMap<String, Object>( );
143 
144         String strType = request.getParameter( PARAMETER_TYPE );
145         Long lType = 0L;
146 
147         if ( StringUtils.isNotBlank( strType ) )
148         {
149             lType = Long.valueOf( strType );
150         }
151 
152         String strId = request.getParameter( DilaConstants.MARK_ID );
153         Long lId = 0L;
154 
155         if ( StringUtils.isNotBlank( strId ) && StringUtils.isNumeric( strId ) )
156         {
157             lId = Long.valueOf( strId );
158         }
159 
160         String strName = request.getParameter( PARAMETER_NAME );
161         String strAuthor = request.getParameter( PARAMETER_AUTHOR );
162 
163         //Init fiche locale data table
164         if ( _dataTableLocal == null )
165         {
166             _dataTableLocal = new DataTableManager<LocalDTO>( DilaConstants.JSP_MANAGE_LOCAL, "", 10, true );
167             _dataTableLocal.addColumn( "dila.manage_local.row_id", "id", true );
168             _dataTableLocal.addColumn( "dila.manage_local.row_type", "typeLabel", true );
169             _dataTableLocal.addColumn( "dila.manage_local.row_title", "title", true );
170             _dataTableLocal.addColumn( "dila.manage_local.row_breadcrumb", "displayPath", false );
171             _dataTableLocal.addColumn( "dila.manage_local.row_author", "author", true );
172             _dataTableLocal.addFreeColumn( "dila.manage_local.row_actions", MACRO_COLUMN_ACTIONS_LOCAL_CARD );
173         }
174 
175         List<LocalDTO> listLocalCards = _dilaLocalService.findAll( );
176 
177         _dataTableLocal.filterSortAndPaginate( request, filterLocal( listLocalCards, lType, lId, strName, strAuthor ) );
178         model.put( MARK_DATA_TABLE_LOCAL_CARD, _dataTableLocal );
179         model.put( PARAMETER_TYPE, strType );
180         model.put( DilaConstants.MARK_ID, strId );
181         model.put( PARAMETER_NAME, strName );
182         model.put( PARAMETER_AUTHOR, strAuthor );
183 
184         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MANAGE_LOCAL, getLocale( ), model );
185 
186         return getAdminPage( templateList.getHtml( ) );
187     }
188 
189     /**
190      * Return create local card page
191      * @param request The Http request
192      * @return Html
193      */
194     public String getCreateLocalCard( HttpServletRequest request )
195     {
196         _strAction = ActionTypeEnum.CREATE.getValue( );
197 
198         Map<String, Object> model = new HashMap<String, Object>( );
199 
200         _cardBean = new LocalCardDTO( );
201 
202         List<LocalCardChapterDTO> chapters = new ArrayList<LocalCardChapterDTO>( );
203 
204         LocalCardChapterDTO chapter = new LocalCardChapterDTO( );
205         chapter.setPosition( 1 );
206 
207         chapters.add( chapter );
208 
209         model.put( MARK_LOCAL_CARD, _cardBean );
210         model.put( PARAMETER_CHAPTER_ID, 1 );
211         model.put( PARAMETER_CHAPTERS_LIST, chapters );
212         setDataInModel( request, model );
213 
214         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_CREATE_LOCAL_CARD, getLocale( ), model );
215 
216         return getAdminPage( templateList.getHtml( ) );
217     }
218 
219     /**
220      * Return modify local card page
221      * @param request The Http request
222      * @return Html
223      */
224     public String getModifyLocalCard( HttpServletRequest request )
225     {
226         _strAction = ActionTypeEnum.MODIFY.getValue( );
227 
228         String strLocalItemId = request.getParameter( DilaConstants.MARK_LOCAL_ID );
229 
230         if ( StringUtils.isEmpty( strLocalItemId ) || !StringUtils.isNumeric( strLocalItemId ) )
231         {
232             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
233                     AdminMessage.TYPE_STOP );
234         }
235 
236         _cardBean = _dilaLocalCardService.findCardByLocalId( Long.valueOf( strLocalItemId ) );
237 
238         if ( _cardBean == null )
239         {
240             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
241                     AdminMessage.TYPE_STOP );
242         }
243 
244         // get parent directory infos
245         _dilaValidationService.validateRootFolder( _cardBean, _cardBean.getParentFolderId( ) );
246 
247         Map<String, Object> model = new HashMap<String, Object>( );
248 
249         // find chapters by card id
250         List<LocalCardChapterDTO> chapters = _dilaLocalCardChapterService.findByCardId( _cardBean.getId( ) );
251 
252         model.put( MARK_LOCAL_CARD, _cardBean );
253         model.put( PARAMETER_CHAPTER_ID, chapters.size( ) );
254         model.put( PARAMETER_CHAPTERS_LIST, chapters );
255         setDataInModel( request, model );
256 
257         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MODIFY_LOCAL_CARD, getLocale( ), model );
258 
259         return getAdminPage( templateList.getHtml( ) );
260     }
261 
262     /**
263      * Return create local folder page
264      * @param request The Http request
265      * @return Html
266      */
267     public String getCreateLocalFolder( HttpServletRequest request )
268     {
269         _strAction = ActionTypeEnum.CREATE.getValue( );
270 
271         Map<String, Object> model = new HashMap<String, Object>( );
272 
273         _folderBean = new LocalFolderDTO( );
274 
275         List<LocalFolderLinkDTO> links = new ArrayList<LocalFolderLinkDTO>( );
276 
277         model.put( PARAMETER_LINK_ID, 0 );
278         model.put( PARAMETER_LINK_LIST, links );
279         model.put( MARK_LOCAL_FOLDER, _folderBean );
280         setDataInModel( request, model );
281 
282         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_CREATE_LOCAL_FOLDER, getLocale( ), model );
283 
284         return getAdminPage( templateList.getHtml( ) );
285     }
286 
287     /**
288      * Return modify local folder page
289      * @param request The Http request
290      * @return Html
291      */
292     public String getModifyLocalFolder( HttpServletRequest request )
293     {
294         _strAction = ActionTypeEnum.MODIFY.getValue( );
295 
296         String idLocal = request.getParameter( DilaConstants.MARK_LOCAL_ID );
297 
298         Map<String, Object> model = new HashMap<String, Object>( );
299 
300         // find folder by local id
301         _folderBean = _dilaLocalFolderService.findFolderByLocalId( Long.valueOf( idLocal ) );
302 
303         // get parent informations
304         _dilaValidationService.validateRootTheme( _folderBean );
305 
306         // get sibling directory informations
307         _dilaValidationService.validateLinkedFolder( _folderBean );
308 
309         // find links by folder id
310         List<LocalFolderLinkDTO> links = _dilaLocalFolderLinkService.findByFolderId( _folderBean.getId( ) );
311 
312         if ( CollectionUtils.isNotEmpty( links ) )
313         {
314             for ( LocalFolderLinkDTO link : links )
315             {
316                 _dilaValidationService.validateLinkCard( _folderBean, link.getCardId( ), link );
317             }
318         }
319 
320         model.put( PARAMETER_LINK_ID, links.size( ) );
321         model.put( PARAMETER_LINK_LIST, links );
322         model.put( MARK_LOCAL_FOLDER, _folderBean );
323         setDataInModel( request, model );
324 
325         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MODIFY_LOCAL_FOLDER, getLocale( ), model );
326 
327         return getAdminPage( templateList.getHtml( ) );
328     }
329 
330     /**
331      * Add a chapter
332      * @param request the page request
333      * @return the ManageFicheLocale page
334      */
335     public String doAddChapter( HttpServletRequest request )
336     {
337         Integer nbChapter = Integer.valueOf( request.getParameter( PARAMETER_CHAPTER_ID ) );
338         Map<String, Object> model = new HashMap<String, Object>( );
339 
340         populate( _cardBean, request );
341 
342         List<LocalCardChapterDTO> chapters = generateChapters( model, request );
343 
344         LocalCardChapterDTO chapter = new LocalCardChapterDTO( );
345         chapter.setPosition( nbChapter + 1 );
346         chapters.add( chapter );
347 
348         model.put( MARK_LOCAL_CARD, _cardBean );
349         model.put( PARAMETER_CHAPTER_ID, nbChapter + 1 );
350         model.put( PARAMETER_CHAPTERS_LIST, chapters );
351         setDataInModel( request, model );
352 
353         return getAdminPage( getTemplateCard( model ) );
354     }
355 
356     /**
357      * Delete a chapter
358      * @param request the page request
359      * @return the ManageFicheLocale page
360      */
361     public String doDeleteChapter( HttpServletRequest request )
362     {
363         Integer nbChapter = Integer.valueOf( request.getParameter( PARAMETER_CHAPTER_ID ) );
364         Map<String, Object> model = new HashMap<String, Object>( );
365 
366         populate( _cardBean, request );
367 
368         List<LocalCardChapterDTO> chapters = generateChapters( model, request );
369 
370         if ( nbChapter > 1 )
371         {
372             chapters.remove( chapters.size( ) - 1 );
373             nbChapter = nbChapter - 1;
374         }
375 
376         model.put( MARK_LOCAL_CARD, _cardBean );
377         model.put( PARAMETER_CHAPTER_ID, nbChapter );
378         model.put( PARAMETER_CHAPTERS_LIST, chapters );
379         setDataInModel( request, model );
380 
381         return getAdminPage( getTemplateCard( model ) );
382     }
383 
384     /**
385      * Add a link
386      * @param request the page request
387      * @return the ManageFicheLocale page
388      */
389     public String doAddLink( HttpServletRequest request )
390     {
391         Integer nbLink = Integer.valueOf( request.getParameter( PARAMETER_LINK_ID ) );
392         Map<String, Object> model = new HashMap<String, Object>( );
393 
394         populate( _folderBean, request );
395 
396         List<LocalFolderLinkDTO> links = generateLinks( model, request );
397         LocalFolderLinkDTO link = new LocalFolderLinkDTO( );
398         link.setPosition( nbLink + 1 );
399         links.add( link );
400 
401         model.put( MARK_LOCAL_FOLDER, _folderBean );
402         model.put( PARAMETER_LINK_ID, nbLink + 1L );
403         model.put( PARAMETER_LINK_LIST, links );
404         setDataInModel( request, model );
405 
406         return getAdminPage( getTemplateFolder( model ) );
407     }
408 
409     /**
410      * Delete a link
411      * @param request the page request
412      * @return the ManageFicheLocale page
413      */
414     public String doDeleteLink( HttpServletRequest request )
415     {
416         Integer nbLink = Integer.valueOf( request.getParameter( PARAMETER_LINK_ID ) );
417         Map<String, Object> model = new HashMap<String, Object>( );
418 
419         populate( _folderBean, request );
420 
421         List<LocalFolderLinkDTO> links = generateLinks( model, request );
422         links.remove( links.size( ) - 1 );
423 
424         model.put( MARK_LOCAL_FOLDER, _folderBean );
425         model.put( PARAMETER_LINK_ID, nbLink - 1 );
426         model.put( PARAMETER_LINK_LIST, links );
427         setDataInModel( request, model );
428 
429         return getAdminPage( getTemplateFolder( model ) );
430     }
431 
432     /**
433      * Verify if a theme exists
434      * @param request the page request
435      * @return the CreateDossierLocal page or an {@link AdminMessage}
436      */
437     public IPluginActionResult doVerifyParentTheme( HttpServletRequest request )
438     {
439         IPluginActionResult result = new DefaultPluginActionResult( );
440         HashMap<String, Object> model = new HashMap<String, Object>( );
441 
442         populate( _folderBean, request );
443 
444         String errorKey = _dilaValidationService.validateRootTheme( _folderBean );
445 
446         if ( StringUtils.isNotBlank( errorKey ) )
447         {
448             result.setRedirect( AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP ) );
449 
450             return result;
451         }
452 
453         generateLinks( model, request );
454         model.put( MARK_LOCAL_FOLDER, _folderBean );
455         setDataInModel( request, model );
456 
457         result.setHtmlContent( getAdminPage( getTemplateFolder( model ) ) );
458 
459         return result;
460     }
461 
462     /**
463      * Verify if a folder exists
464      * @param request the page request
465      * @return the CreateDossierLocal page or an {@link AdminMessage}
466      */
467     public IPluginActionResult doVerifySiblingFolder( HttpServletRequest request )
468     {
469         IPluginActionResult result = new DefaultPluginActionResult( );
470         HashMap<String, Object> model = new HashMap<String, Object>( );
471 
472         populate( _folderBean, request );
473 
474         String errorKey = _dilaValidationService.validateLinkedFolder( _folderBean );
475 
476         if ( StringUtils.isNotBlank( errorKey ) )
477         {
478             result.setRedirect( AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP ) );
479 
480             return result;
481         }
482 
483         generateLinks( model, request );
484         model.put( MARK_LOCAL_FOLDER, _folderBean );
485         setDataInModel( request, model );
486 
487         result.setHtmlContent( getAdminPage( getTemplateFolder( model ) ) );
488 
489         return result;
490     }
491 
492     /**
493      * Verify if a card exists
494      * @param request the page request
495      * @return the CreateDossierLocal page or an {@link AdminMessage}
496      */
497     public IPluginActionResult doVerifyCardLink( HttpServletRequest request )
498     {
499         String referenceId = request.getParameter( PARAMETER_REFERENCE_ID );
500         populate( _folderBean, request );
501 
502         IPluginActionResult result = new DefaultPluginActionResult( );
503         HashMap<String, Object> model = new HashMap<String, Object>( );
504         LocalFolderLinkDTO link = new LocalFolderLinkDTO( );
505         String errorKey = _dilaValidationService.validateLinkCard( _folderBean, referenceId, link );
506 
507         if ( StringUtils.isNotBlank( errorKey ) )
508         {
509             result.setRedirect( AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP ) );
510 
511             return result;
512         }
513 
514         generateLinks( model, request );
515         model.put( MARK_LOCAL_FOLDER, _folderBean );
516         setDataInModel( request, model );
517 
518         result.setHtmlContent( getAdminPage( getTemplateFolder( model ) ) );
519 
520         return result;
521     }
522 
523     /**
524      * Verify if a folder exists
525      * @param request the page request
526      * @return the CreateFicheLocale page or an {@link AdminMessage}
527      */
528     public IPluginActionResult doVerifyParentFolder( HttpServletRequest request )
529     {
530         populate( _cardBean, request );
531 
532         IPluginActionResult result = new DefaultPluginActionResult( );
533         HashMap<String, Object> model = new HashMap<String, Object>( );
534 
535         String errorKey = _dilaValidationService.validateRootFolder( _cardBean, _cardBean.getParentFolderId( ) );
536 
537         if ( StringUtils.isNotBlank( errorKey ) )
538         {
539             result.setRedirect( AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP ) );
540 
541             return result;
542         }
543 
544         generateChapters( model, request );
545 
546         model.put( MARK_LOCAL_CARD, _cardBean );
547         setDataInModel( request, model );
548 
549         result.setHtmlContent( getAdminPage( getTemplateCard( model ) ) );
550 
551         return result;
552     }
553 
554     /**
555      * Verify if a card exists
556      * @param request the page request
557      * @return the CreateFicheLocale page or an {@link AdminMessage}
558      */
559     public IPluginActionResult doVerifySiblingCard( HttpServletRequest request )
560     {
561         populate( _cardBean, request );
562 
563         IPluginActionResult result = new DefaultPluginActionResult( );
564         HashMap<String, Object> model = new HashMap<String, Object>( );
565 
566         String errorKey = _dilaValidationService.validateLinkedCard( _cardBean, _cardBean.getSiblingCardId( ) );
567 
568         if ( StringUtils.isNotBlank( errorKey ) )
569         {
570             result.setRedirect( AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP ) );
571 
572             return result;
573         }
574 
575         generateChapters( model, request );
576         model.put( MARK_LOCAL_CARD, _cardBean );
577         setDataInModel( request, model );
578         result.setHtmlContent( getAdminPage( getTemplateCard( model ) ) );
579 
580         return result;
581     }
582 
583     /**
584      * Create a local card
585      * @param request the page request
586      * @return the ManageFicheLocale page or an {@link AdminMessage}
587      */
588     public String doCreateLocalCard( HttpServletRequest request )
589     {
590         populate( _cardBean, request );
591 
592         List<LocalCardChapterDTO> chapters = generateChapters( null, request );
593 
594         String errorKey = _dilaValidationService.validateLocalCard( _cardBean, chapters );
595 
596         if ( StringUtils.isNotBlank( errorKey ) )
597         {
598             return AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP );
599         }
600 
601         // Create the local card
602         if ( StringUtils.isNumeric( _cardBean.getParentFolderId( ) ) )
603         {
604             _cardBean.getLocalDTO( ).setBreadCrumb(
605                     _cardBean.getLocalParentFolder( ).getLocalDTO( ).getBreadCrumb( ) + ";"
606                             + _cardBean.getLocalParentFolder( ).getLocalDTO( ).getId( ) );
607         }
608         else
609         {
610             _cardBean.getLocalDTO( ).setBreadCrumb(
611                     _cardBean.getNationalParentFolder( ).getBreadCrumb( ) + ";"
612                             + _cardBean.getNationalParentFolder( ).getIdXml( ) );
613         }
614 
615         _cardBean.getLocalDTO( ).setXml( XMLConvertor.convertCardToXML( _cardBean, chapters ) );
616 
617         Long localId = _dilaLocalService.create( _cardBean.getLocalDTO( ), false );
618         _cardBean.getLocalDTO( ).setId( localId );
619 
620         Long cardId = _dilaLocalCardService.create( _cardBean );
621         _cardBean.setId( cardId );
622 
623         // Create chapters
624         for ( LocalCardChapterDTO chapter : chapters )
625         {
626             chapter.setLocalCard( _cardBean );
627             _dilaLocalCardChapterService.create( chapter );
628         }
629 
630         return JSP_MANAGE_LOCAL_NAME;
631     }
632 
633     /**
634      * Modify a local card
635      * @param request the page request
636      * @return the ManageFicheLocale page or an {@link AdminMessage}
637      */
638     public String doModifyLocalCard( HttpServletRequest request )
639     {
640         populate( _cardBean, request );
641 
642         List<LocalCardChapterDTO> chapters = generateChapters( null, request );
643 
644         String errorKey = _dilaValidationService.validateLocalCard( _cardBean, chapters );
645 
646         if ( StringUtils.isNotBlank( errorKey ) )
647         {
648             return AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP );
649         }
650 
651         // Create the local card
652         if ( StringUtils.isNumeric( _cardBean.getParentFolderId( ) ) )
653         {
654             _cardBean.getLocalDTO( ).setBreadCrumb(
655                     _cardBean.getLocalParentFolder( ).getLocalDTO( ).getBreadCrumb( ) + ";"
656                             + _cardBean.getLocalParentFolder( ).getLocalDTO( ).getId( ) );
657         }
658         else
659         {
660             _cardBean.getLocalDTO( ).setBreadCrumb(
661                     _cardBean.getNationalParentFolder( ).getBreadCrumb( ) + ";"
662                             + _cardBean.getNationalParentFolder( ).getIdXml( ) );
663         }
664 
665         _cardBean.getLocalDTO( ).setXml( XMLConvertor.convertCardToXML( _cardBean, chapters ) );
666         _dilaLocalService.update( _cardBean.getLocalDTO( ), false );
667 
668         // Update card
669         _dilaLocalCardService.update( _cardBean );
670 
671         // Delete old chapters
672         _dilaLocalCardChapterService.deleteByCardId( _cardBean.getId( ) );
673 
674         // Create chapters
675         for ( LocalCardChapterDTO chapter : chapters )
676         {
677             chapter.setLocalCard( _cardBean );
678             _dilaLocalCardChapterService.create( chapter );
679         }
680 
681         return JSP_MANAGE_LOCAL_NAME;
682     }
683 
684     /**
685      * Create a local folder
686      * @param request the page request
687      * @return the ManageFicheLocale page or an {@link AdminMessage}
688      */
689     public String doCreateLocalFolder( HttpServletRequest request )
690     {
691         populate( _folderBean, request );
692 
693         List<LocalFolderLinkDTO> links = generateLinks( null, request );
694 
695         String errorKey = _dilaValidationService.validateLocalFolder( _folderBean, links );
696 
697         if ( StringUtils.isNotBlank( errorKey ) )
698         {
699             return AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP );
700         }
701 
702         // generate XML 
703         _folderBean.getLocalDTO( ).setXml( XMLConvertor.convertFolderInXML( _folderBean, links ) );
704 
705         Long localId = _dilaLocalService.create( _folderBean.getLocalDTO( ), false );
706         _folderBean.getLocalDTO( ).setId( localId );
707 
708         Long folderId = _dilaLocalFolderService.create( _folderBean );
709         _folderBean.setId( folderId );
710 
711         for ( LocalFolderLinkDTO link : links )
712         {
713             link.setLocalFolderId( _folderBean.getId( ) );
714             _dilaLocalFolderLinkService.create( link );
715         }
716 
717         return JSP_MANAGE_LOCAL_NAME;
718     }
719 
720     /**
721      * Modify a local folder
722      * @param request the page request
723      * @return the ManageFicheLocale page or an {@link AdminMessage}
724      */
725     public String doModifyLocalFolder( HttpServletRequest request )
726     {
727         populate( _folderBean, request );
728 
729         List<LocalFolderLinkDTO> links = generateLinks( null, request );
730 
731         String errorKey = _dilaValidationService.validateLocalFolder( _folderBean, links );
732 
733         if ( StringUtils.isNotBlank( errorKey ) )
734         {
735             return AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP );
736         }
737 
738         // generate XML 
739         _folderBean.getLocalDTO( ).setXml( XMLConvertor.convertFolderInXML( _folderBean, links ) );
740 
741         // update local
742         _dilaLocalService.update( _folderBean.getLocalDTO( ), false );
743 
744         // update dossier local
745         _dilaLocalFolderService.update( _folderBean );
746 
747         // delete old links
748         _dilaLocalFolderLinkService.deleteByFolderId( _folderBean.getId( ) );
749 
750         // create new links
751         for ( LocalFolderLinkDTO link : links )
752         {
753             link.setLocalFolderId( _folderBean.getId( ) );
754             _dilaLocalFolderLinkService.create( link );
755         }
756 
757         return JSP_MANAGE_LOCAL_NAME;
758     }
759 
760     /**
761      * Returns the confirmation message to delete a DILA local card
762      * @param request The Http request
763      * @return the html code message
764      */
765     public String getDeleteLocalCard( HttpServletRequest request )
766     {
767         String idLocal = request.getParameter( DilaConstants.MARK_LOCAL_ID );
768 
769         if ( StringUtils.isEmpty( idLocal ) )
770         {
771             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
772                     AdminMessage.TYPE_STOP );
773         }
774 
775         Map<String, Object> urlParam = new HashMap<String, Object>( );
776         urlParam.put( DilaConstants.MARK_LOCAL_ID, idLocal );
777 
778         return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_CONFIRMATION_DELETE_FICHE, null,
779                 DilaConstants.MESSAGE_TITLE_DELETE_FICHE, DilaConstants.JSP_DELETE_FICHE, "_self",
780                 AdminMessage.TYPE_CONFIRMATION, urlParam, DilaConstants.JSP_MANAGE_LOCAL );
781     }
782 
783     /**
784      * Delete a DILA local card.
785      * @param request The Http request
786      * @return url return
787      */
788     public String doDeleteLocalCard( HttpServletRequest request )
789     {
790         String idLocal = request.getParameter( DilaConstants.MARK_LOCAL_ID );
791 
792         if ( StringUtils.isEmpty( idLocal ) )
793         {
794             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
795                     AdminMessage.TYPE_STOP );
796         }
797 
798         Long localCardId = _dilaLocalCardService.findCardIdByLocalId( idLocal );
799 
800         _dilaLocalCardChapterService.deleteByCardId( localCardId );
801         _dilaLocalCardService.delete( localCardId );
802         _dilaLocalService.delete( idLocal );
803 
804         return AppPathService.getBaseUrl( request ) + DilaConstants.JSP_MANAGE_LOCAL;
805     }
806 
807     /**
808      * Returns the confirmation message to delete a DILA local folder
809      * @param request The Http request
810      * @return the html code message
811      */
812     public String getDeleteLocalFolder( HttpServletRequest request )
813     {
814         String idLocal = request.getParameter( DilaConstants.MARK_LOCAL_ID );
815 
816         if ( StringUtils.isEmpty( idLocal ) )
817         {
818             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
819                     AdminMessage.TYPE_STOP );
820         }
821 
822         // Check if can delete folder
823         if ( _dilaLocalCardService.isCardWithParentId( idLocal ) )
824         {
825             return AdminMessageService.getMessageUrl( request, "dila.message.impossible.delete_dossierlocal",
826                     AdminMessage.TYPE_STOP );
827         }
828 
829         Map<String, Object> urlParam = new HashMap<String, Object>( );
830         urlParam.put( DilaConstants.MARK_LOCAL_ID, idLocal );
831 
832         return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_CONFIRMATION_DELETE_DOSSIER, null,
833                 DilaConstants.MESSAGE_TITLE_DELETE_DOSSIER, DilaConstants.JSP_DELETE_DOSSIER, "_self",
834                 AdminMessage.TYPE_CONFIRMATION, urlParam, DilaConstants.JSP_MANAGE_STYLESHEET );
835     }
836 
837     /**
838      * Delete a local folder.
839      * @param request The Http request
840      * @return url return
841      */
842     public String doDeleteLocalFolder( HttpServletRequest request )
843     {
844         String idLocal = request.getParameter( DilaConstants.MARK_LOCAL_ID );
845 
846         if ( StringUtils.isEmpty( idLocal ) )
847         {
848             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
849                     AdminMessage.TYPE_STOP );
850         }
851 
852         Long localFolderId = _dilaLocalFolderService.findFolderIdByLocalId( idLocal );
853 
854         _dilaLocalFolderLinkService.deleteByFolderId( localFolderId );
855         _dilaLocalFolderService.delete( localFolderId );
856         _dilaLocalService.delete( idLocal );
857 
858         return AppPathService.getBaseUrl( request ) + DilaConstants.JSP_MANAGE_LOCAL;
859     }
860 
861     /**
862      * Set data in model
863      * @param request the page request
864      * @param model the model to populate
865      */
866     private void setDataInModel( HttpServletRequest request, Map<String, Object> model )
867     {
868         List<AudienceDTO> audienceList = _dilaAudienceService.findAll( );
869         ReferenceList contentTypeList = ListUtils.toReferenceList( audienceList, "id", "label", null );
870         model.put( MARK_AUDIENCE, contentTypeList );
871         model.put( MARK_LOCALE, getLocale( ) );
872         model.put( MARK_WEBAPP_URL, AppPathService.getBaseUrl( request ) );
873     }
874 
875     /**
876      * Generate chapters to display
877      * @param model the model
878      * @param request the page request
879      * @return list of chapters
880      */
881     private List<LocalCardChapterDTO> generateChapters( Map<String, Object> model, HttpServletRequest request )
882     {
883         Integer nbChapter = Integer.valueOf( request.getParameter( PARAMETER_CHAPTER_ID ) );
884 
885         List<LocalCardChapterDTO> chapters = new ArrayList<LocalCardChapterDTO>( );
886 
887         for ( int i = 1; i <= nbChapter; i++ )
888         {
889             String title = request.getParameter( "chapter_title_" + i );
890             String content = request.getParameter( "chapter_content_" + i );
891 
892             LocalCardChapterDTO chapter = new LocalCardChapterDTO( );
893             chapter.setTitle( title );
894             chapter.setContent( content );
895             chapter.setPosition( i );
896 
897             chapters.add( chapter );
898         }
899 
900         if ( model != null )
901         {
902             model.put( PARAMETER_CHAPTER_ID, nbChapter );
903             model.put( PARAMETER_CHAPTERS_LIST, chapters );
904         }
905 
906         return chapters;
907     }
908 
909     /**
910      * Generate links to display
911      * @param model the model
912      * @param request the page request
913      * @return list of links
914      */
915     private List<LocalFolderLinkDTO> generateLinks( Map<String, Object> model, HttpServletRequest request )
916     {
917         Integer nbLinks = Integer.valueOf( request.getParameter( PARAMETER_LINK_ID ) );
918 
919         List<LocalFolderLinkDTO> links = new ArrayList<LocalFolderLinkDTO>( );
920 
921         for ( int i = 1; i <= nbLinks; i++ )
922         {
923             String title = request.getParameter( "link_title_" + i );
924             String referenceId = request.getParameter( "link_reference_" + i );
925 
926             LocalFolderLinkDTO link = new LocalFolderLinkDTO( );
927             link.setTitle( title );
928             link.setCardId( referenceId );
929             link.setPosition( i );
930             _dilaValidationService.validateLinkCard( _folderBean, referenceId, link );
931             links.add( link );
932         }
933 
934         if ( model != null )
935         {
936             model.put( PARAMETER_LINK_ID, nbLinks );
937             model.put( PARAMETER_LINK_LIST, links );
938         }
939 
940         return links;
941     }
942 
943     /**
944      * Filter list of {@link LocalDTO}
945      * @param initList the initial list
946      * @param type the type of resource
947      * @param id the id od resource
948      * @param name the name of resource
949      * @param author the author of resource
950      * @return the filtered list
951      */
952     private List<LocalDTO> filterLocal( List<LocalDTO> initList, Long type, Long id, String name, String author )
953     {
954         List<LocalDTO> result = new ArrayList<LocalDTO>( );
955 
956         for ( LocalDTO local : initList )
957         {
958             if ( !type.equals( 0L ) && !local.getType( ).getId( ).equals( type ) )
959             {
960                 continue;
961             }
962 
963             if ( !id.equals( 0L ) && !local.getId( ).equals( id ) )
964             {
965                 continue;
966             }
967 
968             if ( StringUtils.isNotBlank( name ) && !local.getTitle( ).equals( name ) )
969             {
970                 continue;
971             }
972 
973             if ( StringUtils.isNotBlank( author ) && !local.getAuthor( ).equals( author ) )
974             {
975                 continue;
976             }
977 
978             result.add( local );
979         }
980 
981         return result;
982     }
983 
984     /**
985      * Get the current template for card
986      * @param model the template model
987      * @return the current html template
988      */
989     private String getTemplateCard( Map<String, Object> model )
990     {
991         if ( ActionTypeEnum.CREATE.getValue( ).equals( _strAction ) )
992         {
993             return AppTemplateService.getTemplate( TEMPLATE_CREATE_LOCAL_CARD, getLocale( ), model ).getHtml( );
994         }
995         else
996         {
997             return AppTemplateService.getTemplate( TEMPLATE_MODIFY_LOCAL_CARD, getLocale( ), model ).getHtml( );
998         }
999     }
1000 
1001     /**
1002      * Get the current template for folder
1003      * @param model the template model
1004      * @return the current html template
1005      */
1006     private String getTemplateFolder( Map<String, Object> model )
1007     {
1008         if ( ActionTypeEnum.CREATE.getValue( ).equals( _strAction ) )
1009         {
1010             return AppTemplateService.getTemplate( TEMPLATE_CREATE_LOCAL_FOLDER, getLocale( ), model ).getHtml( );
1011         }
1012         else
1013         {
1014             return AppTemplateService.getTemplate( TEMPLATE_MODIFY_LOCAL_FOLDER, getLocale( ), model ).getHtml( );
1015         }
1016     }
1017 }