1 package fr.paris.lutece.plugins.documentimport.web;
2
3 import java.io.IOException;
4 import java.io.InputStreamReader;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.HashMap;
8 import java.util.List;
9 import java.util.Map;
10
11 import javax.servlet.http.HttpServletRequest;
12
13 import org.apache.commons.fileupload.FileItem;
14
15 import au.com.bytecode.opencsv.CSVReader;
16 import fr.paris.lutece.pligins.documentimport.service.DocumentimportService;
17 import fr.paris.lutece.plugin.documentimport.business.DocumentAttributHome;
18 import fr.paris.lutece.plugins.document.business.Document;
19 import fr.paris.lutece.plugins.document.business.DocumentType;
20 import fr.paris.lutece.plugins.document.business.DocumentTypeHome;
21 import fr.paris.lutece.plugins.document.business.attributes.DocumentAttribute;
22 import fr.paris.lutece.plugins.document.business.spaces.DocumentSpaceHome;
23 import fr.paris.lutece.plugins.document.utils.IntegerUtils;
24 import fr.paris.lutece.plugins.documentimport.util.DocumentImport;
25 import fr.paris.lutece.plugins.documentimport.util.DocumentimporError;
26 import fr.paris.lutece.plugins.documentimport.util.DocumentimportUtils;
27 import fr.paris.lutece.portal.service.admin.AccessDeniedException;
28 import fr.paris.lutece.portal.service.fileupload.FileUploadService;
29 import fr.paris.lutece.portal.service.i18n.I18nService;
30 import fr.paris.lutece.portal.service.message.AdminMessage;
31 import fr.paris.lutece.portal.service.message.AdminMessageService;
32 import fr.paris.lutece.portal.service.template.AppTemplateService;
33 import fr.paris.lutece.portal.service.util.AppLogService;
34 import fr.paris.lutece.portal.service.util.AppPathService;
35 import fr.paris.lutece.portal.service.util.AppPropertiesService;
36 import fr.paris.lutece.portal.util.mvc.admin.MVCAdminJspBean;
37 import fr.paris.lutece.portal.util.mvc.admin.annotations.Controller;
38 import fr.paris.lutece.portal.util.mvc.commons.annotations.Action;
39 import fr.paris.lutece.portal.util.mvc.commons.annotations.View;
40 import fr.paris.lutece.portal.web.admin.PluginAdminPageJspBean;
41 import fr.paris.lutece.portal.web.upload.MultipartHttpServletRequest;
42 import fr.paris.lutece.util.ReferenceItem;
43 import fr.paris.lutece.util.ReferenceList;
44 import fr.paris.lutece.util.filesystem.FileSystemUtil;
45 import fr.paris.lutece.util.html.HtmlTemplate;
46
47
48
49
50
51 public class DocumentimportJspBean extends PluginAdminPageJspBean{
52
53
54 private static final long serialVersionUID = 1L;
55
56
57 public static final String RIGHT_MANAGEDOCUMENTIMPORT = "DOCUMENTIMPORT_MANAGEMENT";
58 protected static final String PARAMETER_PAGE_INDEX = "page_index";
59 protected static final String MARK_PAGINATOR = "paginator";
60 protected static final String MARK_NB_ITEMS_PER_PAGE = "nb_items_per_page";
61 private static final String MARK_STR_ERROR = "str_error";
62 private static final String MARK_STR_WARNING = "str_warning";
63 private static final String MARK_STR_ERROR_COUNT_LINE = "str_nbr_error";
64 private static final String MARK_STR_COUNT_LINE = "str_nbr_line";
65 private static final String MARK_STR_WARNING_COUNT_LINE = "str_nbr_warning";
66
67
68 protected int _nDefaultItemsPerPage;
69 protected String _strCurrentPageIndex;
70 protected int _nItemsPerPage;
71
72
73 private static final String PARAMETER_FILE_IMPORT = "file_import";
74 private static final String PARAMETER_CODE_DOCUMENT = "codeDocument";
75 private static final String PARAMETER_SPACE_DOCUMENT = "spaceDocument";
76 private static final String PARAMETER_ID_TYPE_DOCUMENT = DocumentimportUtils.PARAMETER_ID_TYPE_DOCUMENT;
77
78 private static final String FIELD_FILE_IMPORT = "documentimport.import_document_record.label_file";
79
80
81 private static final String MESSAGE_MANDATORY_FIELD = "documentimport.message.mandatory.field";
82 private static final String MESSAGE_ERROR_CSV_FILE_IMPORT = "documentimport.message.error_csv_file_import";
83 private static final String MESSAGE_ERROR_CSV_NUMBER_SEPARATOR = "documentimport.message.error.number.separartor";
84 private static final String MESSAGE_ERROR_CSV_HEAD = "documentimport.message.error.csv.head";
85 private static final String MESSAGE_ERROR_SEPACE = "documentimport.message.space.error";
86 private static final String MESSAGE_ERROR_DUPLICATE_DOC = "documentimport.message.duplicate.document";
87
88 private static final String PROPERTY_IMPORT_CSV_DELIMITER = "documentimport.import.csv.delimiter";
89 private static final String PROPERTY_ERROR_LINE = "documentimport.import_document.error.line";
90
91
92 private static final String CONSTANT_EXTENSION_CSV_FILE = ".csv";
93 private static final String CONSTANT_MIME_TYPE_CSV = "application/csv";
94 private static final String CONSTANT_MIME_TYPE_TEXT_CSV = "text/csv";
95 private static final String CONSTANT_MIME_TYPE_OCTETSTREAM = "application/octet-stream";
96
97
98 private static final String JSP_SUMMRY_IMPORT = "jsp/admin/plugins/documentimport/SummryImportCsv.jsp";
99 private static final String TEMPLATE_SUMMRY_IMPORT ="admin/plugins/documentimport/summrydocumentimport.html";
100
101
102 public DocumentimporError documentError= new DocumentimporError();
103
104
105
106
107
108
109
110
111 public String getSummryImportFile( HttpServletRequest request )
112 {
113 Map<String, Object> model = new HashMap<String, Object>( );
114
115 if(documentError.getError() != null || documentError.getWarning() != null){
116 model.put( MARK_STR_ERROR, documentError.getError( ).toString( ) );
117 model.put( MARK_STR_WARNING, documentError.getWarning().toString( ) );
118 model.put( MARK_STR_COUNT_LINE, documentError.getCountLine() );
119 model.put( MARK_STR_ERROR_COUNT_LINE, documentError.getCountLineFailure() );
120 model.put( MARK_STR_WARNING_COUNT_LINE, documentError.getCountWarning());
121 }
122
123
124 HtmlTemplate templateList = AppTemplateService.getTemplate( TEMPLATE_SUMMRY_IMPORT, getLocale( ), model );
125
126 return getAdminPage( templateList.getHtml( ) );
127 }
128
129
130
131
132
133
134
135
136 public String doImportDocument( HttpServletRequest request )
137 throws AccessDeniedException
138 {
139
140 List<String> headCsvFile= new ArrayList<String>();
141 boolean firstLine= true;
142
143 String strCodeDocument = request.getParameter( PARAMETER_CODE_DOCUMENT );
144 String _strSpaceId = request.getParameter( PARAMETER_SPACE_DOCUMENT );
145
146 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
147 FileItem fileItem = multipartRequest.getFile( PARAMETER_FILE_IMPORT );
148 String strMimeType = FileSystemUtil.getMIMEType( FileUploadService.getFileNameOnly( fileItem ) );
149
150 if ( ( fileItem == null ) || ( fileItem.getName( ) == null ) ||
151 DocumentimportUtils.EMPTY_STRING.equals( fileItem.getName( ) ) )
152 {
153
154 return AdminMessageService.getMessageUrl( request, MESSAGE_MANDATORY_FIELD, AdminMessage.TYPE_STOP );
155 }
156
157 if ( ( !strMimeType.equals( CONSTANT_MIME_TYPE_CSV ) && !strMimeType.equals( CONSTANT_MIME_TYPE_OCTETSTREAM ) &&
158 !strMimeType.equals( CONSTANT_MIME_TYPE_TEXT_CSV ) ) ||
159 !fileItem.getName( ).toLowerCase( ).endsWith( CONSTANT_EXTENSION_CSV_FILE ) )
160 {
161
162 return AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_CSV_FILE_IMPORT, new String[] { "ddd" },AdminMessage.TYPE_ERROR );
163 }
164
165 String strIdTypeDocument = request.getParameter( PARAMETER_ID_TYPE_DOCUMENT );
166 int nIdTypeDocument = DocumentimportUtils.convertStringToInt( strIdTypeDocument );
167
168
169 Character strCsvSeparator = AppPropertiesService.getProperty( PROPERTY_IMPORT_CSV_DELIMITER ).charAt( 0 );
170 documentError.setError( new StringBuffer( ) );
171 documentError.setWarning( new StringBuffer( ) );
172
173 int idDocumentAttribut= DocumentAttributHome.findIdDocumentAttributs(DocumentImport.IDENTIFIANT, strCodeDocument);
174 List<String> attributValue= DocumentAttributHome.findIdDocumentAttributs(idDocumentAttribut);
175
176
177 try
178 {
179 InputStreamReader inputStreamReader = new InputStreamReader( fileItem.getInputStream( ) );
180 CSVReader csvReader = new CSVReader( inputStreamReader, strCsvSeparator, (char) 7 );
181
182 String[] nextLine;
183
184 documentError.setCountLine( 0 );
185 documentError.setCountLineFailure( 0 );
186 documentError.setCountWarning( 0 );
187 String[] requiredAttributs= getRequiredAttribut(strCodeDocument);
188
189 while ( ( nextLine = csvReader.readNext( ) ) != null )
190 {
191 documentError.setCountLine( documentError.getCountLine( ) + 1 );
192 HashMap<String,String> valueCSVfile= new HashMap<String,String> ();
193
194 if ( nextLine.length < requiredAttributs.length )
195 {
196 documentError.getError( ).append( I18nService.getLocalizedString( PROPERTY_ERROR_LINE, getLocale( ) ) );
197 documentError.getError( ).append( documentError.getCountLine( ) );
198 documentError.getError( ).append( " > " );
199 documentError.getError( )
200 .append( I18nService.getLocalizedString( MESSAGE_ERROR_CSV_NUMBER_SEPARATOR,
201 getLocale( ) ) );
202 documentError.getError( ).append( "<br/>" );
203 documentError.setCountLineFailure( documentError.getCountLineFailure( ) + 1 );
204
205
206 }
207
208
209 else
210 {
211 Document document = new Document( );
212 document.setCodeDocumentType(strCodeDocument);
213
214 document.setStateId( 1 );
215 document.setCreatorId( getUser( ).getUserId( ) );
216
217 if( firstLine){
218
219 for (String element: nextLine){
220
221 headCsvFile.add(element.trim());
222 }
223 String attributFail= checkHead( requiredAttributs, headCsvFile, request );
224 if(attributFail != null){
225
226 documentError.getError( ).append( I18nService.getLocalizedString( PROPERTY_ERROR_LINE, getLocale( ) ) );
227 documentError.getError( ).append( documentError.getCountLine( ) );
228 documentError.getError( ).append( " > " );
229 documentError.getError( )
230 .append( I18nService.getLocalizedString( MESSAGE_ERROR_CSV_NUMBER_SEPARATOR,
231 getLocale( ) ) );
232 documentError.getError( ).append( "<br/>" );
233 documentError.setCountLineFailure( documentError.getCountLineFailure( ) + 1 );
234
235 Object[] param = { attributFail };
236 return AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_CSV_HEAD, param,AdminMessage.TYPE_STOP );
237 }
238
239 firstLine= false;
240
241 }else if ( nextLine.length != headCsvFile.size() ){
242
243 documentError.getError( ).append( I18nService.getLocalizedString( PROPERTY_ERROR_LINE, getLocale( ) ) );
244 documentError.getError( ).append( documentError.getCountLine( ) );
245 documentError.getError( ).append( " > " );
246 documentError.getError( )
247 .append( I18nService.getLocalizedString( MESSAGE_ERROR_CSV_NUMBER_SEPARATOR,
248 getLocale( ) ) );
249 documentError.getError( ).append( "<br/>" );
250 documentError.setCountLineFailure( documentError.getCountLineFailure( ) + 1 );
251
252
253 }
254
255
256 else{
257
258
259
260
261 for ( int i = 0; i < nextLine.length; i++ )
262 {
263 valueCSVfile.put(headCsvFile.get(i), nextLine[i].trim());
264
265 }
266
267 int idSpace= DocumentimportService.getInstance().getIdSpace(valueCSVfile.get(DocumentImport.ARRONDISSEMENT), valueCSVfile.get(DocumentImport.THEMATIQUE));
268
269
270
271 if( idSpace == -1){
272 documentError.getError( ).append( I18nService.getLocalizedString( PROPERTY_ERROR_LINE, getLocale( ) ) );
273 documentError.getError( ).append( documentError.getCountLine( ) );
274 documentError.getError( ).append( " > " );
275 documentError.getError( )
276 .append(I18nService.getLocalizedString( MESSAGE_ERROR_SEPACE, getLocale( ) ));
277 documentError.getError( ).append( "<br/>" );
278 documentError.setCountLineFailure( documentError.getCountLineFailure( ) + 1 );
279
280 }else if(checkExistanceDoc(attributValue, valueCSVfile.get(DocumentImport.IDENTIFIANT) )){
281 documentError.getError( ).append( I18nService.getLocalizedString( PROPERTY_ERROR_LINE, getLocale( ) ) );
282 documentError.getError( ).append( documentError.getCountLine( ) );
283 documentError.getError( ).append( " > " );
284 documentError.getError( )
285 .append( I18nService.getLocalizedString(MESSAGE_ERROR_DUPLICATE_DOC, getLocale( ) ));
286 documentError.getError( ).append( "<br/>" );
287 documentError.setCountLineFailure( documentError.getCountLineFailure( ) + 1 );
288
289 }else{
290 document.setSpaceId( idSpace );
291 String succes= DocumentimportService.getInstance().getDocumentData(request, document, valueCSVfile, documentError,getLocale( ), getUser( ));
292
293 if(succes == null){
294 attributValue.add(valueCSVfile.get(DocumentImport.IDENTIFIANT));
295 }
296 }
297 }
298 }
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326 }
327
328 }
329
330
331
332 catch ( IOException e )
333 {
334 AppLogService.error( e );
335 }
336
337
338 return getJspSummryImport(request);
339 }
340
341
342
343
344
345
346
347
348 private String [] getRequiredAttribut(String codeDocumentType){
349
350
351 DocumentType documentType = DocumentTypeHome.findByPrimaryKey( codeDocumentType );
352 List<DocumentAttribute> listAttributes = documentType.getAttributes( );
353 int countRequiredAttribut= 0;
354 List<String> attributs = new ArrayList<String>();
355
356 attributs.add(DocumentImport.PARAMETER_TITLE);
357 attributs.add(DocumentImport.PARAMETER_SUMMARY);
358
359 for ( DocumentAttribute attribute : listAttributes )
360 {
361
362 if ( attribute.isRequired( ))
363 {
364 countRequiredAttribut= countRequiredAttribut +1;
365 attributs.add(attribute.getName());
366 }
367 }
368
369 String[] stockArr = new String[attributs.size()];
370 int i= 0;
371 for(Object s : attributs.toArray()){
372 stockArr[i]=(String) s;
373 i= i+1;
374 }
375
376 return stockArr ;
377 }
378
379
380
381
382
383
384
385
386
387 private String checkHead(String [] requiredAttributs, List<String> head, HttpServletRequest request){
388
389
390 for (String attribut: requiredAttributs){
391
392 if (!head.contains(attribut)) {
393
394 return attribut;
395
396 }
397 }
398 return null;
399 }
400
401
402
403
404
405
406
407 private String getJspSummryImport( HttpServletRequest request)
408 {
409
410 return AppPathService.getBaseUrl( request ) + JSP_SUMMRY_IMPORT;
411 }
412
413
414
415
416
417
418
419
420 private Boolean checkExistanceDoc(List<String> attributValue, String valueAttribut ){
421
422 if(attributValue.contains(valueAttribut))return true;
423 else return false;
424
425
426 }
427
428 }