View Javadoc
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   * Class of the StandaloneAppJspBean import document.
50   */
51  public class DocumentimportJspBean extends PluginAdminPageJspBean{
52  
53  
54  	private static final long serialVersionUID = 1L;
55  
56  	// Right
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      //Variables
68      protected int _nDefaultItemsPerPage;
69      protected String _strCurrentPageIndex;
70      protected int _nItemsPerPage;
71      
72  	//Parameters
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  	// Messages (I18n keys)
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  	//Properties
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  	// Misc
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  	 // JSP URL
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 	 //session filed
102 	 public DocumentimporError documentError= new DocumentimporError();
103 	 
104 	 
105 	 
106 	 /** get view of summry 
107 	  * get the summry of import	
108 	  * @param request
109 	  * @return summry
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 		    * Import Document
131 		    * @param request the Http Request
132 		    * @throws AccessDeniedException the {@link AccessDeniedException}
133 		    * @return The URL to go after performing the action
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 	                	//return AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_CSV_NUMBER_SEPARATOR, AdminMessage.TYPE_STOP );
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 		                	//return AdminMessageService.getMessageUrl( request, MESSAGE_ERROR_CSV_NUMBER_SEPARATOR, AdminMessage.TYPE_STOP );
253 		                }
254 	                	
255 	                	
256 	                	else{
257 	   
258 
259 	                   /* try
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 	                    catch ( DocumentimportException error )
302 	                    {
303 	                    	documentError.getError(  ).append( I18nService.getLocalizedString( PROPERTY_LINE, getLocale(  ) ) );
304 	                    	documentError.getError(  ).append( documentError.getCountLine(  ) );
305 	                    	documentError.getError(  ).append( " > " );
306 
307 	                        if ( error.isMandatoryError(  ) )
308 	                        {
309 	                            Object[] tabRequiredFields = { error.getTitleField(  ) };
310 	                            documentError.getError(  )
311 	                                         .append( I18nService.getLocalizedString( 
312 	                                        		 MESSAGE_DOCUMENT_ERROR_MANDATORY_FIELD, tabRequiredFields, getLocale(  ) ) );
313 	                        }
314 	                        else
315 	                        {
316 	                            Object[] tabRequiredFields = { error.getTitleField(  ), error.getErrorMessage(  ) };
317 	                            documentError.getError(  )
318 	                                         .append( I18nService.getLocalizedString( MESSAGE_DIRECTORY_ERROR,
319 	                                    tabRequiredFields, getLocale(  ) ) );
320 	                        }
321 
322 	                        documentError.getError(  ).append( "<br/>" );
323 	                        documentError.setCountLineFailure( documentError.getCountLineFailure(  ) + 1 );
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 	     * get attributs required
344 	     * @param codeDocumentType
345 	     * @return array of atributs
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 	     * check head csvfile
382 	     * @param requiredAttributs
383 	     * @param head
384 	     * @param request
385 	     * @return 
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 	     * return url of the jsp manage doc
404 	     * @param request The HTTP request
405 	     * @return url of the jsp manage doc
406 	     */
407 	    private String getJspSummryImport( HttpServletRequest request)
408 	    {
409 	    	
410 	        return AppPathService.getBaseUrl( request ) + JSP_SUMMRY_IMPORT;
411 	    }
412 	    
413 	    
414 	    /**
415 	     * checks whether the document exists in the database
416 	     * @param attributValue
417 	     * @param valueAttribut
418 	     * @return bool
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 }