1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portal.upload;
16  
17  import com.liferay.portal.kernel.log.Log;
18  import com.liferay.portal.kernel.log.LogFactoryUtil;
19  import com.liferay.portal.kernel.upload.UploadServletRequest;
20  import com.liferay.portal.kernel.util.GetterUtil;
21  import com.liferay.portal.util.PropsUtil;
22  import com.liferay.util.SystemProperties;
23  
24  import java.io.File;
25  import java.io.IOException;
26  
27  import java.util.ArrayList;
28  import java.util.Collections;
29  import java.util.Enumeration;
30  import java.util.HashMap;
31  import java.util.LinkedHashMap;
32  import java.util.List;
33  import java.util.Map;
34  
35  import javax.servlet.ServletInputStream;
36  import javax.servlet.http.HttpServletRequest;
37  import javax.servlet.http.HttpServletRequestWrapper;
38  
39  import org.apache.commons.fileupload.FileUploadException;
40  import org.apache.commons.fileupload.servlet.ServletFileUpload;
41  
42  /**
43   * <a href="UploadServletRequestImpl.java.html"><b><i>View Source</i></b></a>
44   *
45   * @author Brian Wing Shun Chan
46   * @author Zongliang Li
47   * @author Harry Mark
48   */
49  public class UploadServletRequestImpl
50      extends HttpServletRequestWrapper implements UploadServletRequest {
51  
52      public static final long DEFAULT_SIZE_MAX = GetterUtil.getLong(
53          PropsUtil.get(UploadServletRequestImpl.class.getName() + ".max.size"));
54  
55      public static final File DEFAULT_TEMP_DIR = new File(
56          GetterUtil.getString(PropsUtil.get(
57              UploadServletRequestImpl.class.getName() + ".temp.dir"),
58          SystemProperties.get(SystemProperties.TMP_DIR)));
59  
60      public UploadServletRequestImpl(HttpServletRequest request) {
61          super(request);
62  
63          _params = new LinkedHashMap<String, LiferayFileItem[]>();
64  
65          try {
66              ServletFileUpload servletFileUpload = new LiferayFileUpload(
67                  new LiferayFileItemFactory(DEFAULT_TEMP_DIR), request);
68  
69              servletFileUpload.setSizeMax(DEFAULT_SIZE_MAX);
70  
71              _lsr = new LiferayServletRequest(request);
72  
73              List<LiferayFileItem> list = servletFileUpload.parseRequest(_lsr);
74  
75              for (LiferayFileItem fileItem : list) {
76                  if (fileItem.isFormField()) {
77                      fileItem.setString(request.getCharacterEncoding());
78                  }
79  
80                  LiferayFileItem[] fileItems = _params.get(
81                      fileItem.getFieldName());
82  
83                  if (fileItems == null) {
84                      fileItems = new LiferayFileItem[] {fileItem};
85                  }
86                  else {
87                      LiferayFileItem[] newFileItems =
88                          new LiferayFileItem[fileItems.length + 1];
89  
90                      System.arraycopy(
91                          fileItems, 0, newFileItems, 0, fileItems.length);
92  
93                      newFileItems[newFileItems.length - 1] = fileItem;
94  
95                      fileItems = newFileItems;
96                  }
97  
98                  _params.put(fileItem.getFieldName(), fileItems);
99              }
100         }
101         catch (FileUploadException fue) {
102             _log.error(fue, fue);
103         }
104     }
105 
106     public void cleanUp() {
107         if ((_params != null) && !_params.isEmpty()) {
108             for (LiferayFileItem[] fileItems : _params.values()) {
109                 for (int i = 0; i < fileItems.length; i++) {
110                     fileItems[i].delete();
111                 }
112             }
113         }
114     }
115 
116     public String getContentType(String name) {
117         LiferayFileItem[] fileItems = _params.get(name);
118 
119         if ((fileItems != null) && (fileItems.length > 0)) {
120             return fileItems[0].getContentType();
121         }
122         else {
123             return null;
124         }
125     }
126 
127     public File getFile(String name) {
128         if (getFileName(name) == null) {
129             return null;
130         }
131 
132         LiferayFileItem[] fileItems = _params.get(name);
133 
134         if ((fileItems != null) && (fileItems.length > 0)) {
135             return fileItems[0].getStoreLocation();
136         }
137         else {
138             return null;
139         }
140     }
141 
142     public String getFileName(String name) {
143         LiferayFileItem[] fileItems = _params.get(name);
144 
145         if ((fileItems != null) && (fileItems.length > 0)) {
146             return fileItems[0].getFileName();
147         }
148         else {
149             return null;
150         }
151     }
152 
153     public String getFullFileName(String name) {
154         LiferayFileItem[] fileItems = _params.get(name);
155 
156         if ((fileItems != null) && (fileItems.length > 0)) {
157             return fileItems[0].getFullFileName();
158         }
159         else {
160             return null;
161         }
162     }
163 
164     public ServletInputStream getInputStream() throws IOException {
165         return _lsr.getInputStream();
166     }
167 
168     public Map<String, LiferayFileItem[]> getMultipartParameterMap() {
169         return _params;
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 Boolean isFormField(String name) {
250         LiferayFileItem[] fileItems = _params.get(name);
251 
252         if ((fileItems != null) && (fileItems.length > 0)) {
253             return new Boolean(fileItems[0].isFormField());
254         }
255         else {
256             return null;
257         }
258     }
259 
260     private static Log _log = LogFactoryUtil.getLog(
261         UploadServletRequestImpl.class);
262 
263     private LiferayServletRequest _lsr;
264     private Map<String, LiferayFileItem[]> _params;
265 
266 }