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.lutecetools.service;
35
36 import java.util.ArrayList;
37 import java.util.Iterator;
38 import java.util.List;
39 import java.util.Locale;
40 import java.util.Map;
41 import java.util.concurrent.ConcurrentHashMap;
42
43 import javax.servlet.http.HttpServletRequest;
44 import javax.servlet.http.HttpSession;
45
46 import org.apache.commons.fileupload.FileItem;
47 import org.apache.commons.lang.StringUtils;
48
49 import fr.paris.lutece.plugins.asynchronousupload.service.AbstractAsynchronousUploadHandler;
50 import fr.paris.lutece.portal.service.i18n.I18nService;
51 import fr.paris.lutece.portal.service.util.AppException;
52 import fr.paris.lutece.util.filesystem.UploadUtil;
53
54 public class LutecetoolsAsynchronousUploadHandler extends AbstractAsynchronousUploadHandler
55 {
56
57 private static final String HANDLER_NAME = "lutecetoolsAsynchronousUploadHandler";
58 public static final String BEAN_NAME = "lutecetools.lutecetoolsAsynchronousUploadHandler";
59
60 private static final String ERROR_MESSAGE_UNKNOWN_ERROR = "lutecetools.message.unknownError";
61
62 private static Map<String, Map<String, List<FileItem>>> _mapWebtiersUpload = new ConcurrentHashMap<>( );
63
64
65
66
67
68
69
70
71
72
73
74
75
76 @Override
77 public String canUploadFiles( HttpServletRequest request, String strFieldName, List<FileItem> listFileItemsToUpload,
78 Locale locale )
79 {
80 if ( StringUtils.isNotBlank( strFieldName ) )
81 {
82 initMap( request.getSession( ).getId( ), strFieldName );
83 List<FileItem> listUploadedFileItems = getListUploadedFiles( strFieldName, request.getSession( ) );
84
85 if ( !listFileItemsToUpload.isEmpty( ) && listFileItemsToUpload.size( ) == 1
86 && listUploadedFileItems.isEmpty( )
87 && compareTo( "text/", listFileItemsToUpload.get( 0 ).getContentType( ) ) )
88 {
89 return null;
90 }
91 }
92 return I18nService.getLocalizedString( ERROR_MESSAGE_UNKNOWN_ERROR, locale );
93 }
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 @Override
109 public List<FileItem> getListUploadedFiles( String strFieldName, HttpSession session )
110 {
111 if ( StringUtils.isBlank( strFieldName ) )
112 {
113 throw new AppException( "id field name is not provided for the current file upload" );
114 }
115
116 initMap( session.getId( ), strFieldName );
117
118
119 Map<String, List<FileItem>> mapFileItemsSession = _mapWebtiersUpload.get( session.getId( ) );
120
121 return mapFileItemsSession.get( strFieldName );
122 }
123
124
125
126
127
128
129
130
131
132
133 @Override
134 public void removeFileItem( String strFieldName, HttpSession session, int nIndex )
135 {
136 List<FileItem> uploadedFiles = getListUploadedFiles( strFieldName, session );
137
138 if ( ( uploadedFiles != null ) && !uploadedFiles.isEmpty( ) && ( uploadedFiles.size( ) > nIndex ) )
139 {
140
141 FileItem fileItem = uploadedFiles.remove( nIndex );
142 fileItem.delete( );
143 }
144 }
145
146
147
148
149
150
151
152
153
154 @Override
155 public void addFileItemToUploadedFilesList( FileItem fileItem, String strFieldName, HttpServletRequest request )
156 {
157
158
159 String strFileName = UploadUtil.cleanFileName( fileItem.getName( ).trim( ) );
160
161 initMap( request.getSession( ).getId( ), strFieldName );
162
163
164 List<FileItem> uploadedFiles = getListUploadedFiles( strFieldName, request.getSession( ) );
165
166 if ( uploadedFiles != null )
167 {
168 boolean bNew = true;
169
170 if ( !uploadedFiles.isEmpty( ) )
171 {
172 Iterator<FileItem> iterUploadedFiles = uploadedFiles.iterator( );
173
174 while ( bNew && iterUploadedFiles.hasNext( ) )
175 {
176 FileItem uploadedFile = iterUploadedFiles.next( );
177 String strUploadedFileName = UploadUtil.cleanFileName( uploadedFile.getName( ).trim( ) );
178
179
180
181 bNew = !( StringUtils.equals( strUploadedFileName, strFileName )
182 && ( uploadedFile.getSize( ) == fileItem.getSize( ) ) );
183 }
184 }
185
186 if ( bNew )
187 {
188 uploadedFiles.add( fileItem );
189 }
190 }
191 }
192
193
194
195
196
197
198
199 @Override
200 public String getHandlerName( )
201 {
202 return HANDLER_NAME;
203 }
204
205
206
207
208
209
210
211 private void initMap( String strSessionId, String strFieldName )
212 {
213
214 Map<String, List<FileItem>> mapFileItemsSession = _mapWebtiersUpload.get( strSessionId );
215
216
217 if ( mapFileItemsSession == null )
218 {
219 synchronized ( this )
220 {
221
222
223 mapFileItemsSession = _mapWebtiersUpload.get( strSessionId );
224
225 if ( mapFileItemsSession == null )
226 {
227 mapFileItemsSession = new ConcurrentHashMap<>( );
228 _mapWebtiersUpload.put( strSessionId, mapFileItemsSession );
229 }
230 }
231 }
232
233 List<FileItem> listFileItems = mapFileItemsSession.get( strFieldName );
234
235 if ( listFileItems == null )
236 {
237 listFileItems = new ArrayList<>( );
238 mapFileItemsSession.put( strFieldName, listFileItems );
239 }
240 }
241
242 private boolean compareTo( String mime, String fileContent )
243 {
244
245 String s = fileContent.substring( 0, mime.length( ) );
246 return s.equals( mime );
247 }
248
249 public boolean hasFile( HttpServletRequest request, String strFieldName )
250 {
251 if ( StringUtils.isNotBlank( strFieldName ) )
252 {
253 List<FileItem> listUploadedFileItems = getListUploadedFiles( strFieldName, request.getSession( ) );
254
255 if ( !listUploadedFileItems.isEmpty( ) )
256 {
257 return true;
258 }
259 }
260 return false;
261 }
262
263 public FileItem getFile( HttpServletRequest request, String strFieldName )
264 {
265 if ( StringUtils.isNotBlank( strFieldName ) )
266 {
267 List<FileItem> listUploadedFileItems = getListUploadedFiles( strFieldName, request.getSession( ) );
268
269 if ( !listUploadedFileItems.isEmpty( ) )
270 {
271 return listUploadedFileItems.get( 0 );
272 }
273 }
274 return null;
275 }
276
277 }