001    /*
002     * Copyright © 2008, 2009 Pedro Agulló Soliveres.
003     * 
004     * This file is part of DirectJNgine.
005     *
006     * DirectJNgine is free software: you can redistribute it and/or modify
007     * it under the terms of the GNU General Public License as published by
008     * the Free Software Foundation, either version 3 of the License.
009     *
010     * DirectJNgine is distributed in the hope that it will be useful,
011     * but WITHOUT ANY WARRANTY; without even the implied warranty of
012     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013     * GNU General Public License for more details.
014     *
015     * You should have received a copy of the GNU General Public License
016     * along with DirectJNgine.  If not, see <http://www.gnu.org/licenses/>.
017     * 
018     * This software uses the ExtJs library (http://extjs.com), which is 
019     * distributed under the GPL v3 license (see http://extjs.com/license).
020     */
021    
022    package com.softwarementors.extjs.djn.router;
023    
024    import java.io.IOException;
025    import java.io.Writer;
026    import java.util.HashMap;
027    import java.util.List;
028    import java.util.Map;
029    
030    import org.apache.commons.fileupload.FileItem;
031    import org.apache.commons.fileupload.FileUploadException;
032    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
033    import org.apache.commons.fileupload.servlet.ServletFileUpload;
034    import org.apache.log4j.Logger;
035    
036    import com.softwarementors.extjs.djn.config.GlobalConfiguration;
037    import com.softwarementors.extjs.djn.config.Registry;
038    
039    public class UploadFormPostRequestProcessor extends FormPostRequestProcessorBase {
040      
041      private static final Logger logger = Logger.getLogger(UploadFormPostRequestProcessor.class);
042      
043      public UploadFormPostRequestProcessor(Registry registry, Dispatcher dispatcher, GlobalConfiguration globalConfiguration) {
044        super( registry, dispatcher, globalConfiguration );
045      }
046    
047      public void process(List<FileItem> fileItems, Writer writer) throws IOException {
048        assert fileItems != null;
049        assert writer != null;
050        
051        Map<String, String> formParameters = new HashMap<String,String>();
052        Map<String, FileItem> fileFields = new HashMap<String,FileItem>();
053        for( FileItem item : fileItems ) {
054          if (item.isFormField()) {
055            formParameters.put( item.getFieldName(), item.getString());
056          } 
057          else {
058            fileFields.put( item.getFieldName(), item );
059          }
060        }
061        
062        if( logger.isDebugEnabled()) { // Avoid expensive function calls if logging is not needed
063          logger.debug( "Request data (UPLOAD FORM)=>" + getFormParametersLogString(formParameters) + " FILES: " + getFileParametersLogString(fileFields));
064        }
065        String result = process(formParameters, fileFields);
066        
067        String resultString = "<html><body><textarea>";
068        resultString += result.toString(); // .replace("\"", "\\\""); 
069        resultString += ("</textarea></body></html>");
070        writer.write( resultString );
071        if( logger.isDebugEnabled() ) {
072          logger.debug( "Response data (UPLOAD FORM)=>" + resultString );
073        }
074      }
075    
076      private String getFormParametersLogString(Map<String, String> formParameters) {
077        StringBuilder result = new StringBuilder();
078        for( String fieldName : formParameters.keySet() ) {
079          result.append( fieldName );
080          result.append( "=");
081          result.append( formParameters.get(fieldName));
082          result.append( ";");
083        }
084        return result.toString();
085      }
086    
087      private String getFileParametersLogString(Map<String, FileItem> fileFields) {
088        StringBuilder result = new StringBuilder();
089        for( String fieldName : fileFields.keySet() ) {
090          FileItem fileItem = fileFields.get(fieldName);
091          result.append( fieldName );
092          result.append( "=");
093          String fileName = fileItem.getName();
094          result.append( fileName );
095          result.append( ";");
096        }
097        return result.toString();
098      }
099    
100      public static ServletFileUpload createFileUploader() {
101        // Create a factory for disk-based file items
102        DiskFileItemFactory factory = new DiskFileItemFactory();
103        // Set factory constraints
104        /*
105          int maxMemorySizeThreshold = 1024 * 10; 
106          factory.setSizeThreshold(maxMemorySizeThreshold); // If request size bigger than this, store files to disk
107          factory.setRepository(new File("c:\temp")); // Where to store temporary files created because of size bigger than that specified in setSizeThreshold
108         */
109    
110        // Create a new file upload handler
111        ServletFileUpload upload = new ServletFileUpload(factory);
112    
113        // Set upload handler limits
114        /*
115          int maxRequestSize = 1024 * 1000; // What happens if
116          int maxFileSize = 1024 * 1000;
117          upload.setSizeMax(maxRequestSize);
118          upload.setFileSizeMax(maxFileSize);
119         */
120        return upload;
121      }
122    
123      public void handleFileUploadException(FileUploadException e) {
124        assert e != null;
125        
126        com.softwarementors.extjs.djn.router.FileUploadException ex = com.softwarementors.extjs.djn.router.FileUploadException.forFileUploadException(e);
127        logger.error( ex.getMessage(), ex);
128        throw ex;
129      }
130      
131    }