1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    *
5    *
6    *
7    * The contents of this file are subject to the terms of the Liferay Enterprise
8    * Subscription License ("License"). You may not use this file except in
9    * compliance with the License. You can obtain a copy of the License by
10   * contacting Liferay, Inc. See the License for the specific language governing
11   * permissions and limitations under the License, including but not limited to
12   * distribution rights 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  public class UploadServletRequestImpl
58      extends HttpServletRequestWrapper implements UploadServletRequest {
59  
60      public static final int DEFAULT_SIZE_MAX = GetterUtil.getInteger(
61          PropsUtil.get(UploadServletRequestImpl.class.getName() + ".max.size"));
62  
63      public static final File DEFAULT_TEMP_DIR = new File(
64          GetterUtil.getString(PropsUtil.get(
65              UploadServletRequestImpl.class.getName() + ".temp.dir"),
66          SystemProperties.get(SystemProperties.TMP_DIR)));
67  
68      public UploadServletRequestImpl(HttpServletRequest request) {
69          super(request);
70  
71          _params = new LinkedHashMap<String, LiferayFileItem[]>();
72  
73          try {
74              ServletFileUpload servletFileUpload = new LiferayFileUpload(
75                  new LiferayFileItemFactory(DEFAULT_TEMP_DIR), request);
76  
77              servletFileUpload.setSizeMax(DEFAULT_SIZE_MAX);
78  
79              _lsr = new LiferayServletRequest(request);
80  
81              List<LiferayFileItem> list = servletFileUpload.parseRequest(_lsr);
82  
83              for (LiferayFileItem fileItem : list) {
84                  if (fileItem.isFormField()) {
85                      fileItem.setString(request.getCharacterEncoding());
86                  }
87  
88                  LiferayFileItem[] fileItems = _params.get(
89                      fileItem.getFieldName());
90  
91                  if (fileItems == null) {
92                      fileItems = new LiferayFileItem[] {fileItem};
93                  }
94                  else {
95                      LiferayFileItem[] newFileItems =
96                          new LiferayFileItem[fileItems.length + 1];
97  
98                      System.arraycopy(
99                          fileItems, 0, newFileItems, 0, fileItems.length);
100 
101                     newFileItems[newFileItems.length - 1] = fileItem;
102 
103                     fileItems = newFileItems;
104                 }
105 
106                 _params.put(fileItem.getFieldName(), fileItems);
107             }
108         }
109         catch (FileUploadException fue) {
110             _log.error(fue, fue);
111         }
112     }
113 
114     public void cleanUp() {
115         if ((_params != null) && !_params.isEmpty()) {
116             for (LiferayFileItem[] fileItems : _params.values()) {
117                 for (int i = 0; i < fileItems.length; i++) {
118                     fileItems[i].delete();
119                 }
120             }
121         }
122     }
123 
124     public String getContentType(String name) {
125         LiferayFileItem[] fileItems = _params.get(name);
126 
127         if ((fileItems != null) && (fileItems.length > 0)) {
128             return fileItems[0].getContentType();
129         }
130         else {
131             return null;
132         }
133     }
134 
135     public File getFile(String name) {
136         if (getFileName(name) == null) {
137             return null;
138         }
139 
140         LiferayFileItem[] fileItems = _params.get(name);
141 
142         if ((fileItems != null) && (fileItems.length > 0)) {
143             return fileItems[0].getStoreLocation();
144         }
145         else {
146             return null;
147         }
148     }
149 
150     public String getFileName(String name) {
151         LiferayFileItem[] fileItems = _params.get(name);
152 
153         if ((fileItems != null) && (fileItems.length > 0)) {
154             return fileItems[0].getFileName();
155         }
156         else {
157             return null;
158         }
159     }
160 
161     public String getFullFileName(String name) {
162         LiferayFileItem[] fileItems = _params.get(name);
163 
164         if ((fileItems != null) && (fileItems.length > 0)) {
165             return fileItems[0].getFullFileName();
166         }
167         else {
168             return null;
169         }
170     }
171 
172     public ServletInputStream getInputStream() throws IOException {
173         return _lsr.getInputStream();
174     }
175 
176     public Map<String, LiferayFileItem[]> getMultipartParameterMap() {
177         return _params;
178     }
179 
180     public String getParameter(String name) {
181         LiferayFileItem[] fileItems = _params.get(name);
182 
183         if ((fileItems != null) && (fileItems.length > 0)) {
184             return fileItems[0].getString();
185         }
186         else {
187             return super.getParameter(name);
188         }
189     }
190 
191     public Map<String, String[]> getParameterMap() {
192         Map<String, String[]> map = new HashMap<String, String[]>();
193 
194         Enumeration<String> enu = getParameterNames();
195 
196         while (enu.hasMoreElements()) {
197             String name = enu.nextElement();
198 
199             map.put(name, getParameterValues(name));
200         }
201 
202         return map;
203     }
204 
205     public Enumeration<String> getParameterNames() {
206         List<String> parameterNames = new ArrayList<String>();
207 
208         Enumeration<String> enu = super.getParameterNames();
209 
210         while (enu.hasMoreElements()) {
211             String name = enu.nextElement();
212 
213             if (!_params.containsKey(name)) {
214                 parameterNames.add(name);
215             }
216         }
217 
218         for (String name : _params.keySet()) {
219             parameterNames.add(name);
220         }
221 
222         return Collections.enumeration(parameterNames);
223     }
224 
225     public String[] getParameterValues(String name) {
226         String[] parentValues = super.getParameterValues(name);
227 
228         LiferayFileItem[] fileItems = _params.get(name);
229 
230         if ((fileItems == null) || (fileItems.length == 0)) {
231             return parentValues;
232         }
233         else if ((parentValues == null) || (parentValues.length == 0)) {
234             String[] values = new String[fileItems.length];
235 
236             for (int i = 0; i < values.length; i++) {
237                 values[i] = fileItems[i].getString();
238             }
239 
240             return values;
241         }
242         else {
243             String[] values = new String[
244                 parentValues.length + fileItems.length];
245 
246             System.arraycopy(
247                 parentValues, 0, values, 0, parentValues.length);
248 
249             for (int i = parentValues.length; i < values.length; i++) {
250                 values[i] = fileItems[i - parentValues.length].getString();
251             }
252 
253             return values;
254         }
255     }
256 
257     public Boolean isFormField(String name) {
258         LiferayFileItem[] fileItems = _params.get(name);
259 
260         if ((fileItems != null) && (fileItems.length > 0)) {
261             return new Boolean(fileItems[0].isFormField());
262         }
263         else {
264             return null;
265         }
266     }
267 
268     private static Log _log =
269         LogFactoryUtil.getLog(UploadServletRequestImpl.class);
270 
271     private LiferayServletRequest _lsr;
272     private Map<String, LiferayFileItem[]> _params;
273 
274 }