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.identitystore.modules.cnicertifier.service;
35
36 import com.fasterxml.jackson.databind.JsonNode;
37 import com.fasterxml.jackson.databind.ObjectMapper;
38 import fr.paris.lutece.plugins.identitystore.modules.cnicertifier.business.CNI;
39 import fr.paris.lutece.plugins.identitystore.modules.cnicertifier.business.ScanOutput;
40 import fr.paris.lutece.portal.service.i18n.I18nService;
41 import fr.paris.lutece.portal.service.util.AppPropertiesService;
42 import fr.paris.lutece.util.httpaccess.HttpAccess;
43 import fr.paris.lutece.util.httpaccess.HttpAccessException;
44 import java.io.IOException;
45 import java.util.Locale;
46 import java.util.Map;
47 import org.apache.commons.fileupload.FileItem;
48
49
50
51
52 public class ScannerService
53 {
54
55 private static final String ERROR_DOCUMENT_EXTRACTION_FAILED = "DOCUMENT_EXTRACTION_FAILED";
56
57
58 private static final String ERROR_IMAGE_IMPROVEMENT_FAILED = "IMAGE_IMPROVEMENT_FAILED";
59
60
61 private static final String ERROR_IMG_SIZE_TOO_SMALL = "IMG_SIZE_TOO_SMALL";
62
63
64 private static final String ERROR_INCONSISTENT_OCR_MRZ = "INCONSISTENT_OCR_MRZ";
65
66
67 private static final String ERROR_INVALID_BIRTHDATE_CHECKSUM = "INVALID_BIRTHDATE_CHECKSUM";
68
69
70 private static final String ERROR_INVALID_EMIT_CHECKSUM = "INVALID_EMIT_CHECKSUM";
71
72
73 private static final String ERROR_INVALID_FILE_TYPE = "INVALID_FILE_TYPE";
74
75
76 private static final String ERROR_INVALID_GLOBAL_CHECKSUM = "INVALID_GLOBAL_CHECKSUM";
77
78
79 private static final String ERROR_INVALID_LINE0_LENGTH = "INVALID_LINE0_LENGTH";
80
81
82 private static final String ERROR_INVALID_LINE1_LENGTH = "INVALID_LINE1_LENGTH";
83
84
85 private static final String ERROR_INVALID_MRZ_ID = "INVALID_MRZ_ID";
86
87
88 private static final String ERROR_INVALID_MRZ_LINES_COUNT = "INVALID_MRZ_LINES_COUNT";
89
90
91 private static final String ERROR_INVALID_MRZ_SEX = "INVALID_MRZ_SEX";
92
93
94 private static final String ERROR_MISSING_IMAGE_FILE = "MISSING_IMAGE_FILE";
95
96
97 private static final String ERROR_MRZ_EXTRACTION_FAILED = "MRZ_EXTRACTION_FAILED";
98
99
100 private static final String ERROR_ZONES_LOCATION_FAILED = "ZONES_LOCATION_FAILED";
101
102 private static final String PROPERTY_SCANNER_URL = "identitystore-cnicertifier.scannerUrl";
103
104 private static final String MESSAGE_IMG_SIZE_TOO_SMALL= "module.identitystore.cnicertifier.message.imageSizeTooSmall";
105 private static final String MESSAGE_CHECK_FAILED = "module.identitystore.cnicertifier.message.checkFailed";
106 private static final String MESSAGE_SCAN_FAILED = "module.identitystore.cnicertifier.message.scanFailed";
107 private static final String MESSAGE_FILE_MISSING = "module.identitystore.cnicertifier.message.fileMissing";
108 private static final String MESSAGE_INVALID_FILE_TYPE = "module.identitystore.cnicertifier.message.invalidFileType";
109
110 private static ObjectMapper _mapper = new ObjectMapper( );
111 private static ScannerResponseStatusValidator _validator = new ScannerResponseStatusValidator();
112
113
114
115
116
117
118
119
120
121
122 public static CNI scan( Map<String, FileItem> mapFileItems ) throws ScannerException, HttpAccessException
123 {
124 HttpAccess client = new HttpAccess( _validator );
125
126 String strURL = AppPropertiesService.getProperty( PROPERTY_SCANNER_URL );
127 String strResponse = client.doPostMultiPart( strURL, null, mapFileItems );
128 CNI cni = parse( strResponse );
129 return cni;
130 }
131
132
133
134
135
136
137
138
139
140
141 public static CNI parse( String strJSON ) throws ScannerException
142 {
143 CNI cni = null;
144
145 try
146 {
147 JsonNode nodeRoot = _mapper.readTree( strJSON );
148 JsonNode nodeData = nodeRoot.get( "data" );
149
150 if( nodeData != null )
151 {
152 String strDataJSON = nodeData.toString( );
153 ScanOutput scan = _mapper.readValue( strDataJSON, ScanOutput.class );
154 cni = new CNI( scan );
155 }
156 else
157 {
158 String strCode = getField( nodeRoot , "code" );
159 String strException = getField( nodeRoot , "exception" );
160 String strMessage = getField( nodeRoot , "message" );
161 String strUserMessage = handleError( strCode );
162 throw new ScannerException( strMessage , strCode , strException , strUserMessage );
163 }
164 }
165 catch( IOException ex )
166 {
167 throw new ScannerException( ex.getMessage( ) );
168 }
169 return cni;
170 }
171
172
173
174
175
176
177 private static String handleError( String strCode )
178 {
179 if( ERROR_IMG_SIZE_TOO_SMALL.equals( strCode ))
180 {
181 return I18nService.getLocalizedString( MESSAGE_IMG_SIZE_TOO_SMALL, Locale.FRENCH );
182 }
183 if( ERROR_INCONSISTENT_OCR_MRZ.equals( strCode) ||
184 ERROR_INVALID_BIRTHDATE_CHECKSUM.equals( strCode ) ||
185 ERROR_INVALID_EMIT_CHECKSUM.equals( strCode ) ||
186 ERROR_INVALID_GLOBAL_CHECKSUM.equals( strCode ) ||
187 ERROR_INVALID_MRZ_ID.equals( strCode ) ||
188 ERROR_INVALID_MRZ_LINES_COUNT.equals( strCode ) ||
189 ERROR_INVALID_MRZ_SEX.equals( strCode ))
190 {
191 return I18nService.getLocalizedString( MESSAGE_CHECK_FAILED, Locale.FRENCH );
192 }
193
194 if( ERROR_MRZ_EXTRACTION_FAILED.equals( strCode ) ||
195 ERROR_DOCUMENT_EXTRACTION_FAILED.equals( strCode ) ||
196 ERROR_MRZ_EXTRACTION_FAILED.equals( strCode ) ||
197 ERROR_IMAGE_IMPROVEMENT_FAILED.equals( strCode ) ||
198 ERROR_INVALID_LINE0_LENGTH.equals( strCode ) ||
199 ERROR_INVALID_LINE1_LENGTH.equals( strCode ) ||
200 ERROR_ZONES_LOCATION_FAILED.equals( strCode ))
201 {
202 return I18nService.getLocalizedString( MESSAGE_SCAN_FAILED, Locale.FRENCH );
203 }
204
205 if( ERROR_INVALID_FILE_TYPE.equals( strCode ) )
206 {
207 return I18nService.getLocalizedString( MESSAGE_INVALID_FILE_TYPE, Locale.FRENCH );
208 }
209
210 if( ERROR_MISSING_IMAGE_FILE.equals( strCode ))
211 {
212 return I18nService.getLocalizedString( MESSAGE_FILE_MISSING, Locale.FRENCH );
213 }
214
215 return I18nService.getLocalizedString( MESSAGE_SCAN_FAILED, Locale.FRENCH );
216 }
217
218
219
220
221
222
223
224 private static String getField( JsonNode nodeRoot, String strField )
225 {
226 JsonNode node = nodeRoot.get( strField );
227 return ( node != null ) ? node.asText() : "";
228 }
229 }