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