You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gr...@apache.org on 2006/01/02 21:02:35 UTC

svn commit: r365413 - in /myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces: component/html/util/MultipartRequestWrapper.java custom/fileupload/HtmlFileUploadRenderer.java

Author: grantsmith
Date: Mon Jan  2 12:02:22 2006
New Revision: 365413

URL: http://svn.apache.org/viewcvs?rev=365413&view=rev
Log:
Patches for MYFACES-758

Modified:
    myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java
    myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java

Modified: myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java?rev=365413&r1=365412&r2=365413&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java (original)
+++ myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java Mon Jan  2 12:02:22 2006
@@ -29,45 +29,46 @@
  * @version $Revision$ $Date$
  */
 public class MultipartRequestWrapper
-		extends HttpServletRequestWrapper
+        extends HttpServletRequestWrapper
 {
     private static Log log = LogFactory.getLog(MultipartRequestWrapper.class);
+    public static final String UPLOADED_FILES_ATTRIBUTE = "org.apache.myfaces.uploadedFiles";
 
-	HttpServletRequest request = null;
-	HashMap parametersMap = null;
-	DiskFileUpload fileUpload = null;
-	HashMap fileItems = null;
-	int maxSize;
+    HttpServletRequest request = null;
+    HashMap parametersMap = null;
+    DiskFileUpload fileUpload = null;
+    HashMap fileItems = null;
+    int maxSize;
     int thresholdSize;
     String repositoryPath;
 
     public MultipartRequestWrapper(HttpServletRequest request,
                                    int maxSize, int thresholdSize,
                                    String repositoryPath){
-		super( request );
-		this.request = request;
+        super( request );
+        this.request = request;
         this.maxSize = maxSize;
         this.thresholdSize = thresholdSize;
         this.repositoryPath = repositoryPath;
-	}
+    }
 
-	private void parseRequest() {
-		fileUpload = new DiskFileUpload();
-		fileUpload.setFileItemFactory(new DefaultFileItemFactory());
-		fileUpload.setSizeMax(maxSize);
+    private void parseRequest() {
+        fileUpload = new DiskFileUpload();
+        fileUpload.setFileItemFactory(new DefaultFileItemFactory());
+        fileUpload.setSizeMax(maxSize);
 
         fileUpload.setSizeThreshold(thresholdSize);
 
         if(repositoryPath != null && repositoryPath.trim().length()>0)
             fileUpload.setRepositoryPath(repositoryPath);
 
-	    String charset = request.getCharacterEncoding();
-		fileUpload.setHeaderEncoding(charset);
+        String charset = request.getCharacterEncoding();
+        fileUpload.setHeaderEncoding(charset);
 
 
-		List requestParameters = null;
-		try{
-			requestParameters = fileUpload.parseRequest(request);
+        List requestParameters = null;
+        try{
+            requestParameters = fileUpload.parseRequest(request);
         } catch (FileUploadBase.SizeLimitExceededException e) {
 
             // TODO: find a way to notify the user about the fact that the uploaded file exceeded size limit
@@ -77,45 +78,45 @@
 
             requestParameters = Collections.EMPTY_LIST;
 
-		}catch(FileUploadException fue){
-			log.error("Exception while uploading file.", fue);
-			requestParameters = Collections.EMPTY_LIST;
-		}
-
-		parametersMap = new HashMap( requestParameters.size() );
-		fileItems = new HashMap();
-
-    	for (Iterator iter = requestParameters.iterator(); iter.hasNext(); ){
-    		FileItem fileItem = (FileItem) iter.next();
-
-    		if (fileItem.isFormField()) {
-    			String name = fileItem.getFieldName();
-
-    			// The following code avoids commons-fileupload charset problem.
-    			// After fixing commons-fileupload, this code should be
-    			//
-    			// 	String value = fileItem.getString();
-    			//
-    			String value = null;
-    			if ( charset == null) {
-    			    value = fileItem.getString();
-    			} else {
-    			    try {
-    			        value = new String(fileItem.get(), charset);
-    			    } catch (UnsupportedEncodingException e){
-    			        value = fileItem.getString();
-    			    }
-    			}
-
-    			addTextParameter(name, value);
-    		} else { // fileItem is a File
-   				if (fileItem.getName() != null) {
-   					fileItems.put(fileItem.getFieldName(), fileItem);
-   				}
-    		}
-    	}
+        }catch(FileUploadException fue){
+            log.error("Exception while uploading file.", fue);
+            requestParameters = Collections.EMPTY_LIST;
+        }
+
+        parametersMap = new HashMap( requestParameters.size() );
+        fileItems = new HashMap();
+
+        for (Iterator iter = requestParameters.iterator(); iter.hasNext(); ){
+            FileItem fileItem = (FileItem) iter.next();
+
+            if (fileItem.isFormField()) {
+                String name = fileItem.getFieldName();
+
+                // The following code avoids commons-fileupload charset problem.
+                // After fixing commons-fileupload, this code should be
+                //
+                // 	String value = fileItem.getString();
+                //
+                String value = null;
+                if ( charset == null) {
+                    value = fileItem.getString();
+                } else {
+                    try {
+                        value = new String(fileItem.get(), charset);
+                    } catch (UnsupportedEncodingException e){
+                        value = fileItem.getString();
+                    }
+                }
+
+                addTextParameter(name, value);
+            } else { // fileItem is a File
+                if (fileItem.getName() != null) {
+                    fileItems.put(fileItem.getFieldName(), fileItem);
+                }
+            }
+        }
 
-    	//Add the query string paramters
+        //Add the query string paramters
         for (Iterator it = request.getParameterMap().entrySet().iterator(); it.hasNext(); )
         {
             Map.Entry entry = (Map.Entry)it.next();
@@ -125,61 +126,70 @@
                 addTextParameter((String)entry.getKey(), valuesArray[i]);
             }
         }
-	}
+    }
+
+    private void addTextParameter(String name, String value){
+        if( ! parametersMap.containsKey( name ) ){
+            String[] valuesArray = {value};
+            parametersMap.put(name, valuesArray);
+        }else{
+            String[] storedValues = (String[])parametersMap.get( name );
+            int lengthSrc = storedValues.length;
+            String[] valuesArray = new String[lengthSrc+1];
+            System.arraycopy(storedValues, 0, valuesArray, 0, lengthSrc);
+            valuesArray[lengthSrc] = value;
+            parametersMap.put(name, valuesArray);
+        }
+    }
+
+    public Enumeration getParameterNames() {
+        if( parametersMap == null ) parseRequest();
+
+        return Collections.enumeration( parametersMap.keySet() );
+    }
 
-	private void addTextParameter(String name, String value){
-		if( ! parametersMap.containsKey( name ) ){
-			String[] valuesArray = {value};
-			parametersMap.put(name, valuesArray);
-		}else{
-			String[] storedValues = (String[])parametersMap.get( name );
-			int lengthSrc = storedValues.length;
-			String[] valuesArray = new String[lengthSrc+1];
-			System.arraycopy(storedValues, 0, valuesArray, 0, lengthSrc);
-			valuesArray[lengthSrc] = value;
-			parametersMap.put(name, valuesArray);
-		}
-	}
-
-	public Enumeration getParameterNames() {
-		if( parametersMap == null ) parseRequest();
-
-		return Collections.enumeration( parametersMap.keySet() );
-	}
-
-	public String getParameter(String name) {
-		if( parametersMap == null ) parseRequest();
-
-		String[] values = (String[])parametersMap.get( name );
-		if( values == null )
-			return null;
-		return values[0];
-	}
-
-	public String[] getParameterValues(String name) {
-		if( parametersMap == null ) parseRequest();
-
-		return (String[])parametersMap.get( name );
-	}
-
-	public Map getParameterMap() {
-		if( parametersMap == null ) parseRequest();
-
-		return parametersMap;
-	}
-
-	// Hook for the x:inputFileUpload tag.
-	public FileItem getFileItem(String fieldName) {
-		if( fileItems == null ) parseRequest();
-
-		return (FileItem) fileItems.get( fieldName );
-	}
-
-	/**
-	 * Not used internaly by MyFaces, but provides a way to handle the uploaded files
-	 * out of MyFaces.
-	 */
-	public Map getFileItems(){
-	    return fileItems;
-	}
+    public String getParameter(String name) {
+        if( parametersMap == null ) parseRequest();
+
+        String[] values = (String[])parametersMap.get( name );
+        if( values == null )
+            return null;
+        return values[0];
+    }
+
+    public String[] getParameterValues(String name) {
+        if( parametersMap == null ) parseRequest();
+
+        return (String[])parametersMap.get( name );
+    }
+
+    public Map getParameterMap() {
+        if( parametersMap == null ) parseRequest();
+
+        return parametersMap;
+    }
+
+    // Hook for the x:inputFileUpload tag.
+    public FileItem getFileItem(String fieldName) {
+        if( fileItems == null ) parseRequest();
+
+        return (FileItem) fileItems.get( fieldName );
+    }
+
+    /**
+     * Not used internaly by MyFaces, but provides a way to handle the uploaded files
+     * out of MyFaces.
+     */
+    public Map getFileItems(){
+        if( fileItems == null ) parseRequest();
+        return fileItems;
+    }
+
+
+    public Object getAttribute(String string) {
+        if (string.equals(UPLOADED_FILES_ATTRIBUTE)) {
+            return getFileItems();
+        }
+        return super.getAttribute(string);
+    }
 }

Modified: myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java?rev=365413&r1=365412&r2=365413&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java (original)
+++ myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java Mon Jan  2 12:02:22 2006
@@ -28,23 +28,25 @@
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.context.ExternalContext;
 import javax.faces.render.Renderer;
 import javax.faces.convert.ConverterException;
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
 import java.io.IOException;
+import java.util.Map;
 
 /**
  * @author Manfred Geiler (latest modification by $Author$)
  * @version $Revision$ $Date$
  */
 public class HtmlFileUploadRenderer
-    extends Renderer
+        extends Renderer
 {
     private static final Log log = LogFactory.getLog(HtmlFileUploadRenderer.class);
 
     public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)
-        throws IOException
+            throws IOException
     {
         super.encodeEnd(facesContext, uiComponent); //check for NP
 
@@ -57,10 +59,10 @@
         UploadedFile value = (UploadedFile)((HtmlInputFileUpload)uiComponent).getValue();
         if (value != null)
         {
-        	if( value.getName() != null )
-        	{
-        		writer.writeAttribute(HTML.VALUE_ATTR, value.getName(), null);
-        	}
+            if( value.getName() != null )
+            {
+                writer.writeAttribute(HTML.VALUE_ATTR, value.getName(), null);
+            }
         }
         HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.INPUT_FILE_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
         if (isDisabled(facesContext, uiComponent))
@@ -99,12 +101,38 @@
         //Filters. We try to find the MultipartWrapper, but if a filter has wrapped
         //the ServletRequest with a class other than HttpServletRequestWrapper
         //this will fail.
-        //todo: fix this to work in PortletRequest as well
+        Object request = facesContext.getExternalContext().getRequest();
+        if (!(request instanceof ServletRequest)) {
+            ExternalContext externalContext = facesContext.getExternalContext();
+            Map fileItems = (Map)externalContext.getRequestMap().
+                    get(MultipartRequestWrapper.UPLOADED_FILES_ATTRIBUTE);
+            FileItem fileItem = null;
+            if (fileItems != null) {
+                String paramName = uiComponent.getClientId(facesContext);
+                fileItem = (FileItem) fileItems.get(paramName);
+            }
+            if (fileItem != null)
+            {
+                try{
+                    UploadedFile upFile;
+                    String implementation = ((HtmlInputFileUpload) uiComponent).getStorage();
+                    if( implementation == null || ("memory").equals( implementation ) )
+                        upFile = new UploadedFileDefaultMemoryImpl( fileItem );
+                    else
+                        upFile = new UploadedFileDefaultFileImpl( fileItem );
+                    ((HtmlInputFileUpload)uiComponent).setSubmittedValue(upFile);
+                    ((HtmlInputFileUpload)uiComponent).setValid(true);
+                }catch(IOException ioe){
+                    log.error(ioe);
+                }
+            }
+            return;
+        }
         if(facesContext.getExternalContext().getRequest() instanceof ServletRequest)
         {
             ServletRequest multipartRequest = (ServletRequest)facesContext.getExternalContext().getRequest();
             while (multipartRequest != null &&
-                   !(multipartRequest instanceof MultipartRequestWrapper))
+                    !(multipartRequest instanceof MultipartRequestWrapper))
             {
                 if (multipartRequest instanceof HttpServletRequestWrapper)
                 {