1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.plugins.genericattributes.service.entrytype;
35
36 import java.util.List;
37 import java.util.Locale;
38 import java.util.stream.Collectors;
39
40 import javax.servlet.http.HttpServletRequest;
41
42 import org.apache.commons.lang3.StringUtils;
43
44 import com.google.i18n.phonenumbers.NumberParseException;
45 import com.google.i18n.phonenumbers.PhoneNumberUtil;
46 import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
47 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
48
49 import fr.paris.lutece.plugins.genericattributes.business.Entry;
50 import fr.paris.lutece.plugins.genericattributes.business.Field;
51 import fr.paris.lutece.plugins.genericattributes.business.GenericAttributeError;
52 import fr.paris.lutece.plugins.genericattributes.business.MandatoryError;
53 import fr.paris.lutece.plugins.genericattributes.business.Response;
54 import fr.paris.lutece.plugins.genericattributes.util.GenericAttributesUtils;
55 import fr.paris.lutece.portal.service.i18n.I18nService;
56 import fr.paris.lutece.portal.service.message.AdminMessage;
57 import fr.paris.lutece.portal.service.message.AdminMessageService;
58 import fr.paris.lutece.portal.service.util.AppPropertiesService;
59 import fr.paris.lutece.util.string.StringUtil;
60
61
62
63
64 public abstract class AbstractEntryTypeTelephoneNumber extends EntryTypeService
65 {
66
67 private static final String PARAMETER_AUTOCOMPLETE = "autocomplete";
68 private static final String PARAMETER_DEFAULT_REGION = "defaultRegion";
69 private static final String FIELD_AUTOCOMPLETE = "autocomplete";
70 public static final String FIELD_DEFAULT_REGION = "defaultRegion";
71 private static final String MESSAGE_ERROR_PHONENUMBER = "genericattributes.message.error.phonenumber";
72 private static final String MESSAGE_UNKNOWN_DEFAULT_REGION = "genericattributes.message.error.unknown.default.region";
73 private static final String PROPERTY_DEFAULT_DEFAULT_REGION = "genericattributes.telephoneNumber.default.default.region";
74
75 @Override
76 public String getRequestData( Entry entry, HttpServletRequest request, Locale locale )
77 {
78 initCommonRequestData( entry, request );
79 String strTitle = request.getParameter( PARAMETER_TITLE );
80 String strCode = request.getParameter( PARAMETER_ENTRY_CODE );
81 String strHelpMessage = ( request.getParameter( PARAMETER_HELP_MESSAGE ) != null ) ? request.getParameter( PARAMETER_HELP_MESSAGE ).trim( ) : null;
82 String strComment = request.getParameter( PARAMETER_COMMENT );
83 String strMandatory = request.getParameter( PARAMETER_MANDATORY );
84 String strErrorMessage = request.getParameter( PARAMETER_ERROR_MESSAGE );
85 String strCSSClass = request.getParameter( PARAMETER_CSS_CLASS );
86 String strOnlyDisplayInBack = request.getParameter( PARAMETER_ONLY_DISPLAY_IN_BACK );
87 String strIndexed = request.getParameter( PARAMETER_INDEXED );
88 String strAutocomplete = request.getParameter( PARAMETER_AUTOCOMPLETE );
89 String strDefaultRegion = request.getParameter( PARAMETER_DEFAULT_REGION );
90 String strPlaceholder = request.getParameter( PARAMETER_PLACEHOLDER );
91
92 String strFieldError = StringUtils.EMPTY;
93
94 if ( StringUtils.isBlank( strTitle ) )
95 {
96 strFieldError = ERROR_FIELD_TITLE;
97 }
98
99 if ( StringUtils.isNotBlank( strFieldError ) )
100 {
101 Object [ ] tabRequiredFields = {
102 I18nService.getLocalizedString( strFieldError, locale )
103 };
104
105 return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELD, tabRequiredFields, AdminMessage.TYPE_STOP );
106 }
107
108 entry.setCode( strCode );
109 entry.setTitle( strTitle );
110 entry.setHelpMessage( strHelpMessage );
111 entry.setComment( strComment );
112 entry.setCSSClass( strCSSClass );
113
114 Field fieldAutocomplete = GenericAttributesUtils.createOrUpdateField( entry, FIELD_AUTOCOMPLETE, null, null );
115 if ( StringUtils.isNotBlank( strAutocomplete ) )
116 {
117 fieldAutocomplete.setValue( strAutocomplete.trim( ) );
118 }
119 Field fieldDefaultRegion = GenericAttributesUtils.createOrUpdateField( entry, FIELD_DEFAULT_REGION, null, null );
120 if ( StringUtils.isNotBlank( strDefaultRegion ) )
121 {
122 if ( !PhoneNumberUtil.getInstance( ).getSupportedRegions( ).contains( strDefaultRegion ) )
123 {
124 return AdminMessageService.getMessageUrl( request, MESSAGE_UNKNOWN_DEFAULT_REGION, new Object [ ] {
125 strDefaultRegion
126 }, AdminMessage.TYPE_STOP );
127 }
128 fieldDefaultRegion.setValue( strDefaultRegion );
129 }
130 else
131 {
132 fieldDefaultRegion.setValue( getDefaultDefaultRegion( ) );
133 }
134
135 GenericAttributesUtils.createOrUpdateField( entry, FIELD_PLACEHOLDER, null, strPlaceholder != null ? strPlaceholder : StringUtils.EMPTY );
136
137 entry.setMandatory( strMandatory != null );
138 entry.setErrorMessage( strErrorMessage );
139 entry.setOnlyDisplayInBack( strOnlyDisplayInBack != null );
140 entry.setIndexed( strIndexed != null );
141
142 return null;
143
144 }
145
146 @Override
147 public GenericAttributeError getResponseData( Entry entry, HttpServletRequest request, List<Response> listResponse, Locale locale )
148 {
149 String strValueEntry = StringUtils.defaultString( request.getParameter( PREFIX_ATTRIBUTE + entry.getIdEntry( ) ) ).trim( );
150 Response/genericattributes/business/Response.html#Response">Response response = new Response( );
151 response.setEntry( entry );
152 response.setIterationNumber( getResponseIterationValue( request ) );
153 listResponse.add( response );
154
155 response.setResponseValue( strValueEntry );
156
157 if ( StringUtils.isNotBlank( response.getResponseValue( ) ) )
158 {
159 PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance( );
160 PhoneNumber number;
161 try
162 {
163 number = phoneUtil.parse( strValueEntry, entry.getFieldByCode( FIELD_DEFAULT_REGION ).getValue( ) );
164 }
165 catch( NumberParseException e )
166 {
167 String strKeyErrorMessage;
168 switch( e.getErrorType( ) )
169 {
170 case INVALID_COUNTRY_CODE:
171 case NOT_A_NUMBER:
172 case TOO_LONG:
173 case TOO_SHORT_AFTER_IDD:
174 case TOO_SHORT_NSN:
175 strKeyErrorMessage = MESSAGE_ERROR_PHONENUMBER + "." + e.getErrorType( ).name( );
176 break;
177 default:
178 strKeyErrorMessage = MESSAGE_ERROR_PHONENUMBER;
179 break;
180 }
181 GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
182 error.setMandatoryError( false );
183 error.setTitleQuestion( entry.getTitle( ) );
184 error.setErrorMessage( I18nService.getLocalizedString( strKeyErrorMessage, request.getLocale( ) ) );
185
186 return error;
187 }
188 if ( !phoneUtil.isValidNumber( number ) )
189 {
190 GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
191 error.setMandatoryError( false );
192 error.setTitleQuestion( entry.getTitle( ) );
193 error.setErrorMessage( I18nService.getLocalizedString( MESSAGE_ERROR_PHONENUMBER, request.getLocale( ) ) );
194
195 return error;
196 }
197
198 response.setResponseValue( phoneUtil.format( number, PhoneNumberFormat.E164 ) );
199
200 response.setToStringValueResponse( getResponseValueForRecap( entry, request, response, locale ) );
201 }
202 else
203 {
204 response.setToStringValueResponse( StringUtils.EMPTY );
205 }
206
207
208 if ( StringUtil.containsXssCharacters( strValueEntry ) )
209 {
210 GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
211 error.setMandatoryError( false );
212 error.setTitleQuestion( entry.getTitle( ) );
213 error.setErrorMessage( I18nService.getLocalizedString( MESSAGE_XSS_FIELD, request.getLocale( ) ) );
214
215 return error;
216 }
217
218 if ( entry.isMandatory( ) && StringUtils.isBlank( strValueEntry ) )
219 {
220 if ( StringUtils.isNotEmpty( entry.getErrorMessage( ) ) )
221 {
222 GenericAttributeErrortributes/business/GenericAttributeError.html#GenericAttributeError">GenericAttributeError error = new GenericAttributeError( );
223 error.setMandatoryError( true );
224 error.setErrorMessage( entry.getErrorMessage( ) );
225
226 return error;
227 }
228
229 return new MandatoryError( entry, locale );
230 }
231
232 return null;
233
234 }
235
236
237
238
239
240
241
242 @Override
243 public String getResponseValueForExport( Entry entry, HttpServletRequest request, Response response, Locale locale )
244 {
245
246 return response.getResponseValue( );
247 }
248
249
250
251
252
253
254
255 @Override
256 public String getResponseValueForRecap( Entry entry, HttpServletRequest request, Response response, Locale locale )
257 {
258 PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance( );
259 PhoneNumber number;
260 try
261 {
262 number = phoneUtil.parse( response.getResponseValue( ), entry.getFieldByCode( FIELD_DEFAULT_REGION ).getValue( ) );
263 if ( "FR".equals( phoneUtil.getRegionCodeForNumber( number ) ) )
264 {
265 return phoneUtil.format( number, PhoneNumberFormat.NATIONAL );
266 }
267 return phoneUtil.format( number, PhoneNumberFormat.INTERNATIONAL );
268 }
269 catch( NumberParseException e )
270 {
271 return null;
272 }
273 }
274
275
276
277
278
279
280 public List<String> getSupportedRegionCodes( )
281 {
282 return PhoneNumberUtil.getInstance( ).getSupportedRegions( ).stream( ).sorted( ).collect( Collectors.toList( ) );
283 }
284
285
286
287
288
289
290 public String getDefaultDefaultRegion( )
291 {
292 return AppPropertiesService.getProperty( PROPERTY_DEFAULT_DEFAULT_REGION, "FR" );
293 }
294 }