1.1 restoration
[mir.git] / source / mir / util / HTTPParsedRequest.java
1 /*
2  * Copyright (C) 2001, 2002 The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with  any library licensed under the Apache Software License,
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
23  * (or with modified versions of the above that use the same license as the above),
24  * and distribute linked combinations including the two.  You must obey the
25  * GNU General Public License in all respects for all of the code used other than
26  * the above mentioned libraries.  If you modify this file, you may extend this
27  * exception to your version of the file, but you are not obligated to do so.
28  * If you do not wish to do so, delete this exception statement from your version.
29  */
30 package mir.util;
31
32 import mir.log.LoggerWrapper;
33 import org.apache.commons.fileupload.DiskFileUpload;
34 import org.apache.commons.fileupload.FileItem;
35
36 import javax.servlet.http.HttpServletRequest;
37 import java.util.*;
38
39 public class HTTPParsedRequest {
40   static final String MULTIPART_FORMDATA_CONTENTTYPE = "multipart/form-data";
41
42   private HttpServletRequest request;
43   private String encoding;
44   private int maxUploadSize;
45   private String tempDir;
46
47   private Map parameterStringValues;
48   private Map parameterListValues;
49   private List files;
50
51   private LoggerWrapper logger = new LoggerWrapper("Utility.HTTPParsedRequest");
52
53   public HTTPParsedRequest(HttpServletRequest aRequest, String anEncoding, int aMaxUploadSize, String aTempDir) throws UtilExc, UtilFailure {
54     request = aRequest;
55     encoding = anEncoding;
56     maxUploadSize = aMaxUploadSize;
57     tempDir = aTempDir;
58
59     parameterStringValues = new HashMap();
60     parameterListValues = new HashMap();
61     files = new ArrayList();
62
63     parseRequest(aRequest);
64   }
65
66   public HTTPParsedRequest(HttpServletRequest aRequest, int aMaxUploadSize, String aTempDir) throws UtilExc, UtilFailure {
67     this(aRequest, aRequest.getCharacterEncoding(), aMaxUploadSize, aTempDir);
68   }
69
70   public HttpServletRequest getRequest() {
71     return request;
72   }
73
74   public String getParameter(String aName) {
75     return (String) parameterStringValues.get(aName);
76   }
77
78   public Collection getParameterNames() {
79     return parameterStringValues.keySet();
80   }
81
82   public String getHeader(String aName) {
83     return request.getHeader(aName);
84   }
85
86   public List getFiles() {
87     return files;
88   }
89
90   public List getParameterList(String aName) {
91     if (parameterListValues.containsKey(aName))
92       return (List) parameterListValues.get(aName);
93     else
94       return Collections.EMPTY_LIST;
95   }
96
97   protected void parseRequest(HttpServletRequest aRequest) throws UtilExc, UtilFailure {
98
99     try {
100       String contentType = aRequest.getContentType();
101       List parts = StringRoutines.splitString(contentType, ";");
102
103       Enumeration e = aRequest.getParameterNames();
104
105       while (e.hasMoreElements()) {
106         String name = (String) e.nextElement();
107
108         parameterStringValues.put(name, aRequest.getParameter(name));
109         List listValue = new ArrayList(Arrays.asList(aRequest.getParameterValues(name)));
110         parameterListValues.put(name, listValue);
111       }
112
113       if (parts.size()>0 && ((String) parts.get(0)).trim().toLowerCase().equals(MULTIPART_FORMDATA_CONTENTTYPE)) {
114         parseMultipartRequest();
115       }
116     }
117     catch (Throwable t) {
118       t.printStackTrace();
119
120       throw new UtilFailure(t);
121     }
122   }
123
124   protected void parseMultipartRequest() throws UtilExc, UtilFailure {
125     try {
126       DiskFileUpload upload = new DiskFileUpload();
127
128       upload.setSizeThreshold(100000);
129       upload.setSizeMax(maxUploadSize);
130       upload.setHeaderEncoding(encoding);
131       upload.setRepositoryPath(tempDir);
132
133       List items = upload.parseRequest(request);
134
135       Iterator i = items.iterator();
136       while (i.hasNext()) {
137         FileItem item = (FileItem) i.next();
138
139         if (item.isFormField()) {
140           if (!parameterStringValues.containsKey(item.getName())) {
141             parameterStringValues.put(item.getFieldName(), item.getString(encoding));
142           }
143
144           List listValue = (List) parameterListValues.get(item.getFieldName());
145           if (listValue == null) {
146             listValue = new ArrayList();
147             parameterListValues.put(item.getFieldName(), listValue);
148           }
149           listValue.add(item.getString(encoding));
150         }
151         else {
152           if (item.getSize()>0)
153             files.add(item);
154         }
155       }
156     }
157     catch (Throwable t) {
158       throw new UtilFailure(t);
159     }
160   }
161 }