View Javadoc
1   /*
2    * Copyright (c) 2002-2022, City of 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  /**
35   *
36   */
37  package fr.paris.lutece.plugins.genericattributes.service.entrytype;
38  
39  import java.util.List;
40  import java.util.Locale;
41  import java.util.Objects;
42  
43  import javax.servlet.http.HttpServletRequest;
44  
45  import org.apache.commons.lang3.StringUtils;
46  
47  import fr.paris.lutece.plugins.genericattributes.business.Entry;
48  import fr.paris.lutece.plugins.genericattributes.business.Field;
49  import fr.paris.lutece.plugins.genericattributes.business.FieldHome;
50  import fr.paris.lutece.plugins.genericattributes.business.GenericAttributeError;
51  import fr.paris.lutece.plugins.genericattributes.business.IMapProvider;
52  import fr.paris.lutece.plugins.genericattributes.business.MandatoryError;
53  import fr.paris.lutece.plugins.genericattributes.business.MapProviderManager;
54  import fr.paris.lutece.plugins.genericattributes.business.Response;
55  import fr.paris.lutece.plugins.genericattributes.util.GenericAttributesUtils;
56  import fr.paris.lutece.portal.service.i18n.I18nService;
57  import fr.paris.lutece.portal.service.message.AdminMessage;
58  import fr.paris.lutece.portal.service.message.AdminMessageService;
59  import fr.paris.lutece.portal.service.util.AppPropertiesService;
60  import fr.paris.lutece.util.ReferenceList;
61  
62  /**
63   * @author bass
64   *
65   */
66  public abstract class AbstractEntryTypeGeolocation extends EntryTypeService
67  {
68  
69      /** The Constant PARAMETER_MAP_PROVIDER. */
70      public static final String PARAMETER_MAP_PROVIDER = "map_provider";
71  
72      /** The Constant PARAMETER_EDIT_MODE. */
73      public static final String PARAMETER_EDIT_MODE = "edit_mode";
74  
75      /** The Constant PARAMETER_VIEW_NUMBER. */
76      public static final String PARAMETER_VIEW_NUMBER = "view_number";
77  
78      /** The Constant PARAMETER_SUFFIX_ID_ADDRESS. */
79      public static final String PARAMETER_SUFFIX_ID_ADDRESS = "_idAddress";
80  
81      /** The Constant PARAMETER_SUFFIX_ADDRESS. */
82      public static final String PARAMETER_SUFFIX_ADDRESS = "_address";
83  
84      /** The Constant PARAMETER_SUFFIX_ADDITIONAL_ADDRESS. */
85      public static final String PARAMETER_SUFFIX_ADDITIONAL_ADDRESS = "_additional_address";
86  
87      /** The Constant PARAMETER_SUFFIX_X_ADDRESS. */
88      public static final String PARAMETER_SUFFIX_X = "_x";
89  
90      /** The Constant PARAMETER_SUFFIX_Y_ADDRESS. */
91      public static final String PARAMETER_SUFFIX_Y = "_y";
92  
93      /** The Constant PARAMETER_SUFFIX_GEOMETRY. */
94      public static final String PARAMETER_SUFFIX_GEOMETRY = "_geometry";
95      /**
96       * The Constant PARAMETER_PREFIX_ITERATION.
97       */
98      public static final String PARAMETER_PREFIX_ITERATION = "nIt";
99  
100     /**
101      * The Constant PARAMETER_NUMBER_ITERATION.
102      */
103     public static final String PARAMETER_NUMBER_ITERATION = "number_iteration_geolocation";
104 
105     /**
106      * The Constant ATTRIBUTE_LAST_ITERATION_GEOLOCATION.
107      */
108     public static final String ATTRIBUTE_LAST_ITERATION_GEOLOCATION = "last_iteration_geolocation";
109 
110     private static final String MESSAGE_SPECIFY_BOTH_X_AND_Y = "genericattributes.message.specifyBothXAndY";
111     public static final String PARAMETER_EDIT_MODE_LIST = "gismap.edit.mode.list";
112     
113     public static final String PROPERTY_ENTRY_TYPE_GEOLOCALISATION_EXPORT_WITH_FIELD_NAME = "genericattributes.entrytype.geolocalisation.export.field.name";
114 
115     /**
116      * {@inheritDoc}
117      */
118     @Override
119     public String getRequestData( Entry entry, HttpServletRequest request, Locale locale )
120     {
121         initCommonRequestData( entry, request );
122         String strTitle = request.getParameter( PARAMETER_TITLE );
123         String strCode = request.getParameter( PARAMETER_ENTRY_CODE );
124         String strHelpMessage = ( request.getParameter( PARAMETER_HELP_MESSAGE ) != null ) ? request.getParameter( PARAMETER_HELP_MESSAGE ).trim( ) : null;
125         String strComment = request.getParameter( PARAMETER_COMMENT );
126         String strMandatory = request.getParameter( PARAMETER_MANDATORY );
127         String strMapProvider = request.getParameter( PARAMETER_MAP_PROVIDER );
128         String strEditMode = request.getParameter( PARAMETER_EDIT_MODE );
129         String strViewNumber = request.getParameter( PARAMETER_VIEW_NUMBER );
130         String strCSSClass = request.getParameter( PARAMETER_CSS_CLASS );
131         String strIndexed = request.getParameter( PARAMETER_INDEXED );
132         String strFieldError = StringUtils.EMPTY;
133 
134         if ( StringUtils.isBlank( strTitle ) )
135         {
136             strFieldError = ERROR_FIELD_TITLE;
137         }
138 
139         if ( StringUtils.isNotBlank( strFieldError ) )
140         {
141             Object [ ] tabRequiredFields = {
142                     I18nService.getLocalizedString( strFieldError, locale )
143             };
144 
145             return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
146         }
147 
148         /**
149          * we need 10 fields : 1 for map provider, 1 for id address, 1 for label address, 1 for x address, 1 for y address, 1 for id geographical object, 1 for
150          * description geographical object, 1 for centroid geographical object, 1 for label geographical object and 1 for thematic geographical object
151          **/
152         createOrUpdateProviderField( entry, strMapProvider );
153         GenericAttributesUtils.createOrUpdateField( entry, FIELD_EDIT_MODE, null, strEditMode );
154         GenericAttributesUtils.createOrUpdateField( entry, FIELD_VIEW_NUMBER, null, strViewNumber );
155         GenericAttributesUtils.createOrUpdateField( entry, FIELD_ID_ADDRESS, null, FIELD_ID_ADDRESS );
156         GenericAttributesUtils.createOrUpdateField( entry, FIELD_ADDRESS, null, FIELD_ADDRESS );
157         GenericAttributesUtils.createOrUpdateField( entry, FIELD_ADDITIONAL_ADDRESS, null, FIELD_ADDITIONAL_ADDRESS );
158         GenericAttributesUtils.createOrUpdateField( entry, FIELD_X, null, FIELD_X );
159         GenericAttributesUtils.createOrUpdateField( entry, FIELD_Y, null, FIELD_Y );
160         GenericAttributesUtils.createOrUpdateField( entry, FIELD_GEOMETRY, null, FIELD_GEOMETRY );
161 
162         entry.setTitle( strTitle );
163         entry.setHelpMessage( strHelpMessage );
164         entry.setComment( strComment );
165         entry.setCSSClass( strCSSClass );
166         entry.setIndexed( strIndexed != null );
167         entry.setMandatory( strMandatory != null );
168         entry.setCode( strCode );
169         return null;
170     }
171 
172     private void createOrUpdateProviderField( Entry entry, String fieldValue )
173     {
174         Field field = entry.getFieldByCode( FIELD_PROVIDER );
175         if ( field == null )
176         {
177             entry.getFields( ).add( buildFieldMapProvider( entry, fieldValue ) );
178         }
179         else
180         {
181             Field newProvider = buildFieldMapProvider( entry, fieldValue );
182             field.setValue( newProvider.getValue( ) );
183         }
184     }
185 
186     /**
187      * {@inheritDoc}
188      */
189     @Override
190     public GenericAttributeError getResponseData(Entry entry, HttpServletRequest request, List<Response> listResponse, Locale locale) {
191         Integer maxIterationGeolocation = 0;
192         Integer lastIterationGeolocation = 0;
193         Integer iterationNumberToSave = 0;
194 
195         if (request.getSession().getAttribute(ATTRIBUTE_LAST_ITERATION_GEOLOCATION) != null) {
196             lastIterationGeolocation = (Integer) request.getSession().getAttribute(ATTRIBUTE_LAST_ITERATION_GEOLOCATION);
197             request.getSession().setAttribute(ATTRIBUTE_LAST_ITERATION_GEOLOCATION, lastIterationGeolocation + 1);
198             lastIterationGeolocation = lastIterationGeolocation + 1;
199         } else {
200             request.getSession().setAttribute(ATTRIBUTE_LAST_ITERATION_GEOLOCATION, 0);
201         }
202         if (request.getParameter(PARAMETER_NUMBER_ITERATION) != null) {
203             maxIterationGeolocation = Integer.parseInt(request.getParameter(PARAMETER_NUMBER_ITERATION));
204             iterationNumberToSave = lastIterationGeolocation;
205         } else {
206             iterationNumberToSave = -1;
207         }
208         String prefixIteration = PARAMETER_PREFIX_ITERATION + lastIterationGeolocation + "_" + IEntryTypeService.PREFIX_ATTRIBUTE + entry.getIdEntry();
209 
210         String strIdAddressValue = request.getParameter(prefixIteration + PARAMETER_SUFFIX_ID_ADDRESS);
211 
212         String strAddressValue = request.getParameter(prefixIteration + PARAMETER_SUFFIX_ADDRESS);
213         String strAdditionalAddressValue = request.getParameter(prefixIteration + entry.getIdEntry() + PARAMETER_SUFFIX_ADDITIONAL_ADDRESS);
214         String strXValue = request.getParameter(prefixIteration + PARAMETER_SUFFIX_X);
215         String strYValue = request.getParameter(prefixIteration + PARAMETER_SUFFIX_Y);
216         String strGeometryValue = request.getParameter(prefixIteration + PARAMETER_SUFFIX_GEOMETRY);
217 
218         Field fieldIdAddress = entry.getFieldByCode(FIELD_ID_ADDRESS);
219         Field fieldAddress = entry.getFieldByCode(FIELD_ADDRESS);
220         Field fieldAdditionalAddress = entry.getFieldByCode(FIELD_ADDITIONAL_ADDRESS);
221         Field fieldX = entry.getFieldByCode(FIELD_X);
222         Field fieldY = entry.getFieldByCode(FIELD_Y);
223         Field fieldGeometry = entry.getFieldByCode(FIELD_GEOMETRY);
224 
225         /**
226          * Create the field "idAddress" in case the field does not exist in the database.
227          */
228         if (fieldIdAddress == null) {
229             fieldIdAddress = GenericAttributesUtils.createOrUpdateField(entry, FIELD_ID_ADDRESS, null, FIELD_ID_ADDRESS);
230             FieldHome.create(fieldIdAddress);
231         }
232 
233         // 1 : Response Id Address
234         if (strIdAddressValue != null) {
235             Responsettributes/business/Response.html#Response">Response responseIdAddress = new Response();
236             responseIdAddress.setEntry(entry);
237             responseIdAddress.setResponseValue(strIdAddressValue);
238             responseIdAddress.setField(fieldIdAddress);
239             responseIdAddress.setToStringValueResponse(strIdAddressValue);
240             responseIdAddress.setIterationNumber(iterationNumberToSave);
241             listResponse.add(responseIdAddress);
242             // take this value of the request
243 
244         }
245 
246         // 2 : Response Address
247         if (strAddressValue != null) {
248             Responsecattributes/business/Response.html#Response">Response responseAddress = new Response();
249             responseAddress.setEntry(entry);
250             responseAddress.setResponseValue(strAddressValue);
251             responseAddress.setField(fieldAddress);
252             responseAddress.setToStringValueResponse(strAddressValue);
253             responseAddress.setIterationNumber(iterationNumberToSave);
254             listResponse.add(responseAddress);
255         }
256 
257         // 3 : Response Additional Address
258         if (strAdditionalAddressValue != null) {
259             Responses/business/Response.html#Response">Response responseAdditionalAddress = new Response();
260             responseAdditionalAddress.setEntry(entry);
261             responseAdditionalAddress.setResponseValue(strAdditionalAddressValue);
262             responseAdditionalAddress.setField(fieldAdditionalAddress);
263             responseAdditionalAddress.setToStringValueResponse(strAdditionalAddressValue);
264             responseAdditionalAddress.setIterationNumber(iterationNumberToSave);
265             listResponse.add(responseAdditionalAddress);
266         }
267         // 4 : Response X
268         if (strXValue != null) {
269             Responsegenericattributes/business/Response.html#Response">Response responseX = new Response();
270             responseX.setEntry(entry);
271             responseX.setResponseValue(strXValue);
272             responseX.setField(fieldX);
273             responseX.setToStringValueResponse(strXValue);
274             responseX.setIterationNumber(iterationNumberToSave);
275             listResponse.add(responseX);
276         }
277 
278         // 5: Response Y
279         if (strXValue != null) {
280             Responsegenericattributes/business/Response.html#Response">Response responseY = new Response();
281             responseY.setEntry(entry);
282             responseY.setResponseValue(strYValue);
283             responseY.setField(fieldY);
284             responseY.setToStringValueResponse(strYValue);
285             responseY.setIterationNumber(iterationNumberToSave);
286             listResponse.add(responseY);
287         }
288 
289         // 6 : Response Desc Geo
290         if (strGeometryValue != null) {
291             Responseattributes/business/Response.html#Response">Response responseGeomerty = new Response();
292             responseGeomerty.setEntry(entry);
293             responseGeomerty.setResponseValue(strGeometryValue);
294             responseGeomerty.setField(fieldGeometry);
295             responseGeomerty.setToStringValueResponse(strGeometryValue);
296             responseGeomerty.setIterationNumber(iterationNumberToSave);
297             listResponse.add(responseGeomerty);
298         }
299 
300 
301         if (entry.isMandatory() && StringUtils.isBlank(strAddressValue)) {
302             return new MandatoryError(entry, locale);
303         }
304 
305         if (((StringUtils.isBlank(strXValue) && StringUtils.isNotBlank(strYValue))
306                 || (StringUtils.isNotBlank(strXValue) && StringUtils.isBlank(strYValue))) && StringUtils.isBlank(strAddressValue)) {
307             GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError();
308 
309             error.setMandatoryError(entry.isMandatory());
310             error.setTitleQuestion(entry.getTitle());
311             error.setErrorMessage(MESSAGE_SPECIFY_BOTH_X_AND_Y);
312 
313             return error;
314         }
315         if (request.getSession().getAttribute(ATTRIBUTE_LAST_ITERATION_GEOLOCATION) != null) {
316             if (lastIterationGeolocation >= maxIterationGeolocation) {
317                 request.getSession().removeAttribute(ATTRIBUTE_LAST_ITERATION_GEOLOCATION);
318             }
319         }
320         return super.getResponseData(entry, request, listResponse, locale);
321     }
322 
323     /**
324      * {@inheritDoc}
325      */
326     @Override
327     public String getResponseValueForRecap( Entry entry, HttpServletRequest request, Response response, Locale locale )
328     {
329         if ( response.getField( ) != null )
330         {
331             String strCode = response.getField( ).getCode( );
332 
333             if ( FIELD_ADDRESS.equals( strCode ) )
334             {
335                 return response.getResponseValue( );
336             }
337         }
338 
339         return StringUtils.EMPTY;
340     }
341 
342     /**
343      * Returns the available map providers
344      * 
345      * @return all known map providers
346      */
347     public List<IMapProvider> getMaproviders( )
348     {
349         return MapProviderManager.getMapProvidersList( );
350     }
351 
352     /**
353      * Builds the {@link ReferenceList} of all available map providers
354      * 
355      * @return the {@link ReferenceList}
356      */
357     public ReferenceList getMapProvidersRefList( )
358     {
359         ReferenceList refList = new ReferenceList( );
360 
361         refList.addItem( StringUtils.EMPTY, StringUtils.EMPTY );
362 
363         for ( IMapProvider mapProvider : MapProviderManager.getMapProvidersList( ) )
364         {
365             refList.add( mapProvider.toRefItem( ) );
366         }
367 
368         return refList;
369     }
370 
371     /**
372      * Builds the {@link ReferenceList} of all available edit mode
373      * 
374      * @return the {@link ReferenceList}
375      */
376     public ReferenceList getEditModeRefList( )
377     {
378         String strEditModeListProperty = AppPropertiesService.getProperty( PARAMETER_EDIT_MODE_LIST );
379         ReferenceList refList = new ReferenceList( );
380         refList.addItem( StringUtils.EMPTY, StringUtils.EMPTY );
381 
382         if ( strEditModeListProperty != null )
383         {
384             String [ ] strEditModeListPropertyArray = strEditModeListProperty.split( "," );
385 
386             for ( int i = 0; i < strEditModeListPropertyArray.length; i++ )
387             {
388                 refList.addItem( strEditModeListPropertyArray [i], strEditModeListPropertyArray [i] );
389             }
390         }
391 
392         return refList;
393     }
394 
395     /**
396      *
397      * {@inheritDoc}
398      */
399     @Override
400     public String getResponseValueForExport( Entry entry, HttpServletRequest request, Response response, Locale locale )
401     {
402         String result = StringUtils.EMPTY;
403 
404         boolean isExportWithFieldName = AppPropertiesService.getPropertyBoolean( PROPERTY_ENTRY_TYPE_GEOLOCALISATION_EXPORT_WITH_FIELD_NAME, true );
405 
406         if ( isExportWithFieldName && response.getField( ) != null )
407         {
408             result = Objects.toString( response.getField( ).getCode( ) ) +  GenericAttributesUtils.CONSTANT_EQUAL;
409         }
410         result += response.getResponseValue( );
411         return result;
412     }
413 
414     // PRIVATE METHODS
415 
416     /**
417      * Builds the field map provider.
418      * 
419      * @param entry
420      *            The entry
421      * @param strMapProvider
422      *            the map provider
423      * @return the field
424      */
425     private Field buildFieldMapProvider( Entry entry, String strMapProvider )
426     {
427         Fieldricattributes/business/Field.html#Field">Field fieldMapProvider = new Field( );
428         fieldMapProvider.setCode( FIELD_PROVIDER );
429 
430         if ( StringUtils.isNotBlank( strMapProvider ) )
431         {
432             String strTrimedMapProvider = strMapProvider.trim( );
433             fieldMapProvider.setValue( strTrimedMapProvider );
434         }
435         else
436         {
437             fieldMapProvider.setValue( StringUtils.EMPTY );
438         }
439 
440         fieldMapProvider.setParentEntry( entry );
441 
442         return fieldMapProvider;
443     }
444 }