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.service.impl;
35  
36  import fr.paris.lutece.plugins.dila.business.enums.ResourceTypeEnum;
37  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalCardChapterDTO;
38  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalCardDTO;
39  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalDTO;
40  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalFolderDTO;
41  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.LocalFolderLinkDTO;
42  import fr.paris.lutece.plugins.dila.business.fichelocale.dto.XmlDTO;
43  import fr.paris.lutece.plugins.dila.service.DilaLocalTypeEnum;
44  import fr.paris.lutece.plugins.dila.service.IDilaLocalService;
45  import fr.paris.lutece.plugins.dila.service.IDilaValidationService;
46  import fr.paris.lutece.plugins.dila.service.IDilaXmlService;
47  import fr.paris.lutece.portal.web.constants.Messages;
48  
49  import java.io.Serializable;
50  import java.util.ArrayList;
51  import java.util.List;
52  
53  import javax.inject.Inject;
54  import javax.inject.Named;
55  
56  import org.apache.commons.lang.StringUtils;
57  
58  
59  /**
60   * Implementation of {@link IDilaValidationService}
61   */
62  public class DilaValidationService implements IDilaValidationService, Serializable
63  {
64      /** The serial ID */
65      private static final long serialVersionUID = 1670192896500470936L;
66      @Inject
67      @Named( "dilaXmlService" )
68      private IDilaXmlService _dilaXmlService;
69      @Inject
70      @Named( "dilaLocalService" )
71      private IDilaLocalService _dilaLocalService;
72  
73      /**
74       * {@inheritDoc}
75       */
76      @Override
77      public String validateLocalFolder( LocalFolderDTO folderBean, List<LocalFolderLinkDTO> listLinks )
78      {
79          String errorKeyTheme = this.validateRootTheme( folderBean );
80          String errorKeyLinkedFolder = this.validateLinkedFolder( folderBean );
81          String errorKeyLinks = this.validateLinks( folderBean, listLinks );
82  
83          if ( StringUtils.isNotBlank( errorKeyTheme ) )
84          {
85              return errorKeyTheme;
86          }
87          else if ( StringUtils.isNotBlank( errorKeyLinkedFolder ) )
88          {
89              return errorKeyLinkedFolder;
90          }
91          else if ( StringUtils.isNotBlank( errorKeyLinks ) )
92          {
93              return errorKeyLinks;
94          }
95          else if ( StringUtils.isBlank( folderBean.getLocalDTO( ).getAuthor( ) )
96                  || StringUtils.isBlank( folderBean.getLocalDTO( ).getTitle( ) )
97                  || StringUtils.isBlank( folderBean.getPresentation( ) ) )
98          {
99              return Messages.MANDATORY_FIELDS;
100         }
101 
102         return null;
103     }
104 
105     /**
106      * {@inheritDoc}
107      */
108     @Override
109     public String validateLocalCard( LocalCardDTO cardBean, List<LocalCardChapterDTO> listChapters )
110     {
111         String errorKeyRootFolder = this.validateRootFolder( cardBean, cardBean.getParentFolderId( ) );
112         String errorKeyLinkedCard = this.validateLinkedCard( cardBean, cardBean.getSiblingCardId( ) );
113         String errorKeyChapters = this.validateChapters( listChapters );
114 
115         if ( StringUtils.isNotBlank( errorKeyRootFolder ) )
116         {
117             return errorKeyRootFolder;
118         }
119         else if ( StringUtils.isNotBlank( errorKeyLinkedCard ) )
120         {
121             return errorKeyLinkedCard;
122         }
123         else if ( StringUtils.isNotBlank( errorKeyChapters ) )
124         {
125             return errorKeyChapters;
126         }
127         else if ( StringUtils.isBlank( cardBean.getLocalDTO( ).getAuthor( ) )
128                 || StringUtils.isBlank( cardBean.getLocalDTO( ).getTitle( ) ) )
129         {
130             return Messages.MANDATORY_FIELDS;
131         }
132 
133         return null;
134     }
135 
136     /**
137      * {@inheritDoc}
138      */
139     @Override
140     public String validateRootTheme( LocalFolderDTO folderBean )
141     {
142         String errorKey = null;
143 
144         folderBean.getLocalDTO( ).setBreadCrumb( null );
145         folderBean.setParentThemeTitle( null );
146 
147         if ( StringUtils.isBlank( folderBean.getParentThemeId( ) ) || ( folderBean.getParentThemeId( ).length( ) > 255 ) )
148         {
149             return "dila.create_fichelocale.error.themeParentVide";
150         }
151         else if ( folderBean.getParentThemeId( ).startsWith( "N" ) )
152         {
153             // Search in XML folder
154             List<String> availableTypes = new ArrayList<String>( );
155 
156             availableTypes.add( ResourceTypeEnum.THEME.getLabel( ) );
157             availableTypes.add( ResourceTypeEnum.SUBTHEME.getLabel( ) );
158 
159             XmlDTO xml = _dilaXmlService.findByIdAndTypesAndAudience( folderBean.getParentThemeId( ), availableTypes,
160                     folderBean.getLocalDTO( ).getIdAudience( ) );
161 
162             if ( xml != null )
163             {
164                 folderBean.getLocalDTO( ).setBreadCrumb( xml.getBreadCrumb( ) + ";" + xml.getIdXml( ) );
165                 folderBean.setParentThemeTitle( xml.getTitle( ) );
166             }
167         }
168 
169         if ( folderBean.getLocalDTO( ).getBreadCrumb( ) == null )
170         {
171             errorKey = "dila.create_fichelocale.error.themeIntrouvable";
172         }
173 
174         return errorKey;
175     }
176 
177     /**
178      * {@inheritDoc}
179      */
180     @Override
181     public String validateLinkedFolder( LocalFolderDTO folderBean )
182     {
183         String errorKey = null;
184         String linkedFolderTitle = null;
185 
186         if ( StringUtils.isNotBlank( folderBean.getSiblingFolderId( ) ) )
187         {
188             if ( StringUtils.isNumeric( folderBean.getSiblingFolderId( ) ) )
189             {
190                 // Search in local folder
191                 linkedFolderTitle = _dilaLocalService.findTitleByIdAndTypeAndAudience( Long.valueOf( folderBean
192                         .getSiblingFolderId( ) ), DilaLocalTypeEnum.FOLDER.getId( ), folderBean.getLocalDTO( )
193                         .getIdAudience( ) );
194             }
195             else if ( !folderBean.getSiblingFolderId( ).startsWith( "F" ) )
196             {
197                 // Search in XML folder
198                 List<String> availableTypes = new ArrayList<String>( );
199                 availableTypes.add( ResourceTypeEnum.FOLDER.getLabel( ) );
200 
201                 linkedFolderTitle = _dilaXmlService.findTitleByIdAndTypesAndAudience( folderBean.getSiblingFolderId( ),
202                         availableTypes, folderBean.getLocalDTO( ).getIdAudience( ) );
203             }
204 
205             if ( StringUtils.isBlank( linkedFolderTitle ) )
206             {
207                 errorKey = "dila.create_fichelocale.error.dossierIntrouvable";
208             }
209             else
210             {
211                 folderBean.setSiblingFolderTitle( linkedFolderTitle );
212             }
213         }
214 
215         return errorKey;
216     }
217 
218     /**
219      * {@inheritDoc}
220      */
221     @Override
222     public String validateRootFolder( LocalCardDTO cardBean, String strId )
223     {
224         String errorKey = null;
225         String strTitle = null;
226 
227         if ( StringUtils.isBlank( cardBean.getParentFolderId( ) ) || ( cardBean.getParentFolderId( ).length( ) > 255 ) )
228         {
229             return "dila.create_fichelocale.error.dossierParentVide";
230         }
231 
232         if ( StringUtils.isNumeric( cardBean.getParentFolderId( ) ) )
233         {
234             // Search in local folder
235             LocalDTO rootFolder = _dilaLocalService
236                     .findLocalByIdAndTypeAndAudience( Long.valueOf( cardBean.getParentFolderId( ) ),
237                             DilaLocalTypeEnum.FOLDER.getId( ), cardBean.getLocalDTO( ).getIdAudience( ) );
238 
239             if ( rootFolder != null )
240             {
241                 cardBean.getLocalParentFolder( ).setLocalDTO( rootFolder );
242                 strTitle = rootFolder.getTitle( );
243             }
244         }
245         else if ( !cardBean.getParentFolderId( ).startsWith( "F" ) )
246         {
247             // Search in XML folder
248             List<String> availableTypes = new ArrayList<String>( );
249             availableTypes.add( ResourceTypeEnum.FOLDER.getLabel( ) );
250 
251             XmlDTO rootXML = _dilaXmlService.findByIdAndTypesAndAudience( cardBean.getParentFolderId( ),
252                     availableTypes, cardBean.getLocalDTO( ).getIdAudience( ) );
253 
254             if ( rootXML != null )
255             {
256                 cardBean.setNationalParentFolder( rootXML );
257                 strTitle = rootXML.getTitle( );
258             }
259             else
260             {
261                 errorKey = "dila.create_fichelocale.error.dossierIntrouvable";
262             }
263         }
264 
265         if ( ( cardBean.getLocalParentFolder( ).getLocalDTO( ).getId( ) == null )
266                 && ( cardBean.getNationalParentFolder( ).getIdXml( ) == null ) )
267         {
268             errorKey = "dila.create_fichelocale.error.dossierIntrouvable";
269         }
270 
271         cardBean.setParentFolderTitle( strTitle );
272 
273         return errorKey;
274     }
275 
276     /**
277      * {@inheritDoc}
278      */
279     @Override
280     public String validateLinkCard( LocalFolderDTO folderBean, String strId, LocalFolderLinkDTO link )
281     {
282         String errorKey = null;
283 
284         if ( StringUtils.isEmpty( strId ) || ( strId.length( ) > 255 ) )
285         {
286             errorKey = Messages.MANDATORY_FIELDS;
287         }
288         else
289         {
290             String linkCardTitle = null;
291 
292             if ( StringUtils.isNumeric( strId ) )
293             {
294                 // Search in local folder
295                 linkCardTitle = _dilaLocalService.findTitleByIdAndTypeAndAudience( Long.valueOf( strId ),
296                         DilaLocalTypeEnum.CARD.getId( ), folderBean.getLocalDTO( ).getIdAudience( ) );
297             }
298             else if ( strId.startsWith( "F" ) )
299             {
300                 // Search in XML folder
301                 List<String> availableTypes = new ArrayList<String>( );
302                 availableTypes.add( ResourceTypeEnum.CARD.getLabel( ) );
303 
304                 linkCardTitle = _dilaXmlService.findTitleByIdAndTypesAndAudience( strId, availableTypes, folderBean
305                         .getLocalDTO( ).getIdAudience( ) );
306             }
307 
308             if ( StringUtils.isBlank( linkCardTitle ) )
309             {
310                 errorKey = "dila.create_fichelocale.error.ficheSoeurIntrouvable";
311             }
312 
313             link.setCardTitle( linkCardTitle );
314         }
315 
316         return errorKey;
317     }
318 
319     /**
320      * {@inheritDoc}
321      */
322     @Override
323     public String validateLinkedCard( LocalCardDTO cardBean, String strId )
324     {
325         String errorKey = null;
326         String linkedCardTitle = null;
327 
328         if ( !StringUtils.isBlank( cardBean.getSiblingCardId( ) ) )
329         {
330             if ( StringUtils.isNumeric( cardBean.getSiblingCardId( ) ) )
331             {
332                 // Search in local folder
333                 linkedCardTitle = _dilaLocalService.findTitleByIdAndTypeAndAudience( Long.valueOf( cardBean
334                         .getSiblingCardId( ) ), DilaLocalTypeEnum.CARD.getId( ), cardBean.getLocalDTO( )
335                         .getIdAudience( ) );
336             }
337             else if ( cardBean.getSiblingCardId( ).startsWith( "F" ) )
338             {
339                 // Search in XML folder
340                 List<String> availableTypes = new ArrayList<String>( );
341                 availableTypes.add( ResourceTypeEnum.CARD.getLabel( ) );
342 
343                 linkedCardTitle = _dilaXmlService.findTitleByIdAndTypesAndAudience( cardBean.getSiblingCardId( ),
344                         availableTypes, cardBean.getLocalDTO( ).getIdAudience( ) );
345             }
346 
347             if ( StringUtils.isBlank( linkedCardTitle ) )
348             {
349                 // The linked card doesn't exist
350                 errorKey = "dila.create_fichelocale.error.ficheSoeurIntrouvable";
351             }
352 
353             cardBean.setSiblingCardTitle( linkedCardTitle );
354         }
355 
356         return errorKey;
357     }
358 
359     /**
360      * Check if links are valid
361      * @param folderBean the fodler to validate
362      * @param listLinks list to validate
363      * @return error key or null
364      */
365     private String validateLinks( LocalFolderDTO folderBean, List<LocalFolderLinkDTO> listLinks )
366     {
367         for ( LocalFolderLinkDTO link : listLinks )
368         {
369             if ( StringUtils.isEmpty( link.getTitle( ) ) || StringUtils.isEmpty( link.getCardId( ) ) )
370             {
371                 // All fields are not filled
372                 return Messages.MANDATORY_FIELDS;
373             }
374 
375             if ( StringUtils.isNotBlank( this.validateLinkCard( folderBean, link.getCardId( ), link ) ) )
376             {
377                 // The linked card doesn't exist
378                 return "dila.create_fichelocale.error.ficheSoeurIntrouvable";
379             }
380         }
381 
382         return null;
383     }
384 
385     /**
386      * Check if chapters are valid
387      * @param listChapters list of chapters
388      * @return error key or null
389      */
390     private String validateChapters( List<LocalCardChapterDTO> listChapters )
391     {
392         for ( LocalCardChapterDTO chapter : listChapters )
393         {
394             if ( StringUtils.isEmpty( chapter.getTitle( ) ) || StringUtils.isEmpty( chapter.getContent( ) ) )
395             {
396                 // All fields are not filled
397                 return Messages.MANDATORY_FIELDS;
398             }
399         }
400 
401         return null;
402     }
403 }