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 2013/09/10 00:02:57 UTC

svn commit: r1521301 - in /myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html: HtmlInputFileRendererBase.java util/HttpPartWrapper.java

Author: lu4242
Date: Mon Sep  9 22:02:57 2013
New Revision: 1521301

URL: http://svn.apache.org/r1521301
Log:
MYFACES-3716 Implement h:inputFile (thanks to Dora Rajappan for help with this issue)

Added:
    myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/util/HttpPartWrapper.java   (with props)
Modified:
    myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlInputFileRendererBase.java

Modified: myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlInputFileRendererBase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlInputFileRendererBase.java?rev=1521301&r1=1521300&r2=1521301&view=diff
==============================================================================
--- myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlInputFileRendererBase.java (original)
+++ myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/HtmlInputFileRendererBase.java Mon Sep  9 22:02:57 2013
@@ -32,11 +32,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.faces.FacesException;
+import javax.faces.application.FacesMessage;
+import javax.faces.application.ProjectStage;
 import javax.faces.component.UIViewRoot;
 import javax.faces.component.behavior.ClientBehavior;
 import javax.faces.component.behavior.ClientBehaviorHolder;
+import javax.faces.component.html.HtmlForm;
 import javax.faces.component.html.HtmlInputText;
+import org.apache.myfaces.shared.renderkit.html.util.FormInfo;
+import org.apache.myfaces.shared.renderkit.html.util.HttpPartWrapper;
 import org.apache.myfaces.shared.renderkit.html.util.JavascriptUtils;
+import org.apache.myfaces.shared.util._ComponentUtils;
 
 /**
  * @author Werner Punz (latest modification by $Author$)
@@ -52,7 +59,6 @@ public class HtmlInputFileRendererBase e
     @Override
     public void decode(FacesContext facesContext, UIComponent component)
     {
-        //TODO: implement me!
         try
         {
            Part part = ((HttpServletRequest) facesContext.getExternalContext().getRequest()).
@@ -62,15 +68,15 @@ public class HtmlInputFileRendererBase e
            {
                return;
            }
-           ((UIInput) component).setSubmittedValue(part);
+           ((UIInput) component).setSubmittedValue(new HttpPartWrapper(part));
         }
         catch (IOException e)
         {
-           e.printStackTrace();
+            throw new FacesException(e);
         }
         catch (ServletException e)
         {
-           e.printStackTrace();
+            throw new FacesException(e);
         }
         
         if (component instanceof ClientBehaviorHolder &&
@@ -86,27 +92,25 @@ public class HtmlInputFileRendererBase e
     {   
         renderInput(facesContext, component);
         
-        // TODO: "... verify that the enclosing form has an enctype ..." is different than
-        // "... check the incoming request has an enctype ...". The code below do that, but
-        // what we really want to do is check if there is a parent in the component
-        // hierarchy that is UIForm and has "multipart/form-data" content type. I'll comment
-        // this code temporally.
-        /*
         if(!facesContext.isProjectStage(ProjectStage.Production) 
               && facesContext.isPostback() &&
              (facesContext.getPartialViewContext().isPartialRequest() ||
               facesContext.getPartialViewContext().isAjaxRequest()))
         {
-            String content = ((HttpServletRequest) facesContext.getExternalContext()
-                 .getRequest()).getContentType();
-            if(content==null || !content.contains("multipart/form-data"))
-            {
-                 //Add facemessage
-                 FacesMessage message = new FacesMessage("file upload requires a form with"+
-                 " enctype equal to multipart/form-data");
-                 facesContext.addMessage(component.getClientId(), message);
+            FormInfo formInfo = _ComponentUtils.findNestingForm(component, facesContext);
+            if (formInfo != null && formInfo.getForm() instanceof HtmlForm)
+            {
+                HtmlForm form = (HtmlForm) formInfo.getForm();
+                String content = form.getEnctype();
+                if(content==null || !content.contains("multipart/form-data"))
+                {
+                     //Add facemessage
+                     FacesMessage message = new FacesMessage("file upload requires a form with"+
+                            " enctype equal to multipart/form-data");
+                     facesContext.addMessage(component.getClientId(), message);
+                }
             }
-        }*/
+        }
     }
    
     public Object getConvertedValue(FacesContext context, UIComponent component, Object submittedValue)

Added: myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/util/HttpPartWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/util/HttpPartWrapper.java?rev=1521301&view=auto
==============================================================================
--- myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/util/HttpPartWrapper.java (added)
+++ myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/util/HttpPartWrapper.java Mon Sep  9 22:02:57 2013
@@ -0,0 +1,114 @@
+/*
+ * 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.shared.renderkit.html.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import javax.faces.FacesWrapper;
+import javax.faces.component.StateHolder;
+import javax.faces.context.FacesContext;
+import javax.servlet.http.Part;
+
+/**
+ *
+ * @author Leonardo Uribe
+ */
+public class HttpPartWrapper implements Part, FacesWrapper<Part>, StateHolder
+{
+    private Part delegate;
+
+    public HttpPartWrapper()
+    {
+    }
+    
+    public HttpPartWrapper(Part delegate)
+    {
+        this.delegate = delegate;
+    }
+
+    public void delete() throws IOException
+    {
+        getWrapped().delete();
+    }
+
+    public String getContentType()
+    {
+        return getWrapped().getContentType();
+    }
+
+    public String getHeader(String headerName)
+    {
+        return getWrapped().getHeader(headerName);
+    }
+
+    public Collection<String> getHeaderNames()
+    {
+        return getWrapped().getHeaderNames();
+    }
+
+    public Collection<String> getHeaders(String headerName)
+    {
+        return getWrapped().getHeaders(headerName);
+    }
+
+    public InputStream getInputStream() throws IOException
+    {
+        return getWrapped().getInputStream();
+    }
+
+    public String getName()
+    {
+        return getWrapped().getName();
+    }
+
+    public long getSize()
+    {
+        return getWrapped().getSize();
+    }
+
+    public void write(String fileName) throws IOException
+    {
+        getWrapped().write(fileName);
+    }
+
+    public Object saveState(FacesContext context)
+    {
+        return null;
+    }
+
+    public void restoreState(FacesContext context, Object state)
+    {
+    }
+
+    public boolean isTransient()
+    {
+        return true;
+    }
+
+    public void setTransient(boolean newTransientValue)
+    {
+    }
+
+    public Part getWrapped()
+    {
+        return delegate;
+    }
+    
+}

Propchange: myfaces/core/trunk/shared/src/main/java/org/apache/myfaces/shared/renderkit/html/util/HttpPartWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native