View Javadoc

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  //AVALON
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  //COMMONS
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  //GUARA
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          //configure file upload
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         //unused for file multipart/form-data request
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             //TODO: parse file upload. see TurbineUpload.parseRequest(request, this);
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                     //TODO: add to rundata
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 }