1   /**
2    * Copyright (c) 2000-2008 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.LinkedHashMap;
40  import java.util.List;
41  import java.util.Map;
42  
43  import javax.servlet.ServletInputStream;
44  import javax.servlet.http.HttpServletRequest;
45  import javax.servlet.http.HttpServletRequestWrapper;
46  
47  import org.apache.commons.fileupload.FileUploadException;
48  import org.apache.commons.fileupload.servlet.ServletFileUpload;
49  import org.apache.commons.logging.Log;
50  import org.apache.commons.logging.LogFactory;
51  
52  /**
53   * <a href="UploadServletRequest.java.html"><b><i>View Source</i></b></a>
54   *
55   * @author Brian Wing Shun Chan
56   * @author Zongliang Li
57   * @author Harry Mark
58   *
59   */
60  public class UploadServletRequest extends HttpServletRequestWrapper {
61  
62      public static final int DEFAULT_SIZE_MAX = GetterUtil.getInteger(
63          SystemProperties.get(
64              UploadServletRequest.class.getName() + ".max.size"));
65  
66      public static final File DEFAULT_TEMP_DIR = new File(
67          GetterUtil.getString(
68              SystemProperties.get(
69                  UploadServletRequest.class.getName() + ".temp.dir"),
70              SystemProperties.get(SystemProperties.TMP_DIR)));
71  
72      public UploadServletRequest(HttpServletRequest req)
73          throws IOException {
74  
75          super(req);
76  
77          _params = new LinkedHashMap<String, LiferayFileItem[]>();
78  
79          try {
80              ServletFileUpload servletFileUpload = new LiferayFileUpload(
81                  new LiferayFileItemFactory(DEFAULT_TEMP_DIR), req);
82  
83              servletFileUpload.setSizeMax(DEFAULT_SIZE_MAX);
84  
85              _lsr = new LiferayServletRequest(req);
86  
87              List<LiferayFileItem> list = servletFileUpload.parseRequest(_lsr);
88  
89              for (LiferayFileItem fileItem : list) {
90                  if (fileItem.isFormField()) {
91                      fileItem.setString(req.getCharacterEncoding());
92                  }
93  
94                  LiferayFileItem[] fileItems =
95                      _params.get(fileItem.getFieldName());
96  
97                  if (fileItems == null) {
98                      fileItems = new LiferayFileItem[] {fileItem};
99                  }
100                 else {
101                     LiferayFileItem[] newFileItems =
102                         new LiferayFileItem[fileItems.length + 1];
103 
104                     System.arraycopy(
105                         fileItems, 0, newFileItems, 0, fileItems.length);
106 
107                     newFileItems[newFileItems.length - 1] = fileItem;
108 
109                     fileItems = newFileItems;
110                 }
111 
112                 _params.put(fileItem.getFieldName(), fileItems);
113             }
114         }
115         catch (FileUploadException fue) {
116             _log.error(fue.getMessage());
117         }
118     }
119 
120     public String getContentType(String name) {
121         LiferayFileItem[] fileItems = _params.get(name);
122 
123         if ((fileItems != null) && (fileItems.length > 0)) {
124             return fileItems[0].getContentType();
125         }
126         else {
127             return null;
128         }
129     }
130 
131     public File getFile(String name) {
132         if (getFileName(name) == null) {
133             return null;
134         }
135 
136         LiferayFileItem[] fileItems = _params.get(name);
137 
138         if ((fileItems != null) && (fileItems.length > 0)) {
139             return fileItems[0].getStoreLocation();
140         }
141         else {
142             return null;
143         }
144     }
145 
146     public String getFileName(String name) {
147         LiferayFileItem[] fileItems = _params.get(name);
148 
149         if ((fileItems != null) && (fileItems.length > 0)) {
150             return fileItems[0].getFileName();
151         }
152         else {
153             return null;
154         }
155     }
156 
157     public String getFullFileName(String name) {
158         LiferayFileItem[] fileItems = _params.get(name);
159 
160         if ((fileItems != null) && (fileItems.length > 0)) {
161             return fileItems[0].getFullFileName();
162         }
163         else {
164             return null;
165         }
166     }
167 
168     public ServletInputStream getInputStream() throws IOException {
169         return _lsr.getInputStream();
170     }
171 
172     public String getParameter(String name) {
173         LiferayFileItem[] fileItems = _params.get(name);
174 
175         if ((fileItems != null) && (fileItems.length > 0)) {
176             return fileItems[0].getString();
177         }
178         else {
179             return super.getParameter(name);
180         }
181     }
182 
183     public Map<String, String[]> getParameterMap() {
184         Map<String, String[]> map = new HashMap<String, String[]>();
185 
186         Enumeration<String> enu = getParameterNames();
187 
188         while (enu.hasMoreElements()) {
189             String name = enu.nextElement();
190 
191             map.put(name, getParameterValues(name));
192         }
193 
194         return map;
195     }
196 
197     public Enumeration<String> getParameterNames() {
198         List<String> parameterNames = new ArrayList<String>();
199 
200         Enumeration<String> enu = super.getParameterNames();
201 
202         while (enu.hasMoreElements()) {
203             String name = enu.nextElement();
204 
205             if (!_params.containsKey(name)) {
206                 parameterNames.add(name);
207             }
208         }
209 
210         for (String name : _params.keySet()) {
211             parameterNames.add(name);
212         }
213 
214         return Collections.enumeration(parameterNames);
215     }
216 
217     public String[] getParameterValues(String name) {
218         String[] parentValues = super.getParameterValues(name);
219 
220         LiferayFileItem[] fileItems = _params.get(name);
221 
222         if ((fileItems == null) || (fileItems.length == 0)) {
223             return parentValues;
224         }
225         else if ((parentValues == null) || (parentValues.length == 0)) {
226             String[] values = new String[fileItems.length];
227 
228             for (int i = 0; i < values.length; i++) {
229                 values[i] = fileItems[i].getString();
230             }
231 
232             return values;
233         }
234         else {
235             String[] values = new String[
236                 parentValues.length + fileItems.length];
237 
238             System.arraycopy(
239                 parentValues, 0, values, 0, parentValues.length);
240 
241             for (int i = parentValues.length; i < values.length; i++) {
242                 values[i] = fileItems[i - parentValues.length].getString();
243             }
244 
245             return values;
246         }
247     }
248 
249     public Map<String, LiferayFileItem[]> getMultipartParameterMap() {
250         return _params;
251     }
252 
253     public Boolean isFormField(String name) {
254         LiferayFileItem[] fileItems = _params.get(name);
255 
256         if ((fileItems != null) && (fileItems.length > 0)) {
257             return new Boolean(fileItems[0].isFormField());
258         }
259         else {
260             return null;
261         }
262     }
263 
264     public void cleanUp() {
265         if ((_params != null) && !_params.isEmpty()) {
266             for (LiferayFileItem[] fileItems : _params.values()) {
267                 for (int i = 0; i < fileItems.length; i++) {
268                     fileItems[i].delete();
269                 }
270             }
271         }
272     }
273 
274     private static Log _log = LogFactory.getLog(UploadServletRequest.class);
275 
276     private LiferayServletRequest _lsr;
277     private Map<String, LiferayFileItem[]> _params;
278 
279 }