001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.upload;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.upload.UploadServletRequest;
020    import com.liferay.portal.kernel.util.GetterUtil;
021    import com.liferay.portal.util.PropsUtil;
022    import com.liferay.util.SystemProperties;
023    
024    import java.io.File;
025    import java.io.IOException;
026    
027    import java.util.Collections;
028    import java.util.Enumeration;
029    import java.util.HashMap;
030    import java.util.LinkedHashMap;
031    import java.util.LinkedHashSet;
032    import java.util.List;
033    import java.util.Map;
034    import java.util.Set;
035    
036    import javax.servlet.ServletInputStream;
037    import javax.servlet.http.HttpServletRequest;
038    import javax.servlet.http.HttpServletRequestWrapper;
039    
040    import org.apache.commons.fileupload.FileUploadException;
041    import org.apache.commons.fileupload.servlet.ServletFileUpload;
042    
043    /**
044     * @author Brian Wing Shun Chan
045     * @author Zongliang Li
046     * @author Harry Mark
047     */
048    public class UploadServletRequestImpl
049            extends HttpServletRequestWrapper implements UploadServletRequest {
050    
051            public static final long DEFAULT_SIZE_MAX = GetterUtil.getLong(
052                    PropsUtil.get(UploadServletRequestImpl.class.getName() + ".max.size"));
053    
054            public static final File DEFAULT_TEMP_DIR = new File(
055                    GetterUtil.getString(PropsUtil.get(
056                            UploadServletRequestImpl.class.getName() + ".temp.dir"),
057                    SystemProperties.get(SystemProperties.TMP_DIR)));
058    
059            public UploadServletRequestImpl(HttpServletRequest request) {
060                    super(request);
061    
062                    _params = new LinkedHashMap<String, LiferayFileItem[]>();
063    
064                    try {
065                            ServletFileUpload servletFileUpload = new LiferayFileUpload(
066                                    new LiferayFileItemFactory(DEFAULT_TEMP_DIR), request);
067    
068                            servletFileUpload.setSizeMax(DEFAULT_SIZE_MAX);
069    
070                            _lsr = new LiferayServletRequest(request);
071    
072                            List<LiferayFileItem> list = servletFileUpload.parseRequest(_lsr);
073    
074                            for (LiferayFileItem fileItem : list) {
075                                    if (fileItem.isFormField()) {
076                                            fileItem.setString(request.getCharacterEncoding());
077                                    }
078    
079                                    LiferayFileItem[] fileItems = _params.get(
080                                            fileItem.getFieldName());
081    
082                                    if (fileItems == null) {
083                                            fileItems = new LiferayFileItem[] {fileItem};
084                                    }
085                                    else {
086                                            LiferayFileItem[] newFileItems =
087                                                    new LiferayFileItem[fileItems.length + 1];
088    
089                                            System.arraycopy(
090                                                    fileItems, 0, newFileItems, 0, fileItems.length);
091    
092                                            newFileItems[newFileItems.length - 1] = fileItem;
093    
094                                            fileItems = newFileItems;
095                                    }
096    
097                                    _params.put(fileItem.getFieldName(), fileItems);
098                            }
099                    }
100                    catch (FileUploadException fue) {
101                            _log.error(fue, fue);
102                    }
103            }
104    
105            public void cleanUp() {
106                    if ((_params != null) && !_params.isEmpty()) {
107                            for (LiferayFileItem[] fileItems : _params.values()) {
108                                    for (int i = 0; i < fileItems.length; i++) {
109                                            fileItems[i].delete();
110                                    }
111                            }
112                    }
113            }
114    
115            public String getContentType(String name) {
116                    LiferayFileItem[] fileItems = _params.get(name);
117    
118                    if ((fileItems != null) && (fileItems.length > 0)) {
119                            return fileItems[0].getContentType();
120                    }
121                    else {
122                            return null;
123                    }
124            }
125    
126            public File getFile(String name) {
127                    if (getFileName(name) == null) {
128                            return null;
129                    }
130    
131                    LiferayFileItem[] fileItems = _params.get(name);
132    
133                    if ((fileItems != null) && (fileItems.length > 0)) {
134                            return fileItems[0].getStoreLocation();
135                    }
136                    else {
137                            return null;
138                    }
139            }
140    
141            public String getFileName(String name) {
142                    LiferayFileItem[] fileItems = _params.get(name);
143    
144                    if ((fileItems != null) && (fileItems.length > 0)) {
145                            return fileItems[0].getFileName();
146                    }
147                    else {
148                            return null;
149                    }
150            }
151    
152            public String getFullFileName(String name) {
153                    LiferayFileItem[] fileItems = _params.get(name);
154    
155                    if ((fileItems != null) && (fileItems.length > 0)) {
156                            return fileItems[0].getFullFileName();
157                    }
158                    else {
159                            return null;
160                    }
161            }
162    
163            public ServletInputStream getInputStream() throws IOException {
164                    return _lsr.getInputStream();
165            }
166    
167            public Map<String, LiferayFileItem[]> getMultipartParameterMap() {
168                    return _params;
169            }
170    
171            public String getParameter(String name) {
172                    LiferayFileItem[] fileItems = _params.get(name);
173    
174                    if ((fileItems != null) && (fileItems.length > 0)) {
175                            return fileItems[0].getString();
176                    }
177                    else {
178                            return super.getParameter(name);
179                    }
180            }
181    
182            public Map<String, String[]> getParameterMap() {
183                    Map<String, String[]> map = new HashMap<String, String[]>();
184    
185                    Enumeration<String> enu = getParameterNames();
186    
187                    while (enu.hasMoreElements()) {
188                            String name = enu.nextElement();
189    
190                            map.put(name, getParameterValues(name));
191                    }
192    
193                    return map;
194            }
195    
196            public Enumeration<String> getParameterNames() {
197                    Set<String> parameterNames = new LinkedHashSet<String>();
198    
199                    Enumeration<String> enu = super.getParameterNames();
200    
201                    while (enu.hasMoreElements()) {
202                            String name = enu.nextElement();
203    
204                            if (!_params.containsKey(name)) {
205                                    parameterNames.add(name);
206                            }
207                    }
208    
209                    parameterNames.addAll(_params.keySet());
210    
211                    return Collections.enumeration(parameterNames);
212            }
213    
214            public String[] getParameterValues(String name) {
215                    String[] parentValues = super.getParameterValues(name);
216    
217                    LiferayFileItem[] fileItems = _params.get(name);
218    
219                    if ((fileItems == null) || (fileItems.length == 0)) {
220                            return parentValues;
221                    }
222                    else if ((parentValues == null) || (parentValues.length == 0)) {
223                            String[] values = new String[fileItems.length];
224    
225                            for (int i = 0; i < values.length; i++) {
226                                    values[i] = fileItems[i].getString();
227                            }
228    
229                            return values;
230                    }
231                    else {
232                            String[] values = new String[
233                                    parentValues.length + fileItems.length];
234    
235                            System.arraycopy(
236                                    parentValues, 0, values, 0, parentValues.length);
237    
238                            for (int i = parentValues.length; i < values.length; i++) {
239                                    values[i] = fileItems[i - parentValues.length].getString();
240                            }
241    
242                            return values;
243                    }
244            }
245    
246            public Boolean isFormField(String name) {
247                    LiferayFileItem[] fileItems = _params.get(name);
248    
249                    if ((fileItems != null) && (fileItems.length > 0)) {
250                            return new Boolean(fileItems[0].isFormField());
251                    }
252                    else {
253                            return null;
254                    }
255            }
256    
257            private static Log _log = LogFactoryUtil.getLog(
258                    UploadServletRequestImpl.class);
259    
260            private LiferayServletRequest _lsr;
261            private Map<String, LiferayFileItem[]> _params;
262    
263    }