1   /**
2    * Copyright (c) 2000-2007 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.util.servlet;
24  
25  import com.liferay.portal.kernel.util.GetterUtil;
26  import com.liferay.util.SystemProperties;
27  import com.liferay.util.servlet.fileupload.LiferayFileItem;
28  import com.liferay.util.servlet.fileupload.LiferayFileItemFactory;
29  import com.liferay.util.servlet.fileupload.LiferayFileUpload;
30  import com.liferay.util.servlet.fileupload.LiferayServletRequest;
31  
32  import java.io.File;
33  import java.io.IOException;
34  
35  import java.util.ArrayList;
36  import java.util.Collections;
37  import java.util.Enumeration;
38  import java.util.HashMap;
39  import java.util.Iterator;
40  import java.util.LinkedHashMap;
41  import java.util.List;
42  import java.util.Map;
43  
44  import javax.servlet.ServletInputStream;
45  import javax.servlet.http.HttpServletRequest;
46  import javax.servlet.http.HttpServletRequestWrapper;
47  
48  import org.apache.commons.fileupload.FileUploadException;
49  import org.apache.commons.fileupload.servlet.ServletFileUpload;
50  import org.apache.commons.logging.Log;
51  import org.apache.commons.logging.LogFactory;
52  
53  /**
54   * <a href="UploadServletRequest.java.html"><b><i>View Source</i></b></a>
55   *
56   * @author Brian Wing Shun Chan
57   * @author Zongliang Li
58   * @author Harry Mark
59   *
60   */
61  public class UploadServletRequest extends HttpServletRequestWrapper {
62  
63      public static final int DEFAULT_SIZE_MAX = GetterUtil.getInteger(
64          SystemProperties.get(
65              UploadServletRequest.class.getName() + ".max.size"));
66  
67      public static final File DEFAULT_TEMP_DIR = new File(
68          GetterUtil.getString(
69              SystemProperties.get(
70                  UploadServletRequest.class.getName() + ".temp.dir"),
71              SystemProperties.get(SystemProperties.TMP_DIR)));
72  
73      public UploadServletRequest(HttpServletRequest req)
74          throws IOException {
75  
76          super(req);
77  
78          _params = new LinkedHashMap();
79  
80          try {
81              ServletFileUpload servletFileUpload = new LiferayFileUpload(
82                  new LiferayFileItemFactory(DEFAULT_TEMP_DIR), req);
83  
84              servletFileUpload.setSizeMax(DEFAULT_SIZE_MAX);
85  
86              _lsr = new LiferayServletRequest(req);
87  
88              List list = servletFileUpload.parseRequest(_lsr);
89  
90              for (int i = 0; i < list.size(); i++) {
91                  LiferayFileItem fileItem = (LiferayFileItem)list.get(i);
92  
93                  if (fileItem.isFormField()) {
94                      fileItem.setString(req.getCharacterEncoding());
95                  }
96  
97                  LiferayFileItem[] fileItems =
98                      (LiferayFileItem[])_params.get(fileItem.getFieldName());
99  
100                 if (fileItems == null) {
101                     fileItems = new LiferayFileItem[] {fileItem};
102                 }
103                 else {
104                     LiferayFileItem[] newFileItems =
105                         new LiferayFileItem[fileItems.length + 1];
106 
107                     System.arraycopy(
108                         fileItems, 0, newFileItems, 0, fileItems.length);
109 
110                     newFileItems[newFileItems.length - 1] = fileItem;
111 
112                     fileItems = newFileItems;
113                 }
114 
115                 _params.put(fileItem.getFieldName(), fileItems);
116             }
117         }
118         catch (FileUploadException fue) {
119             _log.error(fue.getMessage());
120         }
121     }
122 
123     public String getContentType(String name) {
124         LiferayFileItem[] fileItems = (LiferayFileItem[])_params.get(name);
125 
126         if ((fileItems != null) && (fileItems.length > 0)) {
127             return fileItems[0].getContentType();
128         }
129         else {
130             return null;
131         }
132     }
133 
134     public File getFile(String name) {
135         if (getFileName(name) == null) {
136             return null;
137         }
138 
139         LiferayFileItem[] fileItems = (LiferayFileItem[])_params.get(name);
140 
141         if ((fileItems != null) && (fileItems.length > 0)) {
142             return fileItems[0].getStoreLocation();
143         }
144         else {
145             return null;
146         }
147     }
148 
149     public String getFileName(String name) {
150         LiferayFileItem[] fileItems = (LiferayFileItem[])_params.get(name);
151 
152         if ((fileItems != null) && (fileItems.length > 0)) {
153             return fileItems[0].getFileName();
154         }
155         else {
156             return null;
157         }
158     }
159 
160     public String getFullFileName(String name) {
161         LiferayFileItem[] fileItems = (LiferayFileItem[])_params.get(name);
162 
163         if ((fileItems != null) && (fileItems.length > 0)) {
164             return fileItems[0].getFullFileName();
165         }
166         else {
167             return null;
168         }
169     }
170 
171     public ServletInputStream getInputStream() throws IOException {
172         return _lsr.getInputStream();
173     }
174 
175     public String getParameter(String name) {
176         LiferayFileItem[] fileItems = (LiferayFileItem[])_params.get(name);
177 
178         if ((fileItems != null) && (fileItems.length > 0)) {
179             return fileItems[0].getString();
180         }
181         else {
182             return super.getParameter(name);
183         }
184     }
185 
186     public Map getParameterMap() {
187         Map map = new HashMap();
188 
189         Enumeration enu = getParameterNames();
190 
191         while (enu.hasMoreElements()) {
192             String name = (String)enu.nextElement();
193 
194             map.put(name, getParameterValues(name));
195         }
196 
197         return map;
198     }
199 
200     public Enumeration getParameterNames() {
201         List parameterNames = new ArrayList();
202 
203         Enumeration enu = super.getParameterNames();
204 
205         while (enu.hasMoreElements()) {
206             String name = (String)enu.nextElement();
207 
208             if (!_params.containsKey(name)) {
209                 parameterNames.add(name);
210             }
211         }
212 
213         Iterator itr = _params.keySet().iterator();
214 
215         while (itr.hasNext()) {
216             String name = (String)itr.next();
217 
218             parameterNames.add(name);
219         }
220 
221         return Collections.enumeration(parameterNames);
222     }
223 
224     public String[] getParameterValues(String name) {
225         String[] parentValues = super.getParameterValues(name);
226 
227         LiferayFileItem[] fileItems = (LiferayFileItem[])_params.get(name);
228 
229         if ((fileItems == null) || (fileItems.length == 0)) {
230             return parentValues;
231         }
232         else if ((parentValues == null) || (parentValues.length == 0)) {
233             String[] values = new String[fileItems.length];
234 
235             for (int i = 0; i < values.length; i++) {
236                 values[i] = fileItems[i].getString();
237             }
238 
239             return values;
240         }
241         else {
242             String[] values = new String[
243                 parentValues.length + fileItems.length];
244 
245             System.arraycopy(
246                 parentValues, 0, values, 0, parentValues.length);
247 
248             for (int i = parentValues.length; i < values.length; i++) {
249                 values[i] = fileItems[i - parentValues.length].getString();
250             }
251 
252             return values;
253         }
254     }
255 
256     public Map getMultipartParameterMap() {
257         return _params;
258     }
259 
260     public Boolean isFormField(String name) {
261         LiferayFileItem[] fileItems = (LiferayFileItem[])_params.get(name);
262 
263         if ((fileItems != null) && (fileItems.length > 0)) {
264             return new Boolean(fileItems[0].isFormField());
265         }
266         else {
267             return null;
268         }
269     }
270 
271     public void cleanUp() {
272         if ((_params != null) && !_params.isEmpty()) {
273             Iterator itr = _params.values().iterator();
274 
275             while (itr.hasNext()) {
276                 LiferayFileItem[] fileItems = (LiferayFileItem[])itr.next();
277 
278                 for (int i = 0; i < fileItems.length; i++) {
279                     fileItems[i].delete();
280                 }
281             }
282         }
283     }
284 
285     private static Log _log = LogFactory.getLog(UploadServletRequest.class);
286 
287     private LiferayServletRequest _lsr;
288     private Map _params;
289 
290 }