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.ArrayList;
028    import java.util.Collections;
029    import java.util.Enumeration;
030    import java.util.HashMap;
031    import java.util.LinkedHashMap;
032    import java.util.List;
033    import java.util.Map;
034    
035    import javax.servlet.ServletInputStream;
036    import javax.servlet.http.HttpServletRequest;
037    import javax.servlet.http.HttpServletRequestWrapper;
038    
039    import org.apache.commons.fileupload.FileUploadException;
040    import org.apache.commons.fileupload.servlet.ServletFileUpload;
041    
042    /**
043     * @author Brian Wing Shun Chan
044     * @author Zongliang Li
045     * @author Harry Mark
046     */
047    public class UploadServletRequestImpl
048            extends HttpServletRequestWrapper implements UploadServletRequest {
049    
050            public static final long DEFAULT_SIZE_MAX = GetterUtil.getLong(
051                    PropsUtil.get(UploadServletRequestImpl.class.getName() + ".max.size"));
052    
053            public static final File DEFAULT_TEMP_DIR = new File(
054                    GetterUtil.getString(PropsUtil.get(
055                            UploadServletRequestImpl.class.getName() + ".temp.dir"),
056                    SystemProperties.get(SystemProperties.TMP_DIR)));
057    
058            public UploadServletRequestImpl(HttpServletRequest request) {
059                    super(request);
060    
061                    _params = new LinkedHashMap<String, LiferayFileItem[]>();
062    
063                    try {
064                            ServletFileUpload servletFileUpload = new LiferayFileUpload(
065                                    new LiferayFileItemFactory(DEFAULT_TEMP_DIR), request);
066    
067                            servletFileUpload.setSizeMax(DEFAULT_SIZE_MAX);
068    
069                            _lsr = new LiferayServletRequest(request);
070    
071                            List<LiferayFileItem> list = servletFileUpload.parseRequest(_lsr);
072    
073                            for (LiferayFileItem fileItem : list) {
074                                    if (fileItem.isFormField()) {
075                                            fileItem.setString(request.getCharacterEncoding());
076                                    }
077    
078                                    LiferayFileItem[] fileItems = _params.get(
079                                            fileItem.getFieldName());
080    
081                                    if (fileItems == null) {
082                                            fileItems = new LiferayFileItem[] {fileItem};
083                                    }
084                                    else {
085                                            LiferayFileItem[] newFileItems =
086                                                    new LiferayFileItem[fileItems.length + 1];
087    
088                                            System.arraycopy(
089                                                    fileItems, 0, newFileItems, 0, fileItems.length);
090    
091                                            newFileItems[newFileItems.length - 1] = fileItem;
092    
093                                            fileItems = newFileItems;
094                                    }
095    
096                                    _params.put(fileItem.getFieldName(), fileItems);
097                            }
098                    }
099                    catch (FileUploadException fue) {
100                            _log.error(fue, fue);
101                    }
102            }
103    
104            public void cleanUp() {
105                    if ((_params != null) && !_params.isEmpty()) {
106                            for (LiferayFileItem[] fileItems : _params.values()) {
107                                    for (int i = 0; i < fileItems.length; i++) {
108                                            fileItems[i].delete();
109                                    }
110                            }
111                    }
112            }
113    
114            public String getContentType(String name) {
115                    LiferayFileItem[] fileItems = _params.get(name);
116    
117                    if ((fileItems != null) && (fileItems.length > 0)) {
118                            return fileItems[0].getContentType();
119                    }
120                    else {
121                            return null;
122                    }
123            }
124    
125            public File getFile(String name) {
126                    if (getFileName(name) == null) {
127                            return null;
128                    }
129    
130                    LiferayFileItem[] fileItems = _params.get(name);
131    
132                    if ((fileItems != null) && (fileItems.length > 0)) {
133                            return fileItems[0].getStoreLocation();
134                    }
135                    else {
136                            return null;
137                    }
138            }
139    
140            public String getFileName(String name) {
141                    LiferayFileItem[] fileItems = _params.get(name);
142    
143                    if ((fileItems != null) && (fileItems.length > 0)) {
144                            return fileItems[0].getFileName();
145                    }
146                    else {
147                            return null;
148                    }
149            }
150    
151            public String getFullFileName(String name) {
152                    LiferayFileItem[] fileItems = _params.get(name);
153    
154                    if ((fileItems != null) && (fileItems.length > 0)) {
155                            return fileItems[0].getFullFileName();
156                    }
157                    else {
158                            return null;
159                    }
160            }
161    
162            public ServletInputStream getInputStream() throws IOException {
163                    return _lsr.getInputStream();
164            }
165    
166            public Map<String, LiferayFileItem[]> getMultipartParameterMap() {
167                    return _params;
168            }
169    
170            public String getParameter(String name) {
171                    LiferayFileItem[] fileItems = _params.get(name);
172    
173                    if ((fileItems != null) && (fileItems.length > 0)) {
174                            return fileItems[0].getString();
175                    }
176                    else {
177                            return super.getParameter(name);
178                    }
179            }
180    
181            public Map<String, String[]> getParameterMap() {
182                    Map<String, String[]> map = new HashMap<String, String[]>();
183    
184                    Enumeration<String> enu = getParameterNames();
185    
186                    while (enu.hasMoreElements()) {
187                            String name = enu.nextElement();
188    
189                            map.put(name, getParameterValues(name));
190                    }
191    
192                    return map;
193            }
194    
195            public Enumeration<String> getParameterNames() {
196                    List<String> parameterNames = new ArrayList<String>();
197    
198                    Enumeration<String> enu = super.getParameterNames();
199    
200                    while (enu.hasMoreElements()) {
201                            String name = enu.nextElement();
202    
203                            if (!_params.containsKey(name)) {
204                                    parameterNames.add(name);
205                            }
206                    }
207    
208                    for (String name : _params.keySet()) {
209                            parameterNames.add(name);
210                    }
211    
212                    return Collections.enumeration(parameterNames);
213            }
214    
215            public String[] getParameterValues(String name) {
216                    String[] parentValues = super.getParameterValues(name);
217    
218                    LiferayFileItem[] fileItems = _params.get(name);
219    
220                    if ((fileItems == null) || (fileItems.length == 0)) {
221                            return parentValues;
222                    }
223                    else if ((parentValues == null) || (parentValues.length == 0)) {
224                            String[] values = new String[fileItems.length];
225    
226                            for (int i = 0; i < values.length; i++) {
227                                    values[i] = fileItems[i].getString();
228                            }
229    
230                            return values;
231                    }
232                    else {
233                            String[] values = new String[
234                                    parentValues.length + fileItems.length];
235    
236                            System.arraycopy(
237                                    parentValues, 0, values, 0, parentValues.length);
238    
239                            for (int i = parentValues.length; i < values.length; i++) {
240                                    values[i] = fileItems[i - parentValues.length].getString();
241                            }
242    
243                            return values;
244                    }
245            }
246    
247            public Boolean isFormField(String name) {
248                    LiferayFileItem[] fileItems = _params.get(name);
249    
250                    if ((fileItems != null) && (fileItems.length > 0)) {
251                            return new Boolean(fileItems[0].isFormField());
252                    }
253                    else {
254                            return null;
255                    }
256            }
257    
258            private static Log _log = LogFactoryUtil.getLog(
259                    UploadServletRequestImpl.class);
260    
261            private LiferayServletRequest _lsr;
262            private Map<String, LiferayFileItem[]> _params;
263    
264    }