1 package br.com.ibnetwork.guara.parameters.impl;
2
3 import java.io.File;
4 import java.util.Enumeration;
5 import java.util.Iterator;
6 import java.util.List;
7
8 import javax.servlet.http.HttpServletRequest;
9
10
11 import org.apache.avalon.framework.configuration.Configurable;
12 import org.apache.avalon.framework.configuration.Configuration;
13 import org.apache.avalon.framework.configuration.ConfigurationException;
14 import org.apache.avalon.framework.service.ServiceException;
15 import org.apache.avalon.framework.service.ServiceManager;
16 import org.apache.avalon.framework.service.Serviceable;
17
18
19 import org.apache.commons.fileupload.DiskFileUpload;
20 import org.apache.commons.fileupload.FileItem;
21 import org.apache.commons.fileupload.FileUpload;
22 import org.apache.commons.lang.StringUtils;
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25
26
27 import br.com.ibnetwork.xingu.factory.Factory;
28 import br.com.ibnetwork.guara.parameters.ParameterParser;
29 import br.com.ibnetwork.guara.parameters.ParameterParserBuilder;
30 import br.com.ibnetwork.guara.parameters.ParameterParserException;
31
32 /***
33 * @author <a href="mailto:leandro@ibnetwork.com.br">leandro</a>
34 */
35 public abstract class ParameterParserBuilderSupport
36 implements ParameterParserBuilder, Serviceable, Configurable
37 {
38 protected Log logger;
39
40 protected DiskFileUpload uploadHandler;
41
42 protected boolean fileUploadEnabled;
43
44 protected int maxFileSize;
45
46 protected int sizeThreshold;
47
48 protected String repository;
49
50 protected boolean extractPathInfo;
51
52 protected String encoding;
53
54 protected Factory factory;
55
56 public void service(ServiceManager manager)
57 throws ServiceException
58 {
59 logger = LogFactory.getLog(ParameterParserBuilderImpl.class);
60 factory = (Factory) manager.lookup(Factory.ROLE);
61 uploadHandler = new DiskFileUpload();
62 }
63
64 public void configure(Configuration conf)
65 throws ConfigurationException
66 {
67 extractPathInfo = conf.getChild("extractPathInfo").getAttributeAsBoolean("enabled",false);
68 encoding = conf.getChild("encoding").getAttribute("name","ISO-8859-1");
69
70 Configuration fileUploadConfig = conf.getChild("fileUpload");
71 fileUploadEnabled = fileUploadConfig.getAttributeAsBoolean("enabled",false);
72 maxFileSize = fileUploadConfig.getAttributeAsInteger("maxFileSize",0);
73 sizeThreshold = fileUploadConfig.getAttributeAsInteger("sizeThreshold",100000);
74 repository = fileUploadConfig.getAttribute("repository","/tmp/guara/uploads");
75 boolean createRepository = fileUploadConfig.getAttributeAsBoolean("createRepository",false);
76 File repo = new File(repository);
77 if(!repo.exists() && createRepository)
78 {
79 logger.info("Creating repository ["+repository+"]");
80 repo.mkdirs();
81 }
82 uploadHandler.setRepositoryPath(repository);
83 uploadHandler.setSizeMax(maxFileSize);
84 uploadHandler.setSizeThreshold(sizeThreshold);
85 uploadHandler.setHeaderEncoding(encoding);
86 }
87
88
89 public ParameterParser createParameterParser(HttpServletRequest request)
90 throws ParameterParserException
91 {
92 Object[] params = new Object[]{encoding};
93 ParameterParser parser = (ParameterParser) factory.create(ParameterParser.class, params);
94 if(fileUploadEnabled)
95 {
96 handleFileUpload(parser, request);
97 }
98 if(extractPathInfo)
99 {
100 extractPathInfo(parser, request);
101 }
102
103 extractParameters(parser, request);
104
105
106 if (logger.isDebugEnabled())
107 {
108 logger.debug("Parameters found in the Request:");
109 for (Iterator it = parser.keySet().iterator(); it.hasNext();)
110 {
111 String key = (String) it.next();
112 logger.debug("Key: " + key + " -> " + parser.get(key));
113 }
114 }
115
116 return parser;
117 }
118
119 protected void handleFileUpload(ParameterParser parser, HttpServletRequest request)
120 {
121 if(!FileUpload.isMultipartContent(request))
122 {
123 return;
124 }
125 logger.debug("Parsing file upload");
126 try
127 {
128
129 List fileItems = uploadHandler.parseRequest(request);
130 for (Iterator iter = fileItems.iterator(); iter.hasNext();)
131 {
132 FileItem item = (FileItem) iter.next();
133 if(item.isFormField())
134 {
135 String parameterName = item.getFieldName();
136 String value = item.getString(encoding);
137 add(parser,parameterName,value);
138 }
139 else
140 {
141 String fieldName = item.getFieldName();
142
143 add(parser,fieldName,item);
144 if(logger.isDebugEnabled())
145 {
146 String fileName = item.getName();
147 String contentType = item.getContentType();
148 boolean isInMemory = item.isInMemory();
149 long sizeInBytes = item.getSize();
150 logger.debug("Received file ["+fileName
151 +"] contentType["+contentType
152 +"] isInMemory ["+isInMemory
153 +"] siInBytes ["+sizeInBytes+"]");
154
155 }
156 }
157 }
158 }
159 catch (Exception e)
160 {
161 logger.error("File upload failed", e);
162 }
163 }
164
165 protected void extractParameters(ParameterParser parser, HttpServletRequest request)
166 {
167 for (Enumeration names = request.getParameterNames();names.hasMoreElements();)
168 {
169 String parameterName = (String) names.nextElement();
170 add(parser,parameterName,request);
171 }
172 }
173
174 protected void add(ParameterParser parser, String parameterName, String value)
175 {
176 parser.add(convert(parameterName),value);
177 }
178
179 protected void add(ParameterParser parser, String parameterName, FileItem item)
180 {
181 parser.add(parameterName,item);
182 }
183
184
185 protected void add(ParameterParser parser, String parameterName, HttpServletRequest request)
186 {
187 String convertedName = convert(parameterName);
188 String[] values = request.getParameterValues(parameterName);
189 if(values.length > 0 && !StringUtils.isEmpty(values[0]))
190 {
191 parser.add(convertedName, values);
192 }
193 }
194
195 protected String convert(String parameterName)
196 {
197 return parameterName;
198 }
199
200 protected abstract void extractPathInfo(ParameterParser parser, HttpServletRequest request);
201
202 }