You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2010/06/17 03:59:58 UTC

svn commit: r955453 - in /myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/fileupload: ./ HtmlFileUploadRenderer.java

Author: lu4242
Date: Thu Jun 17 01:59:57 2010
New Revision: 955453

URL: http://svn.apache.org/viewvc?rev=955453&view=rev
Log:
TOMAHAWK-1474 Behavior support for components that contains event aware properties in jsf 2.0 module

Added:
    myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/fileupload/
    myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java

Added: myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java?rev=955453&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java (added)
+++ myfaces/tomahawk/trunk/core20/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java Thu Jun 17 01:59:57 2010
@@ -0,0 +1,257 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.custom.fileupload;
+
+import org.apache.myfaces.component.UserRoleUtils;
+import org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.util.ResourceUtils;
+import org.apache.myfaces.webapp.filter.MultipartRequestWrapper;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.behavior.ClientBehavior;
+import javax.faces.component.behavior.ClientBehaviorHolder;
+import javax.faces.context.FacesContext;
+import javax.faces.FacesException;
+import javax.faces.context.ResponseWriter;
+import javax.faces.context.ExternalContext;
+import javax.faces.convert.ConverterException;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Renderer for the HtmlInputFileUpload component.
+ * <p>
+ * See also class AbstractHtmlInputFileUpload.
+ * 
+ * @JSFRenderer
+ *   renderKitId = "HTML_BASIC" 
+ *   family = "javax.faces.Input"
+ *   type = "org.apache.myfaces.FileUpload"
+ * 
+ * @author Manfred Geiler (latest modification by $Author: lu4242 $)
+ * @version $Revision: 782515 $ $Date: 2009-06-07 22:28:42 -0500 (dom, 07 jun 2009) $
+ */
+public class HtmlFileUploadRenderer
+        extends HtmlRenderer
+{
+    private static final Log log = LogFactory.getLog(HtmlFileUploadRenderer.class);
+
+    public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)
+            throws IOException
+    {
+        super.encodeEnd(facesContext, uiComponent); //check for NP
+
+        ResponseWriter writer = facesContext.getResponseWriter();
+        
+        Map<String, List<ClientBehavior>> behaviors = null;
+        if (uiComponent instanceof ClientBehaviorHolder)
+        {
+            behaviors = ((ClientBehaviorHolder) uiComponent).getClientBehaviors();
+            if (!behaviors.isEmpty())
+            {
+                ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, facesContext.getResponseWriter());
+            }
+        }
+        
+        writer.startElement(HTML.INPUT_ELEM, uiComponent);
+        writer.writeAttribute(HTML.TYPE_ATTR, HTML.FILE_ATTR, null);
+        String clientId = uiComponent.getClientId(facesContext);
+        renderId(facesContext, uiComponent);
+        writer.writeAttribute(HTML.NAME_ATTR, clientId, null);
+        UploadedFile value = (UploadedFile)((HtmlInputFileUpload)uiComponent).getValue();
+        if (value != null)
+        {
+            if( value.getName() != null )
+            {
+                writer.writeAttribute(HTML.VALUE_ATTR, value.getName(), null);
+            }
+        }
+        
+        if (behaviors != null && !behaviors.isEmpty())
+        {
+            HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.INPUT_FILE_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS);
+            HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent, behaviors);
+            HtmlRendererUtils.renderBehaviorizedFieldEventHandlers(facesContext, writer, uiComponent, behaviors);
+        }
+        else
+        {
+            HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.INPUT_FILE_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
+        }
+        
+        if (isDisabled(facesContext, uiComponent))
+        {
+            writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE, null);
+        }
+
+        writer.endElement(HTML.INPUT_ELEM);
+    }
+
+    protected boolean isDisabled(FacesContext facesContext, UIComponent uiComponent)
+    {
+        if (!UserRoleUtils.isEnabledOnUserRole(uiComponent))
+        {
+            //if the user is not enabled, the component is
+            //disabled, so it should return true.
+            return true;
+        }
+        else
+        {
+            if (uiComponent instanceof HtmlInputFileUpload)
+            {
+                return ((HtmlInputFileUpload)uiComponent).isDisabled();
+            }
+            else
+            {
+                return RendererUtils.getBooleanAttribute(uiComponent, HTML.DISABLED_ATTR, false);
+            }
+        }
+    }
+
+    private void setSubmittedValueForImplementation(
+        FacesContext facesContext, UIComponent uiComponent, FileItem fileItem)
+    {
+        try
+        {
+            UploadedFile upFile;
+            String implementation =
+                ((HtmlInputFileUpload)uiComponent).getStorage();
+            if (implementation == null || implementation.length() == 0)
+            {
+                implementation = "default";
+            }
+            if (("memory").equals(implementation))
+            {
+                upFile = new UploadedFileDefaultMemoryImpl(fileItem);
+            }
+            else if (("default").equals(implementation))
+            {
+                if (fileItem.isInMemory())
+                {
+                    upFile = new UploadedFileDefaultMemoryImpl(fileItem);
+                }
+                else
+                {
+                    upFile = new UploadedFileDefaultFileImpl(fileItem);                    
+                }
+            }
+            else //"file" case
+            {
+                upFile = new UploadedFileDefaultFileImpl(fileItem);
+            }
+
+            ((HtmlInputFileUpload)uiComponent).setSubmittedValue(upFile);
+            ((HtmlInputFileUpload)uiComponent).setValid(true);
+        }
+        catch (IOException ioe)
+        {
+            throw new FacesException(
+                "Exception while processing file upload for file-input : "
+                    + uiComponent.getClientId(facesContext), ioe);
+        }
+    }
+
+    /**
+     * Handle the postback of a form containing a fileUpload component.
+     * <p>
+     * The browser request will have been in "multi-part-mime" format, where
+     * the normal http post is in one part, and the file being uploaded is
+     * in another. Hopefully JSF has been configured so that this special
+     * request is wrapped in a custom ServletRequest that allows us to
+     * fetch that extra data....
+     */
+    public void decode(FacesContext facesContext, UIComponent uiComponent)
+    {
+        super.decode(facesContext, uiComponent); //check for NP
+
+        HtmlRendererUtils.decodeClientBehaviors(facesContext, uiComponent);
+        //MultipartWrapper might have been wrapped again by one or more additional
+        //Filters. We try to find the MultipartWrapper, but if a filter has wrapped
+        //the ServletRequest with a class other than HttpServletRequestWrapper
+        //this will fail.
+        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)
+            {
+                setSubmittedValueForImplementation(facesContext, uiComponent, fileItem);
+            }
+            return;
+        }
+        if(facesContext.getExternalContext().getRequest() instanceof ServletRequest)
+        {
+            ServletRequest multipartRequest = (ServletRequest)facesContext.getExternalContext().getRequest();
+            while (multipartRequest != null &&
+                    !(multipartRequest instanceof MultipartRequestWrapper))
+            {
+                if (multipartRequest instanceof HttpServletRequestWrapper)
+                {
+                    multipartRequest = ((HttpServletRequestWrapper)multipartRequest).getRequest();
+                }
+                else
+                {
+                    multipartRequest = null;
+                }
+            }
+
+            if (multipartRequest != null)
+            {
+                MultipartRequestWrapper mpReq = (MultipartRequestWrapper)multipartRequest;
+
+                String paramName = uiComponent.getClientId(facesContext);
+                FileItem fileItem = mpReq.getFileItem(paramName);
+                if (fileItem != null)
+                {
+                    setSubmittedValueForImplementation(facesContext, uiComponent, fileItem);
+                }
+            }
+        }
+    }
+
+    public Object getConvertedValue(FacesContext context, UIComponent component, Object submittedValue) throws ConverterException
+    {
+        if(submittedValue instanceof UploadedFile)
+        {
+            UploadedFile file = (UploadedFile) submittedValue;
+
+            if(file.getSize()>0 && file.getName()!=null && file.getName().length()>0)
+            {
+                return file;
+            }
+        }
+
+        return null;
+    }
+}