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.Collections;
38  import java.util.HashMap;
39  import java.util.List;
40  import java.util.Map;
41  
42  import javax.servlet.http.HttpServletRequest;
43  
44  import org.apache.commons.lang.StringUtils;
45  
46  import fr.paris.lutece.plugins.dila.business.donneescomplementaires.dto.ComplementaryDataDTO;
47  import fr.paris.lutece.plugins.dila.business.donneescomplementaires.dto.ComplementaryDataLearnMoreDTO;
48  import fr.paris.lutece.plugins.dila.business.donneescomplementaires.dto.ComplementaryDataLinkDTO;
49  import fr.paris.lutece.plugins.dila.business.donneescomplementaires.dto.ComplementaryDataTeleserviceDTO;
50  import fr.paris.lutece.plugins.dila.business.enums.ActionTypeEnum;
51  import fr.paris.lutece.plugins.dila.business.enums.ComplementaryLinkTypeEnum;
52  import fr.paris.lutece.plugins.dila.business.enums.ResourceTypeEnum;
53  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.AudienceDTO;
54  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.XmlDTO;
55  import fr.paris.lutece.plugins.dila.service.IDilaAudienceService;
56  import fr.paris.lutece.plugins.dila.service.IDilaComplementaryDataLinkService;
57  import fr.paris.lutece.plugins.dila.service.IDilaComplementaryDataService;
58  import fr.paris.lutece.plugins.dila.service.IDilaXmlService;
59  import fr.paris.lutece.plugins.dila.utils.ListUtils;
60  import fr.paris.lutece.plugins.dila.utils.constants.DilaConstants;
61  import fr.paris.lutece.portal.service.admin.AccessDeniedException;
62  import fr.paris.lutece.portal.service.message.AdminMessage;
63  import fr.paris.lutece.portal.service.message.AdminMessageService;
64  import fr.paris.lutece.portal.service.spring.SpringContextService;
65  import fr.paris.lutece.portal.service.template.AppTemplateService;
66  import fr.paris.lutece.portal.service.util.AppPathService;
67  import fr.paris.lutece.portal.service.util.AppPropertiesService;
68  import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
69  import fr.paris.lutece.portal.web.constants.Parameters;
70  import fr.paris.lutece.portal.web.pluginaction.DefaultPluginActionResult;
71  import fr.paris.lutece.portal.web.pluginaction.IPluginActionResult;
72  import fr.paris.lutece.portal.web.util.LocalizedPaginator;
73  import fr.paris.lutece.util.ReferenceList;
74  import fr.paris.lutece.util.html.HtmlTemplate;
75  import fr.paris.lutece.util.html.Paginator;
76  import fr.paris.lutece.util.sort.AttributeComparator;
77  
78  
79  /**
80   * ComplementaryDataJspBean
81   */
82  public class ComplementaryDataJspBean extends PluginAdminPageJspBean
83  {
84      //Rights
85      public static final String RIGHT_MANAGE_COMPLEMENTARY_DATA = "DILA_COMPLEMENTARY_DATA_MANAGEMENT";
86  
87      /** Serial id */
88      private static final long serialVersionUID = -1328940389092455815L;
89  
90      //templates
91      private static final String TEMPLATE_MANAGE_COMPLEMENTARY_DATA = "admin/plugins/dila/manage_donnee-complementaire.html";
92      private static final String TEMPLATE_CREATE_COMPLEMENTARY_DATA = "admin/plugins/dila/create_donnee-complementaire.html";
93      private static final String TEMPLATE_MODIFY_COMPLEMENTARY_DATA = "admin/plugins/dila/modify_donnee-complementaire.html";
94  
95      //jsp
96      private static final String JSP_MANAGE_COMPLEMENTARY_DATA = "ManageComplementaryData.jsp";
97  
98      // parameters
99      private static final String PARAMETER_TELESERVICE_ID = "id_teleservice";
100     private static final String PARAMETER_LINK_ID = "id_lien";
101 
102     // marks
103     private static final String MARK_COMPLEMENTARY_DATA = "donneesComplementaires";
104     private static final String MARK_TELESERVICE_LIST = "list_teleservices";
105     private static final String MARK_LINK_LIST = "list_liens";
106     private static final String MARK_AUDIENCE = "audiences";
107     private static final String MARK_WEBAPP_URL = "webapp_url";
108     private static final String MARK_LOCALE = "locale";
109 
110     // Beans
111     private ComplementaryDataDTO _complementaryData;
112     private String _strAction;
113 
114     // Constants
115     private int _nItemsPerPage;
116     private int _nDefaultItemsPerPage;
117     private String _strCurrentPageIndex;
118     private IDilaComplementaryDataService _dilaComplementaryDataService = SpringContextService
119             .getBean( "dilaComplementaryDataService" );
120     private IDilaComplementaryDataLinkService _dilaComplementaryDataLinkService = SpringContextService
121             .getBean( "dilaComplementaryDataLinkService" );
122     private IDilaXmlService _dilaXmlService = SpringContextService.getBean( "dilaXmlService" );
123     private IDilaAudienceService _dilaAudienceService = SpringContextService.getBean( "dilaAudienceService" );
124 
125     /**
126      * Return complementary data management
127      * @param request The Http request
128      * @return Html
129      */
130     public String getManageComplementaryData( HttpServletRequest request )
131     {
132         Map<String, Object> model = new HashMap<String, Object>( );
133         String strId = request.getParameter( DilaConstants.MARK_ID );
134         String strDataName = request.getParameter( DilaConstants.MARK_NAME );
135 
136         //Init completed cards data table 
137         List<ComplementaryDataDTO> listComplementaryData = _dilaComplementaryDataService.findAll( );
138         List<ComplementaryDataDTO> listToDisplay = filtrer( listComplementaryData, strDataName, strId );
139 
140         // Orders the list of result and add pagination
141         String strSortedAttributeName = request.getParameter( Parameters.SORTED_ATTRIBUTE_NAME );
142         String strAscSort = null;
143 
144         if ( strSortedAttributeName != null )
145         {
146             strAscSort = request.getParameter( Parameters.SORTED_ASC );
147 
148             boolean bIsAscSort = Boolean.parseBoolean( strAscSort );
149 
150             Collections.sort( listToDisplay, new AttributeComparator( strSortedAttributeName, bIsAscSort ) );
151         }
152 
153         _nDefaultItemsPerPage = AppPropertiesService.getPropertyInt( DilaConstants.PROPERTY_STYLESHEETS_PER_PAGE, 50 );
154         _strCurrentPageIndex = Paginator.getPageIndex( request, Paginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex );
155         _nItemsPerPage = Paginator.getItemsPerPage( request, Paginator.PARAMETER_ITEMS_PER_PAGE, _nItemsPerPage,
156                 _nDefaultItemsPerPage );
157 
158         String strURL = getHomeUrl( request );
159 
160         if ( strSortedAttributeName != null )
161         {
162             strURL += ( "?" + Parameters.SORTED_ATTRIBUTE_NAME + "=" + strSortedAttributeName );
163         }
164 
165         if ( strAscSort != null )
166         {
167             strURL += ( "&" + Parameters.SORTED_ASC + "=" + strAscSort );
168         }
169 
170         LocalizedPaginator<ComplementaryDataDTO> paginator = new LocalizedPaginator<ComplementaryDataDTO>(
171                 listToDisplay, _nItemsPerPage, strURL, Paginator.PARAMETER_PAGE_INDEX, _strCurrentPageIndex,
172                 getLocale( ) );
173 
174         model.put( DilaConstants.MARK_NB_ITEMS_PER_PAGE, "" + _nItemsPerPage );
175         model.put( DilaConstants.MARK_PAGINATOR, paginator );
176         model.put( DilaConstants.MARK_COMP_DATA_LIST, paginator.getPageItems( ) );
177         model.put( DilaConstants.MARK_ID, strId );
178         model.put( DilaConstants.MARK_NAME, strDataName );
179 
180         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MANAGE_COMPLEMENTARY_DATA, getLocale( ),
181                 model );
182 
183         return getAdminPage( templateList.getHtml( ) );
184     }
185 
186     /**
187      * Return complementary data creation page
188      * @param request The Http request
189      * @return Html
190      */
191     public String getCreateComplementaryData( HttpServletRequest request )
192     {
193         _strAction = ActionTypeEnum.CREATE.getValue( );
194 
195         Map<String, Object> model = new HashMap<String, Object>( );
196 
197         _complementaryData = new ComplementaryDataDTO( );
198 
199         List<ComplementaryDataTeleserviceDTO> listTeleservice = new ArrayList<ComplementaryDataTeleserviceDTO>( );
200         List<ComplementaryDataLearnMoreDTO> listLink = new ArrayList<ComplementaryDataLearnMoreDTO>( );
201 
202         model.put( MARK_COMPLEMENTARY_DATA, _complementaryData );
203         model.put( MARK_TELESERVICE_LIST, listTeleservice );
204         model.put( PARAMETER_TELESERVICE_ID, 0 );
205         model.put( MARK_LINK_LIST, listLink );
206         model.put( PARAMETER_LINK_ID, 0 );
207         setDataInModel( request, model );
208 
209         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_CREATE_COMPLEMENTARY_DATA, getLocale( ),
210                 model );
211 
212         return getAdminPage( templateList.getHtml( ) );
213     }
214 
215     /**
216      * Return complementary data modification page
217      * @param request The Http request
218      * @return Html
219      */
220     public String getModifyComplementaryData( HttpServletRequest request )
221     {
222         _strAction = ActionTypeEnum.MODIFY.getValue( );
223 
224         String idComplementaryData = request.getParameter( DilaConstants.MARK_ID );
225 
226         if ( StringUtils.isEmpty( idComplementaryData ) || !StringUtils.isNumeric( idComplementaryData ) )
227         {
228             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
229                     AdminMessage.TYPE_STOP );
230         }
231 
232         _complementaryData = _dilaComplementaryDataService.findById( Long.valueOf( idComplementaryData ) );
233 
234         if ( _complementaryData == null )
235         {
236             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
237                     AdminMessage.TYPE_STOP );
238         }
239 
240         // get card infos
241         verifyCard( _complementaryData.getCard( ).getIdXml( ) );
242 
243         Map<String, Object> model = new HashMap<String, Object>( );
244 
245         List<ComplementaryDataLinkDTO> listTeleservice = _dilaComplementaryDataLinkService.findByDataId(
246                 Long.valueOf( idComplementaryData ), ComplementaryLinkTypeEnum.TELESERVICE );
247         List<ComplementaryDataLinkDTO> listLink = _dilaComplementaryDataLinkService.findByDataId(
248                 Long.valueOf( idComplementaryData ), ComplementaryLinkTypeEnum.LEARN_MORE );
249 
250         model.put( MARK_COMPLEMENTARY_DATA, _complementaryData );
251         model.put( MARK_TELESERVICE_LIST, listTeleservice );
252         model.put( PARAMETER_TELESERVICE_ID, listTeleservice.size( ) );
253         model.put( MARK_LINK_LIST, listLink );
254         model.put( PARAMETER_LINK_ID, listLink.size( ) );
255         setDataInModel( request, model );
256 
257         HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_MODIFY_COMPLEMENTARY_DATA, getLocale( ),
258                 model );
259 
260         return getAdminPage( templateList.getHtml( ) );
261     }
262 
263     /**
264      * Returns the confirmation message to delete a complementary data
265      * @param request The Http request
266      * @return the html code message
267      * @throws AccessDeniedException AccessDeniedException
268      */
269     public String getDeleteComplementaryData( HttpServletRequest request ) throws AccessDeniedException
270     {
271         String id = request.getParameter( DilaConstants.MARK_ID );
272 
273         if ( StringUtils.isEmpty( id ) )
274         {
275             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
276                     AdminMessage.TYPE_STOP );
277         }
278 
279         Map<String, Object> urlParam = new HashMap<String, Object>( );
280         urlParam.put( DilaConstants.MARK_ID, id );
281 
282         return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_CONFIRMATION_DELETE_DONNEE, null,
283                 DilaConstants.MESSAGE_TITLE_DELETE_DONNEE, DilaConstants.JSP_DELETE_DONNEE, "_self",
284                 AdminMessage.TYPE_CONFIRMATION, urlParam, DilaConstants.JSP_MANAGE_DONNEES );
285     }
286 
287     /**
288      * Add a teleservice
289      * @param request the page request
290      * @return the CreateDonneeComplementaire page
291      */
292     public String doAddTeleservice( HttpServletRequest request )
293     {
294         Integer nbTeleservice = Integer.valueOf( request.getParameter( PARAMETER_TELESERVICE_ID ) );
295         Map<String, Object> model = new HashMap<String, Object>( );
296 
297         populate( _complementaryData, request );
298 
299         List<ComplementaryDataLinkDTO> teleservices = getExistingTeleservices( request );
300         List<ComplementaryDataLinkDTO> links = getExistingLinks( request );
301 
302         ComplementaryDataTeleserviceDTO teleservice = new ComplementaryDataTeleserviceDTO( );
303         teleservice.setPosition( nbTeleservice + 1 );
304         teleservices.add( teleservice );
305 
306         model.put( MARK_COMPLEMENTARY_DATA, _complementaryData );
307         model.put( PARAMETER_TELESERVICE_ID, nbTeleservice + 1 );
308         model.put( MARK_TELESERVICE_LIST, teleservices );
309         model.put( PARAMETER_LINK_ID, links.size( ) );
310         model.put( MARK_LINK_LIST, links );
311         setDataInModel( request, model );
312 
313         return getAdminPage( getTemplate( model ) );
314     }
315 
316     /**
317      * Delete a teleservice
318      * @param request the page request
319      * @return the CreateDonneeComplementaire page
320      */
321     public String doDeleteTeleservice( HttpServletRequest request )
322     {
323         Integer nbTeleservice = Integer.valueOf( request.getParameter( PARAMETER_TELESERVICE_ID ) );
324         Map<String, Object> model = new HashMap<String, Object>( );
325 
326         populate( _complementaryData, request );
327 
328         List<ComplementaryDataLinkDTO> teleservices = getExistingTeleservices( request );
329         List<ComplementaryDataLinkDTO> links = getExistingLinks( request );
330         teleservices.remove( teleservices.size( ) - 1 );
331 
332         model.put( MARK_COMPLEMENTARY_DATA, _complementaryData );
333         model.put( PARAMETER_TELESERVICE_ID, nbTeleservice - 1 );
334         model.put( MARK_TELESERVICE_LIST, teleservices );
335         model.put( PARAMETER_LINK_ID, links.size( ) );
336         model.put( MARK_LINK_LIST, links );
337         setDataInModel( request, model );
338 
339         return getAdminPage( getTemplate( model ) );
340     }
341 
342     /**
343      * Add a link
344      * @param request the page request
345      * @return the CreateDonneeComplementaire page
346      */
347     public String doAddLink( HttpServletRequest request )
348     {
349         Integer nbLink = Integer.valueOf( request.getParameter( PARAMETER_LINK_ID ) );
350         Map<String, Object> model = new HashMap<String, Object>( );
351 
352         populate( _complementaryData, request );
353 
354         List<ComplementaryDataLinkDTO> liens = getExistingLinks( request );
355         List<ComplementaryDataLinkDTO> teleservices = getExistingTeleservices( request );
356 
357         ComplementaryDataLearnMoreDTO lien = new ComplementaryDataLearnMoreDTO( );
358         lien.setPosition( nbLink + 1 );
359         liens.add( lien );
360 
361         model.put( MARK_COMPLEMENTARY_DATA, _complementaryData );
362         model.put( PARAMETER_TELESERVICE_ID, teleservices.size( ) );
363         model.put( MARK_TELESERVICE_LIST, teleservices );
364         model.put( PARAMETER_LINK_ID, nbLink + 1 );
365         model.put( MARK_LINK_LIST, liens );
366         setDataInModel( request, model );
367 
368         return getAdminPage( getTemplate( model ) );
369     }
370 
371     /**
372      * Delete a link
373      * @param request the page request
374      * @return the CreateDonneeComplementaire page
375      */
376     public String doDeleteLink( HttpServletRequest request )
377     {
378         Integer nbLink = Integer.valueOf( request.getParameter( PARAMETER_LINK_ID ) );
379         Map<String, Object> model = new HashMap<String, Object>( );
380 
381         populate( _complementaryData, request );
382 
383         List<ComplementaryDataLinkDTO> links = getExistingLinks( request );
384         List<ComplementaryDataLinkDTO> teleservices = getExistingTeleservices( request );
385         links.remove( links.size( ) - 1 );
386 
387         model.put( MARK_COMPLEMENTARY_DATA, _complementaryData );
388         model.put( PARAMETER_TELESERVICE_ID, teleservices.size( ) );
389         model.put( MARK_TELESERVICE_LIST, teleservices );
390         model.put( PARAMETER_LINK_ID, nbLink - 1 );
391         model.put( MARK_LINK_LIST, links );
392         setDataInModel( request, model );
393 
394         return getAdminPage( getTemplate( model ) );
395     }
396 
397     /**
398      * Verify if a card exists
399      * @param request the page request
400      * @return the CreateDonneeComplementaire page or an {@link AdminMessage}
401      */
402     public IPluginActionResult doVerifyCard( HttpServletRequest request )
403     {
404         populate( _complementaryData, request );
405 
406         IPluginActionResult result = new DefaultPluginActionResult( );
407         HashMap<String, Object> model = new HashMap<String, Object>( );
408 
409         String errorKey = verifyCard( _complementaryData.getCard( ).getIdXml( ) );
410 
411         if ( errorKey != null )
412         {
413             // if error, we return the AdminMessage
414             result.setRedirect( AdminMessageService.getMessageUrl( request, errorKey, AdminMessage.TYPE_STOP ) );
415         }
416         else
417         {
418             // Else, we display the Create Donnee page
419             List<ComplementaryDataLinkDTO> teleservices = getExistingTeleservices( request );
420             List<ComplementaryDataLinkDTO> links = getExistingLinks( request );
421 
422             model.put( MARK_COMPLEMENTARY_DATA, _complementaryData );
423             model.put( MARK_TELESERVICE_LIST, teleservices );
424             model.put( PARAMETER_TELESERVICE_ID, teleservices.size( ) );
425             model.put( PARAMETER_LINK_ID, links.size( ) );
426             model.put( MARK_LINK_LIST, links );
427             setDataInModel( request, model );
428 
429             HtmlTemplate templateList;
430             templateList = AppTemplateService.getTemplate( TEMPLATE_CREATE_COMPLEMENTARY_DATA, getLocale( ), model );
431             result.setHtmlContent( getAdminPage( templateList.getHtml( ) ) );
432         }
433 
434         return result;
435     }
436 
437     /**
438      * Create a complementary data
439      * @param request the page request
440      * @return the ManageComplementaryData page or an {@link AdminMessage}
441      */
442     public String doCreateComplementaryData( HttpServletRequest request )
443     {
444         String result = null;
445         populate( _complementaryData, request );
446 
447         List<ComplementaryDataLinkDTO> teleservices = getExistingTeleservices( request );
448         List<ComplementaryDataLinkDTO> links = getExistingLinks( request );
449 
450         String errorKeyCard = verifyCard( _complementaryData.getCard( ).getIdXml( ) );
451         String errorKeyTeleservice = validateLinks( teleservices );
452         String errorKeyLinks = validateLinks( links );
453 
454         if ( StringUtils.isNotBlank( errorKeyCard ) )
455         {
456             result = AdminMessageService.getMessageUrl( request, errorKeyCard, AdminMessage.TYPE_STOP );
457         }
458         else if ( StringUtils.isNotBlank( errorKeyTeleservice ) )
459         {
460             result = AdminMessageService.getMessageUrl( request, errorKeyTeleservice, AdminMessage.TYPE_STOP );
461         }
462         else if ( StringUtils.isNotBlank( errorKeyLinks ) )
463         {
464             result = AdminMessageService.getMessageUrl( request, errorKeyLinks, AdminMessage.TYPE_STOP );
465         }
466 
467         if ( result != null )
468         {
469             // in case of error, stop the process
470             return result;
471         }
472 
473         Long id = _dilaComplementaryDataService.create( _complementaryData );
474 
475         for ( ComplementaryDataLinkDTO teleservice : teleservices )
476         {
477             teleservice.setIdComplementaryData( id );
478             _dilaComplementaryDataLinkService.create( teleservice );
479         }
480 
481         for ( ComplementaryDataLinkDTO link : links )
482         {
483             link.setIdComplementaryData( id );
484             _dilaComplementaryDataLinkService.create( link );
485         }
486 
487         return JSP_MANAGE_COMPLEMENTARY_DATA;
488     }
489 
490     /**
491      * Modify a complemantary data
492      * @param request the page request
493      * @return the ManageComplementaryData page or an {@link AdminMessage}
494      */
495     public String doModifyComplementaryData( HttpServletRequest request )
496     {
497         String result = null;
498 
499         populate( _complementaryData, request );
500 
501         List<ComplementaryDataLinkDTO> teleservices = getExistingTeleservices( request );
502         List<ComplementaryDataLinkDTO> links = getExistingLinks( request );
503 
504         String errorKeyTeleservice = validateLinks( teleservices );
505         String errorKeyLinks = validateLinks( links );
506 
507         if ( StringUtils.isNotBlank( errorKeyTeleservice ) )
508         {
509             result = AdminMessageService.getMessageUrl( request, errorKeyTeleservice, AdminMessage.TYPE_STOP );
510         }
511         else if ( StringUtils.isNotBlank( errorKeyLinks ) )
512         {
513             result = AdminMessageService.getMessageUrl( request, errorKeyLinks, AdminMessage.TYPE_STOP );
514         }
515 
516         if ( result != null )
517         {
518             // in case of error, stop the treatment
519             return result;
520         }
521 
522         _dilaComplementaryDataService.update( _complementaryData );
523 
524         _dilaComplementaryDataLinkService.deleteFromComplementaryData( _complementaryData.getId( ),
525                 ComplementaryLinkTypeEnum.TELESERVICE );
526 
527         for ( ComplementaryDataLinkDTO teleservice : teleservices )
528         {
529             teleservice.setIdComplementaryData( _complementaryData.getId( ) );
530             _dilaComplementaryDataLinkService.create( teleservice );
531         }
532 
533         _dilaComplementaryDataLinkService.deleteFromComplementaryData( _complementaryData.getId( ),
534                 ComplementaryLinkTypeEnum.LEARN_MORE );
535 
536         for ( ComplementaryDataLinkDTO link : links )
537         {
538             link.setIdComplementaryData( _complementaryData.getId( ) );
539             _dilaComplementaryDataLinkService.create( link );
540         }
541 
542         return JSP_MANAGE_COMPLEMENTARY_DATA;
543     }
544 
545     /**
546      * Delete a DILA complementary data.
547      * @param request The Http request
548      * @return url return
549      * @throws AccessDeniedException AccessDeniedException
550      */
551     public String doDeleteComplementaryData( HttpServletRequest request ) throws AccessDeniedException
552     {
553         String id = request.getParameter( DilaConstants.MARK_ID );
554 
555         if ( StringUtils.isEmpty( id ) || !StringUtils.isNumeric( id ) )
556         {
557             return AdminMessageService.getMessageUrl( request, DilaConstants.MESSAGE_ERROR_OCCUR,
558                     AdminMessage.TYPE_STOP );
559         }
560 
561         _dilaComplementaryDataLinkService.deleteFromComplementaryData( Long.valueOf( id ),
562                 ComplementaryLinkTypeEnum.TELESERVICE );
563         _dilaComplementaryDataLinkService.deleteFromComplementaryData( Long.valueOf( id ),
564                 ComplementaryLinkTypeEnum.LEARN_MORE );
565         _dilaComplementaryDataService.delete( Long.valueOf( id ) );
566 
567         return AppPathService.getBaseUrl( request ) + DilaConstants.JSP_MANAGE_DONNEES;
568     }
569 
570     /**
571      * Check validity of card id
572      * @param id the id to check
573      * @return the error key or null
574      */
575     private String verifyCard( String id )
576     {
577         String result = null;
578 
579         if ( StringUtils.isBlank( _complementaryData.getCard( ).getIdXml( ) )
580                 || ( _complementaryData.getCard( ).getIdXml( ).length( ) > 255 ) )
581         {
582             result = "dila.create_donnee.error.ficheFormat";
583         }
584         else if ( _dilaComplementaryDataService.cardHasComplement( _complementaryData.getCard( ).getIdXml( ) ) )
585         {
586             result = "dila.create_donnee.error.ficheExistante";
587         }
588         else
589         {
590             XmlDTO cardLink = null;
591 
592             if ( _complementaryData.getCard( ).getIdXml( ).startsWith( "F" ) )
593             {
594                 // Search in XML folder
595                 List<String> availableTypes = new ArrayList<String>( );
596                 availableTypes.add( ResourceTypeEnum.CARD.getLabel( ) );
597 
598                 cardLink = _dilaXmlService.findByIdAndTypesAndAudience( _complementaryData.getCard( ).getIdXml( ),
599                         availableTypes, _complementaryData.getIdAudience( ) );
600             }
601 
602             if ( cardLink == null )
603             {
604                 result = "dila.create_donnee.error.ficheIntrouvable";
605             }
606             else
607             {
608                 _complementaryData.setCard( cardLink );
609             }
610         }
611 
612         return result;
613     }
614 
615     /**
616      * Get actual list of teleservices
617      * @param request the page request
618      * @return the populate list of {@link ComplementaryDataTeleserviceDTO}
619      */
620     private List<ComplementaryDataLinkDTO> getExistingTeleservices( HttpServletRequest request )
621     {
622         Integer nbTeleservice = Integer.valueOf( request.getParameter( PARAMETER_TELESERVICE_ID ) );
623         List<ComplementaryDataLinkDTO> teleservices = new ArrayList<ComplementaryDataLinkDTO>( );
624 
625         for ( int i = 1; i <= nbTeleservice; i++ )
626         {
627             String title = request.getParameter( "teleservice_title_" + i );
628             String url = request.getParameter( "teleservice_url_" + i );
629 
630             ComplementaryDataTeleserviceDTO teleservice = new ComplementaryDataTeleserviceDTO( );
631             teleservice.setTitle( title );
632             teleservice.setURL( url );
633             teleservice.setPosition( i );
634 
635             teleservices.add( teleservice );
636         }
637 
638         return teleservices;
639     }
640 
641     /**
642      * Get actual list of teleservices
643      * @param request the page request
644      * @return the populate list of {@link ComplementaryDataTeleserviceDTO}
645      */
646     private List<ComplementaryDataLinkDTO> getExistingLinks( HttpServletRequest request )
647     {
648         Integer nbLinks = Integer.valueOf( request.getParameter( PARAMETER_LINK_ID ) );
649         List<ComplementaryDataLinkDTO> links = new ArrayList<ComplementaryDataLinkDTO>( );
650 
651         for ( int i = 1; i <= nbLinks; i++ )
652         {
653             String title = request.getParameter( "lien_title_" + i );
654             String url = request.getParameter( "lien_url_" + i );
655 
656             ComplementaryDataLearnMoreDTO link = new ComplementaryDataLearnMoreDTO( );
657             link.setTitle( title );
658             link.setURL( url );
659             link.setPosition( i );
660 
661             links.add( link );
662         }
663 
664         return links;
665     }
666 
667     /**
668      * Check the list of links
669      * @param links list to check
670      * @return error key or null
671      */
672     private String validateLinks( List<ComplementaryDataLinkDTO> links )
673     {
674         String result = null;
675 
676         for ( ComplementaryDataLinkDTO link : links )
677         {
678             if ( StringUtils.isBlank( link.getTitle( ) ) )
679             {
680                 if ( link.getType( ).equals( ComplementaryLinkTypeEnum.TELESERVICE ) )
681                 {
682                     result = "dila.create_donnee.error.teleserviceTitre";
683                 }
684                 else
685                 {
686                     result = "dila.create_donnee.error.lienTitre";
687                 }
688 
689                 break;
690             }
691             else if ( StringUtils.isBlank( link.getURL( ) ) )
692             {
693                 if ( link.getType( ).equals( ComplementaryLinkTypeEnum.TELESERVICE ) )
694                 {
695                     result = "dila.create_donnee.error.teleserviceURL";
696                 }
697                 else
698                 {
699                     result = "dila.create_donnee.error.lienURL";
700                 }
701 
702                 break;
703             }
704         }
705 
706         return result;
707     }
708 
709     /**
710      * Filter list with param
711      * @param listComplementaryData original list
712      * @param strDataName card title
713      * @param strId card id
714      * @return filtered list
715      */
716     private List<ComplementaryDataDTO> filtrer( List<ComplementaryDataDTO> listComplementaryData, String strDataName,
717             String strId )
718     {
719         List<ComplementaryDataDTO> result = new ArrayList<ComplementaryDataDTO>( );
720 
721         for ( ComplementaryDataDTO data : listComplementaryData )
722         {
723             if ( StringUtils.isNotBlank( strDataName ) && !data.getCard( ).getTitle( ).equals( strDataName ) )
724             {
725                 continue;
726             }
727 
728             if ( StringUtils.isNotBlank( strId ) && !data.getCard( ).getIdXml( ).equals( strId ) )
729             {
730                 continue;
731             }
732 
733             result.add( data );
734         }
735 
736         return result;
737     }
738 
739     /**
740      * Set data in model
741      * @param request the page request
742      * @param model the model to populate
743      */
744     private void setDataInModel( HttpServletRequest request, Map<String, Object> model )
745     {
746         List<AudienceDTO> audienceList = _dilaAudienceService.findAll( );
747         ReferenceList listContentType = ListUtils.toReferenceList( audienceList, "id", "label", null );
748         model.put( MARK_AUDIENCE, listContentType );
749         model.put( MARK_LOCALE, getLocale( ) );
750         model.put( MARK_WEBAPP_URL, AppPathService.getBaseUrl( request ) );
751     }
752 
753     /**
754      * Get the current template
755      * @param model the template model
756      * @return the current html template
757      */
758     private String getTemplate( Map<String, Object> model )
759     {
760         if ( ActionTypeEnum.CREATE.getValue( ).equals( _strAction ) )
761         {
762             return AppTemplateService.getTemplate( TEMPLATE_CREATE_COMPLEMENTARY_DATA, getLocale( ), model ).getHtml( );
763         }
764         else
765         {
766             return AppTemplateService.getTemplate( TEMPLATE_MODIFY_COMPLEMENTARY_DATA, getLocale( ), model ).getHtml( );
767         }
768     }
769 }