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