jsr344-experts@javaserverfaces-spec-public.java.net

[jsr344-experts] Re: [1062-NonAjaxFileUpload] PROPOSAL (already committed but changeable)

From: Neil Griffin <neil.griffin_at_portletfaces.org>
Date: Fri, 16 Dec 2011 16:53:11 -0500

Hi Ed,

I'm taking some time off from the job here at home until the end of the year. I'm back on the job January 2nd and I'll work to get you an answer to the action in the 1st or 2nd week of January.

Also at that time, I'll need to address the following issue and improve the contribution I provided to you:
http://jira.portletfaces.org/browse/BRIDGE-251

Thanks, and I'm delighted to see this one committed! :-)

Neil

On Dec 15, 2011, at 3:39 PM, Edward Burns wrote:

> Hello Team,
>
> As a precondition for solving 802-AjaxFileUpload, we need to have the
> non-Ajax case working first.
>
> This commit makes this work. The change bundle is at [1] but I put it
> here for your convenience.
>
> You can browse the javadoc changes at [2]. Unfortunately, the color
> background for the changebars in the javadocs doesn't work, but if you
> look closely, there is a thin colored bar where the color coded changes
> should be. I think the file gets corrupted in the maven publishing
> process because it works when you build the spec locally.
>
> The color coding does work in the RenderKit and Facelet VDLDocs, though.
>
> Neil Griffin, there's an action item in here for you, and thanks for the
> commit on 20110613.
>
> 8<----------------
>
> First spec and impl of non-AJax file upload http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1062
>
> This changebundle is derived from the work that Neil Griffin committed
> to <https://svn.java.net/svn/mojarra~svn/branches/FILE_UPLOAD> on
> 20110613, with the following changes.
>
> * I was able to drop many files from his implementation, and also remove
> all apache commons dependencies, by the design choice to require the
> multipart support in Servlet 3.0. This is the first time JSF has
> required Servlet 3.0 in practice.
>
> * Neil's 20110613 commit handled portlet support by providing portlet
> friendly implementations of RequestParameterMap specific for multipart
> support. This approach required changes to ExternalContextImpl. This
> implementation requires no such changes because of the enabling
> assumption of Servlet 3.0. This begs the question: what is the
> portlet support story for file upload in JSF 2.2?
>
> Answer: override the HTML_BASIC renderer for javax.faces.Input
> javax.faces.File to do all the stuff that Neil's approach does in
> those files that I dropped. I assert that it is safe to encapsulate
> that all within the contract of the Renderer.
>
> ACTION: Neil: I need you to test that assertion.
>
> SECTION: Modified Files
> ----------------------------
> M jsf-ri/src/main/resources/com/sun/faces/standard-html-renderkit-impl.xml
> M jsf-api/doc/standard-html-renderkit-base.xml
> M jsf-api/doc/standard-html-renderkit.xml
>
> - Declare the contract for new HTML_BASIC renderer: javax.faces.Input
> javax.faces.File.
>
> M jsf-ri/src/main/java/com/sun/faces/renderkit/html_basic/TextRenderer.java
> A jsf-ri/src/main/java/com/sun/faces/renderkit/html_basic/FileRenderer.java
>
> - The FileRenderer implementation
>
> M jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/html/HtmlDecorator.java
> M jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/html/HtmlLibrary.java
>
> - The tag handler.
>
> M jsf-api/src/main/java/javax/faces/webapp/FacesServlet.java
>
> - The FacesServlet must now have the "@MultipartConfig" annotation.
> This is necessary so that the runtime can use javax.servlet.http.Part.
>
> M jsf-tools/src/main/resources/com/sun/faces/generate/facesdoc/stylesheet.css
> M jsf-ri/conf/share/tlddoc-resources/stylesheet.css
>
> - changebars
>
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main/java
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main/java/com
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main/java/com/sun
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main/java/com/sun/faces
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main/java/com/sun/faces/i_spec_802_htmlunit
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main/java/com/sun/faces/i_spec_802_htmlunit/Issue802TestCase.java
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/pom.xml
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces/i_spec_802_war
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces/i_spec_802_war/UserBean.java
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces/i_spec_802_war/FileValidator.java
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/main.xhtml
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/WEB-INF
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/WEB-INF/beans.xml
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/WEB-INF/web.xml
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/pom.xml
> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/build.xml
>
> - sample app
>
>
> SECTION: Diffs
> ----------------------------
> Index: jsf-tools/src/main/resources/com/sun/faces/generate/facesdoc/stylesheet.css
> ===================================================================
> --- jsf-tools/src/main/resources/com/sun/faces/generate/facesdoc/stylesheet.css (revision 9513)
> +++ jsf-tools/src/main/resources/com/sun/faces/generate/facesdoc/stylesheet.css (working copy)
> @@ -151,14 +151,20 @@
> border-top:none; border-bottom:none; border-color:red;
> text-decoration: line-through; }
>
> -a[href^="HTML_BASIC/javax.faces.Outputjavax.faces.Link.html"],a[href^="HTML_BASIC/javax.faces.Outputjavax.faces.Text.html"], a[href^="HTML_BASIC/javax.faces.Inputjavax.faces.Text.html"]{ cursor: url(changed_modified_2_2_cursor.cur), auto;
> +a[href^="HTML_BASIC/javax.faces.Messagejavax.faces.Message.html"], a[href^="HTML_BASIC/javax.faces.Outputjavax.faces.Link.html"], a[href^="HTML_BASIC/javax.faces.Outputjavax.faces.Text.html"], a[href^="HTML_BASIC/javax.faces.Inputjavax.faces.Text.html"]{ cursor: url(changed_modified_2_2_cursor.cur), auto;
> background: url(changed_modified_2_2.png);
> padding-left:0.2em; border-left:solid;
> border-left-width:thin; border-right:none;
> border-top:none; border-bottom:none; border-color:orange }
>
> +a[href^="HTML_BASIC/javax.faces.Inputjavax.faces.File.html"] { cursor: url(changed_added_2_2_cursor.cur), auto;
> + background: url(changed_added_2_2.png);
> + padding-left:0.2em; border-left:solid;
> + border-left-width:thin; border-right:none;
> + border-top:none; border-bottom:none; border-color:green }
>
>
>
> +
> .javadocSection { font-size: large; }
>
> Index: jsf-ri/conf/share/tlddoc-resources/stylesheet.css
> ===================================================================
> --- jsf-ri/conf/share/tlddoc-resources/stylesheet.css (revision 9513)
> +++ jsf-ri/conf/share/tlddoc-resources/stylesheet.css (working copy)
> @@ -549,13 +549,13 @@
> text-decoration: line-through; }
>
>
> -a[href^="selectItems.html"], a[href^="f/selectItems.html"],a[href^="viewParam.html"], a[href^="f/viewParam.html"], a[href^="f/tld-frame"], a[href^="ui/tld-frame"], a[href^="ui/component.html"], a[href^="component.html"], a[href^="ui/fragment.html"], a[href^="fragment.html"], a[href^="ui/composition.html"], a[href^="composition.html"], a[href^="ui/decorate.html"], a[href^="decorate.html"], a[href^="ajax.html"], a[href^="f/ajax.html"] { cursor: url(changed_modified_2_2_cursor.cur), auto;
> +a[href^="selectItems.html"], a[href^="f/selectItems.html"],a[href^="viewParam.html"], a[href^="f/viewParam.html"], a[href^="f/tld-frame"], a[href^="h/tld-frame"], a[href^="ui/tld-frame"], a[href^="f/tld-frame"], a[href^="ui/component.html"], a[href^="component.html"], a[href^="ui/fragment.html"], a[href^="fragment.html"], a[href^="ui/composition.html"], a[href^="composition.html"], a[href^="ui/decorate.html"], a[href^="decorate.html"], a[href^="ajax.html"], a[href^="f/ajax.html"] { cursor: url(changed_modified_2_2_cursor.cur), auto;
> background: url(changed_modified_2_2.png);
> padding-left:0.2em; border-left:solid;
> border-left-width:thin; border-right:none;
> border-top:none; border-bottom:none; border-color:orange }
>
> -a[href^="viewAction.html"], a[href^="f/viewAction.html"] { cursor: url(changed_added_2_2_cursor.cur), auto;
> +a[href^="viewAction.html"], a[href^="f/viewAction.html"], a[href^="h/inputFile.html"] { cursor: url(changed_added_2_2_cursor.cur), auto;
> background: url(changed_added_2_2.png);
> padding-left:0.2em; border-left:solid;
> border-left-width:thin; border-right:none;
> Index: jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/html/HtmlDecorator.java
> ===================================================================
> --- jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/html/HtmlDecorator.java (revision 9513)
> +++ jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/html/HtmlDecorator.java (working copy)
> @@ -123,6 +123,11 @@
> HtmlLibrary.Namespace, "commandButton", tag
> .getQName(), na);
> }
> + if ("file".equals(t)) {
> + return new Tag(tag.getLocation(),
> + HtmlLibrary.Namespace, "inputFile", tag
> + .getQName(), na);
> + }
> }
> }
> }
> Index: jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/html/HtmlLibrary.java
> ===================================================================
> --- jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/html/HtmlLibrary.java (revision 9513)
> +++ jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/html/HtmlLibrary.java (working copy)
> @@ -102,6 +102,9 @@
> this.addHtmlComponent("doctype", "javax.faces.Output",
> "javax.faces.Doctype");
>
> + this.addHtmlComponent("inputFile", "javax.faces.HtmlInputFile",
> + "javax.faces.File");
> +
> this.addHtmlComponent("inputHidden", "javax.faces.HtmlInputHidden",
> "javax.faces.Hidden");
>
> Index: jsf-ri/src/main/java/com/sun/faces/renderkit/html_basic/FileRenderer.java
> ===================================================================
> --- jsf-ri/src/main/java/com/sun/faces/renderkit/html_basic/FileRenderer.java (revision 0)
> +++ jsf-ri/src/main/java/com/sun/faces/renderkit/html_basic/FileRenderer.java (revision 0)
> @@ -0,0 +1,112 @@
> +/*
> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
> + *
> + * Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
> + *
> + * The contents of this file are subject to the terms of either the GNU
> + * General Public License Version 2 only ("GPL") or the Common Development
> + * and Distribution License("CDDL") (collectively, the "License"). You
> + * may not use this file except in compliance with the License. You can
> + * obtain a copy of the License at
> + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
> + * or packager/legal/LICENSE.txt. See the License for the specific
> + * language governing permissions and limitations under the License.
> + *
> + * When distributing the software, include this License Header Notice in each
> + * file and include the License file at packager/legal/LICENSE.txt.
> + *
> + * GPL Classpath Exception:
> + * Oracle designates this particular file as subject to the "Classpath"
> + * exception as provided by Oracle in the GPL Version 2 section of the License
> + * file that accompanied this code.
> + *
> + * Modifications:
> + * If applicable, add the following below the License Header, with the fields
> + * enclosed by brackets [] replaced by your own identifying information:
> + * "Portions Copyright [year] [name of copyright owner]"
> + *
> + * Contributor(s):
> + * If you wish your version of this file to be governed by only the CDDL or
> + * only the GPL Version 2, indicate your decision by adding "[Contributor]
> + * elects to include this software in this distribution under the [CDDL or GPL
> + * Version 2] license." If you don't indicate a single choice of license, a
> + * recipient has the option to distribute your version of this file under
> + * either the CDDL, the GPL Version 2 or to extend the choice of license to
> + * its licensees as provided above. However, if you add GPL Version 2 code
> + * and therefore, elected the GPL Version 2 license, then the option applies
> + * only if the new code is made subject to such option by the copyright
> + * holder.
> + */
> +
> +// FileRenderer.java
> +
> +package com.sun.faces.renderkit.html_basic;
> +
> +import java.io.IOException;
> +import java.util.Collection;
> +import java.util.Map;
> +import java.util.logging.Level;
> +
> +import javax.faces.component.UIComponent;
> +import javax.faces.context.ExternalContext;
> +import javax.faces.context.FacesContext;
> +import javax.faces.convert.ConverterException;
> +import javax.servlet.ServletException;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.Part;
> +
> +public class FileRenderer extends TextRenderer {
> +
> + // ---------------------------------------------------------- Public Methods
> +
> + @Override
> + public void decode(FacesContext context, UIComponent component) {
> +
> + rendererParamsNotNull(context, component);
> +
> + if (!shouldDecode(component)) {
> + return;
> + }
> +
> + String clientId = decodeBehaviors(context, component);
> +
> + if (clientId == null) {
> + clientId = component.getClientId(context);
> + }
> +
> + assert(clientId != null);
> + ExternalContext externalContext = context.getExternalContext();
> + Map<String, String> requestMap = externalContext.getRequestParameterMap();
> +
> + if (requestMap.containsKey(clientId)) {
> + setSubmittedValue(component, requestMap.get(clientId));
> + }
> +
> + HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
> + try {
> + Collection<Part> parts = request.getParts();
> + for (Part cur : parts) {
> + if (clientId.equals(cur.getName())) {
> + setSubmittedValue(component, cur);
> + }
> + }
> + } catch (IOException ioe) {
> + if (logger.isLoggable(Level.SEVERE)) {
> + logger.log(Level.SEVERE, "Unable to get parts for " + clientId, ioe);
> + }
> + } catch (ServletException se) {
> + if (logger.isLoggable(Level.SEVERE)) {
> + logger.log(Level.SEVERE, "Unable to get parts for " + clientId, se);
> + }
> + }
> +
> + }
> +
> + @Override
> + public Object getConvertedValue(FacesContext context, UIComponent component, Object submittedValue) throws ConverterException {
> + return submittedValue;
> + }
> +
> +
> +
> +}
> Index: jsf-ri/src/main/java/com/sun/faces/renderkit/html_basic/TextRenderer.java
> ===================================================================
> --- jsf-ri/src/main/java/com/sun/faces/renderkit/html_basic/TextRenderer.java (revision 9513)
> +++ jsf-ri/src/main/java/com/sun/faces/renderkit/html_basic/TextRenderer.java (working copy)
> @@ -44,6 +44,7 @@
>
> import java.io.IOException;
>
> +import javax.faces.component.html.HtmlInputFile; // FILE_UPLOAD
> import javax.faces.component.UIComponent;
> import javax.faces.component.UIInput;
> import javax.faces.component.UIOutput;
> @@ -102,7 +103,14 @@
> if (component instanceof UIInput) {
> writer.startElement("input", component);
> writeIdAttributeIfNecessary(context, writer, component);
> - writer.writeAttribute("type", "text", null);
> +
> + if (component instanceof HtmlInputFile) {
> + writer.writeAttribute("type", "file", null);
> + writer.writeAttribute("value", "", null);
> + }
> + else {
> + writer.writeAttribute("type", "text", null);
> + }
> writer.writeAttribute("name", (component.getClientId(context)),
> "clientId");
>
> Index: jsf-ri/src/main/resources/com/sun/faces/standard-html-renderkit-impl.xml
> ===================================================================
> --- jsf-ri/src/main/resources/com/sun/faces/standard-html-renderkit-impl.xml (revision 9513)
> +++ jsf-ri/src/main/resources/com/sun/faces/standard-html-renderkit-impl.xml (working copy)
> @@ -56,6 +56,9 @@
> <graphic-image-renderer-class>
> com.sun.faces.renderkit.html_basic.ImageRenderer
> </graphic-image-renderer-class>
> + <input-file-renderer-class>
> + com.sun.faces.renderkit.html_basic.FileRenderer
> + </input-file-renderer-class>
> <input-hidden-renderer-class>
> com.sun.faces.renderkit.html_basic.HiddenRenderer
> </input-hidden-renderer-class>
> Index: jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main/java/com/sun/faces/i_spec_802_htmlunit/Issue802TestCase.java
> ===================================================================
> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main/java/com/sun/faces/i_spec_802_htmlunit/Issue802TestCase.java (revision 0)
> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/src/main/java/com/sun/faces/i_spec_802_htmlunit/Issue802TestCase.java (revision 0)
> @@ -0,0 +1,75 @@
> +/*
> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
> + *
> + * Copyright (c) 1997-2011 Oracle and/or its affiliates. All rights reserved.
> + *
> + * The contents of this file are subject to the terms of either the GNU
> + * General Public License Version 2 only ("GPL") or the Common Development
> + * and Distribution License("CDDL") (collectively, the "License"). You
> + * may not use this file except in compliance with the License. You can
> + * obtain a copy of the License at
> + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
> + * or packager/legal/LICENSE.txt. See the License for the specific
> + * language governing permissions and limitations under the License.
> + *
> + * When distributing the software, include this License Header Notice in each
> + * file and include the License file at packager/legal/LICENSE.txt.
> + *
> + * GPL Classpath Exception:
> + * Oracle designates this particular file as subject to the "Classpath"
> + * exception as provided by Oracle in the GPL Version 2 section of the License
> + * file that accompanied this code.
> + *
> + * Modifications:
> + * If applicable, add the following below the License Header, with the fields
> + * enclosed by brackets [] replaced by your own identifying information:
> + * "Portions Copyright [year] [name of copyright owner]"
> + *
> + * Contributor(s):
> + * If you wish your version of this file to be governed by only the CDDL or
> + * only the GPL Version 2, indicate your decision by adding "[Contributor]
> + * elects to include this software in this distribution under the [CDDL or GPL
> + * Version 2] license." If you don't indicate a single choice of license, a
> + * recipient has the option to distribute your version of this file under
> + * either the CDDL, the GPL Version 2 or to extend the choice of license to
> + * its licensees as provided above. However, if you add GPL Version 2 code
> + * and therefore, elected the GPL Version 2 license, then the option applies
> + * only if the new code is made subject to such option by the copyright
> + * holder.
> + */
> +
> +package com.sun.faces.i_spec_802_htmlunit;
> +
> +import com.gargoylesoftware.htmlunit.html.HtmlPage;
> +
> +import com.sun.faces.htmlunit.HtmlUnitFacesTestCase;
> +import junit.framework.Test;
> +import junit.framework.TestSuite;
> +
> +
> +public class Issue802TestCase extends HtmlUnitFacesTestCase {
> +
> + public Issue802TestCase(String name) {
> + super(name);
> + }
> +
> +
> + /**
> + * Return the tests included in this test suite.
> + */
> + public static Test suite() {
> + return (new TestSuite(Issue802TestCase.class));
> + }
> +
> +
> + // ------------------------------------------------------------ Test Methods
> +
> + public void testBasicAppFunctionality() throws Exception {
> +
> + HtmlPage page = getPage("/");
> +
> + assertTrue(page.asXml().contains("javax.faces.ViewState"));
> + }
> +
> +
> +}
> Index: jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/pom.xml
> ===================================================================
> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/pom.xml (revision 0)
> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_htmlunit/pom.xml (revision 0)
> @@ -0,0 +1,97 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<!--
> +
> + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
> +
> + Copyright (c) 1997-2011 Oracle and/or its affiliates. All rights reserved.
> +
> + The contents of this file are subject to the terms of either the GNU
> + General Public License Version 2 only ("GPL") or the Common Development
> + and Distribution License("CDDL") (collectively, the "License"). You
> + may not use this file except in compliance with the License. You can
> + obtain a copy of the License at
> + https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
> + or packager/legal/LICENSE.txt. See the License for the specific
> + language governing permissions and limitations under the License.
> +
> + When distributing the software, include this License Header Notice in each
> + file and include the License file at packager/legal/LICENSE.txt.
> +
> + GPL Classpath Exception:
> + Oracle designates this particular file as subject to the "Classpath"
> + exception as provided by Oracle in the GPL Version 2 section of the License
> + file that accompanied this code.
> +
> + Modifications:
> + If applicable, add the following below the License Header, with the fields
> + enclosed by brackets [] replaced by your own identifying information:
> + "Portions Copyright [year] [name of copyright owner]"
> +
> + Contributor(s):
> + If you wish your version of this file to be governed by only the CDDL or
> + only the GPL Version 2, indicate your decision by adding "[Contributor]
> + elects to include this software in this distribution under the [CDDL or GPL
> + Version 2] license." If you don't indicate a single choice of license, a
> + recipient has the option to distribute your version of this file under
> + either the CDDL, the GPL Version 2 or to extend the choice of license to
> + its licensees as provided above. However, if you add GPL Version 2 code
> + and therefore, elected the GPL Version 2 license, then the option applies
> + only if the new code is made subject to such option by the copyright
> + holder.
> +
> +--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
> + <modelVersion>4.0.0</modelVersion>
> + <groupId>com.sun.faces</groupId>
> + <artifactId>i_spec_802_htmlunit</artifactId>
> + <packaging>jar</packaging>
> + <name>i_spec_802_htmlunit</name>
> + <version>1.0-SNAPSHOT</version>
> +
> + <dependencies>
> +
> + <dependency>
> + <artifactId>htmlunit</artifactId>
> + <groupId>net.sourceforge.htmlunit</groupId>
> + <version>2.4</version>
> + <scope>provided</scope>
> + </dependency>
> + <dependency>
> + <groupId>junit</groupId>
> + <artifactId>junit</artifactId>
> + <version>3.8.1</version>
> + <scope>provided</scope>
> + </dependency>
> + <dependency>
> + <groupId>com.sun.faces.extensions</groupId>
> + <artifactId>jsf-extensions-test-time</artifactId>
> + <version>2.0</version>
> + <scope>provided</scope>
> + </dependency>
> +
> + </dependencies>
> +
> + <build>
> + <plugins>
> + <plugin>
> + <groupId>org.apache.maven.plugins</groupId>
> + <artifactId>maven-compiler-plugin</artifactId>
> + <version>2.0.2</version>
> + <configuration>
> + <source>1.6</source>
> + <target>1.6</target>
> + </configuration>
> + </plugin>
> + </plugins>
> + <finalName>i_spec_802_htmlunit</finalName>
> + </build>
> +
> + <repositories>
> + <repository>
> + <id>java.net</id>
> + <name>java.net</name>
> + <url>http://download.java.net/maven/2</url>
> + <layout>default</layout>
> + </repository>
> + </repositories>
> +
> +</project>
> Index: jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces/i_spec_802_war/UserBean.java
> ===================================================================
> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces/i_spec_802_war/UserBean.java (revision 0)
> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces/i_spec_802_war/UserBean.java (revision 0)
> @@ -0,0 +1,40 @@
> +package com.sun.faces.i_spec_802_war;
> +
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.io.Serializable;
> +import java.util.Scanner;
> +import javax.enterprise.context.SessionScoped;
> +import javax.inject.Named;
> +import javax.servlet.http.Part;
> +
> +_at_Named
> +_at_SessionScoped
> +public class UserBean implements Serializable {
> +
> + private Part uploadedFile;
> +
> + public Part getUploadedFile() {
> + return uploadedFile;
> + }
> +
> + public void setUploadedFile(Part uploadedFile) {
> + this.uploadedFile = uploadedFile;
> + }
> +
> + public String getFileText() {
> + String text = "";
> +
> + if (null != uploadedFile) {
> + try {
> + InputStream is = uploadedFile.getInputStream();
> + text = new Scanner( is ).useDelimiter("\\A").next();
> + } catch (IOException ex) {
> +
> + }
> + }
> + return text;
> + }
> +
> +}
> +
> Index: jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces/i_spec_802_war/FileValidator.java
> ===================================================================
> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces/i_spec_802_war/FileValidator.java (revision 0)
> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/java/com/sun/faces/i_spec_802_war/FileValidator.java (revision 0)
> @@ -0,0 +1,76 @@
> +/*
> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
> + *
> + * Copyright (c) 1997-2011 Oracle and/or its affiliates. All rights reserved.
> + *
> + * The contents of this file are subject to the terms of either the GNU
> + * General Public License Version 2 only ("GPL") or the Common Development
> + * and Distribution License("CDDL") (collectively, the "License"). You
> + * may not use this file except in compliance with the License. You can
> + * obtain a copy of the License at
> + * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
> + * or packager/legal/LICENSE.txt. See the License for the specific
> + * language governing permissions and limitations under the License.
> + *
> + * When distributing the software, include this License Header Notice in each
> + * file and include the License file at packager/legal/LICENSE.txt.
> + *
> + * GPL Classpath Exception:
> + * Oracle designates this particular file as subject to the "Classpath"
> + * exception as provided by Oracle in the GPL Version 2 section of the License
> + * file that accompanied this code.
> + *
> + * Modifications:
> + * If applicable, add the following below the License Header, with the fields
> + * enclosed by brackets [] replaced by your own identifying information:
> + * "Portions Copyright [year] [name of copyright owner]"
> + *
> + * Contributor(s):
> + * If you wish your version of this file to be governed by only the CDDL or
> + * only the GPL Version 2, indicate your decision by adding "[Contributor]
> + * elects to include this software in this distribution under the [CDDL or GPL
> + * Version 2] license." If you don't indicate a single choice of license, a
> + * recipient has the option to distribute your version of this file under
> + * either the CDDL, the GPL Version 2 or to extend the choice of license to
> + * its licensees as provided above. However, if you add GPL Version 2 code
> + * and therefore, elected the GPL Version 2 license, then the option applies
> + * only if the new code is made subject to such option by the copyright
> + * holder.
> +
> + */
> +package com.sun.faces.i_spec_802_war;
> +
> +import java.io.InputStream;
> +import java.util.Scanner;
> +import javax.faces.application.FacesMessage;
> +import javax.faces.component.UIComponent;
> +import javax.faces.context.FacesContext;
> +import javax.faces.validator.FacesValidator;
> +import javax.faces.validator.Validator;
> +import javax.faces.validator.ValidatorException;
> +import javax.servlet.http.Part;
> +
> +_at_FacesValidator(value="FileValidator")
> +public class FileValidator implements Validator {
> +
> + @Override
> + public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
> + Part file = (Part) value;
> +
> + try {
> + InputStream is = file.getInputStream();
> + String text = new Scanner( is ).useDelimiter("\\A").next();
> + // Do not accept an upload unless it contains the string
> + // JSR-344
> + if (!text.contains("JSR-344")) {
> + throw new ValidatorException(new FacesMessage("Invalid file. File must contain the string JSR-344"));
> + }
> + } catch (Exception ex) {
> + throw new ValidatorException(new FacesMessage("Invalid file"), ex);
> + }
> +
> + }
> +
> +
> +
> +}
> Index: jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/main.xhtml
> ===================================================================
> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/main.xhtml (revision 0)
> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/main.xhtml (revision 0)
> @@ -0,0 +1,18 @@
> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
> +<html xmlns="http://www.w3.org/1999/xhtml"
> + xmlns:h="http://java.sun.com/jsf/html"
> + xmlns:f="http://java.sun.com/jsf/core">
> + <h:head>
> + <title>A Simple JavaServer Faces 2.0 View</title>
> + </h:head>
> + <h:body>
> + <h:form prependId="false" enctype="multipart/form-data">
> + <h:inputFile id="fileUpload" value="#{userBean.uploadedFile}">
> + <f:validator validatorId="FileValidator" />
> + </h:inputFile>
> + <p><h:commandButton value="submit" /></p>
> + #{userBean.fileText}
> + <p><h:messages /></p>
> + </h:form>
> + </h:body>
> +</html>
> Index: jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/WEB-INF/beans.xml
> ===================================================================
> Index: jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/WEB-INF/web.xml
> ===================================================================
> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/WEB-INF/web.xml (revision 0)
> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/src/main/webapp/WEB-INF/web.xml (revision 0)
> @@ -0,0 +1,39 @@
> +<?xml version='1.0' encoding='UTF-8'?>
> +
> +<web-app version="3.0"
> + xmlns="http://java.sun.com/xml/ns/javaee"
> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
> +
> + <display-name>mojarra-regression-test</display-name>
> + <description>A simple regression test to make it easier to get your bug fixed. The only reason we need a web.xml is to set the PROJECT_STAGE to Develoment. If you have a web.xml, then you need to map the FacesServlet.</description>
> +
> + <context-param>
> + <description>
> + Tell the runtime where we are in the project development
> + lifecycle. Valid values are:
> + Development, UnitTest, SystemTest, or Production.
> + The runtime will display helpful hints to correct common mistakes
> + when the value is Development.
> + </description>
> + <param-name>javax.faces.PROJECT_STAGE</param-name>
> + <param-value>Development</param-value>
> + </context-param>
> +
> + <!-- Faces Servlet -->
> + <servlet>
> + <servlet-name>Faces Servlet</servlet-name>
> + <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
> + <load-on-startup>1</load-on-startup>
> + </servlet>
> +
> + <servlet-mapping>
> + <servlet-name>Faces Servlet</servlet-name>
> + <url-pattern>/faces/*</url-pattern>
> + </servlet-mapping>
> +
> + <welcome-file-list>
> + <welcome-file>faces/main.xhtml</welcome-file>
> + </welcome-file-list>
> +
> +</web-app>
> Index: jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/pom.xml
> ===================================================================
> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/pom.xml (revision 0)
> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/i_spec_802_war/pom.xml (revision 0)
> @@ -0,0 +1,46 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
> + <modelVersion>4.0.0</modelVersion>
> +
> + <groupId>com.sun.faces</groupId>
> + <artifactId>i_spec_802_war</artifactId>
> + <version>1.0-SNAPSHOT</version>
> + <packaging>war</packaging>
> + <name>${project.artifactId}</name>
> + <description>A simple project with war packaging that depends on JSF 2.2 and
> + javaee 6, in that order.</description>
> + <url>http://jsf-spec.java.net/</url>
> + <build>
> + <finalName>${project.artifactId}</finalName>
> + <plugins>
> + <plugin>
> + <artifactId>maven-compiler-plugin</artifactId>
> + <configuration>
> + <source>1.6</source>
> + <target>1.6</target>
> + </configuration>
> + </plugin>
> + <plugin>
> + <artifactId>maven-war-plugin</artifactId>
> + <configuration>
> + <failOnMissingWebXml>false</failOnMissingWebXml>
> + </configuration>
> + </plugin>
> +
> + </plugins>
> + </build>
> + <dependencies>
> + <dependency>
> + <groupId>javax.faces</groupId>
> + <artifactId>javax.faces-api</artifactId>
> + <version>2.2-SNAPSHOT</version>
> + <scope>provided</scope>
> + </dependency>
> + <dependency>
> + <groupId>javax</groupId>
> + <artifactId>javaee-api</artifactId>
> + <version>6.0</version>
> + <scope>provided</scope>
> + </dependency>
> + </dependencies>
> +</project>
> Index: jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/build.xml
> ===================================================================
> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/build.xml (revision 0)
> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-802/build.xml (revision 0)
> @@ -0,0 +1,90 @@
> +<?xml version='1.0' encoding='UTF-8'?>
> +<!--
> +
> + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
> +
> + Copyright (c) 1997-2011 Oracle and/or its affiliates. All rights reserved.
> +
> + The contents of this file are subject to the terms of either the GNU
> + General Public License Version 2 only ("GPL") or the Common Development
> + and Distribution License("CDDL") (collectively, the "License"). You
> + may not use this file except in compliance with the License. You can
> + obtain a copy of the License at
> + https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
> + or packager/legal/LICENSE.txt. See the License for the specific
> + language governing permissions and limitations under the License.
> +
> + When distributing the software, include this License Header Notice in each
> + file and include the License file at packager/legal/LICENSE.txt.
> +
> + GPL Classpath Exception:
> + Oracle designates this particular file as subject to the "Classpath"
> + exception as provided by Oracle in the GPL Version 2 section of the License
> + file that accompanied this code.
> +
> + Modifications:
> + If applicable, add the following below the License Header, with the fields
> + enclosed by brackets [] replaced by your own identifying information:
> + "Portions Copyright [year] [name of copyright owner]"
> +
> + Contributor(s):
> + If you wish your version of this file to be governed by only the CDDL or
> + only the GPL Version 2, indicate your decision by adding "[Contributor]
> + elects to include this software in this distribution under the [CDDL or GPL
> + Version 2] license." If you don't indicate a single choice of license, a
> + recipient has the option to distribute your version of this file under
> + either the CDDL, the GPL Version 2 or to extend the choice of license to
> + its licensees as provided above. However, if you add GPL Version 2 code
> + and therefore, elected the GPL Version 2 license, then the option applies
> + only if the new code is made subject to such option by the copyright
> + holder.
> +
> +-->
> +<!-- ************ JSF build file ************************************** -->
> +<project name="JAVASERVERFACES-i_spec_802" default="test" basedir=".">
> +
> + <property file="../../build.properties"/>
> + <path id="i_spec_802.classpath">
> + <path refid="html.classpath" />
> + <pathelement location="${basedir}/i_spec_802_htmlunit/target/classes"/>
> + </path>
> +
> + <import file="${jsf.build.home}/common/ant/common.xml"/>
> +
> + <target name="build">
> + <jsf.mvn dir="${basedir}/i_spec_802_war" goals="install" />
> + <jsf.mvn dir="${basedir}/i_spec_802_htmlunit" goals="install" />
> + </target>
> +
> + <target name="clean">
> + <jsf.mvn dir="${basedir}/i_spec_802_war" goals="clean" />
> + <jsf.mvn dir="${basedir}/i_spec_802_htmlunit" goals="clean" />
> + </target>
> +
> + <target name="install">
> + <deploy.artifact
> + artifact="${basedir}/i_spec_802_war/target/i_spec_802_war.war"
> + appName="i_spec_802_war"/>
> + </target>
> +
> + <target name="remove">
> + <undeploy.artifact
> + artifact="${basedir}/i_spec_802_war/target/i_spec_802_war.war"
> + appName="i_spec_802_war"/>
> + </target>
> +
> + <target name="test" depends="define.scenario.aware.port">
> +
> + <jsf.junit context-path="/i_spec_802_simple_war"
> + classpath-refid="i_spec_802.classpath"
> + test-results-dir="${regression.test.results.dir}">
> + <tests>
> + <fileset dir="${basedir}/i_spec_802_htmlunit/target/classes"
> + includes="com/sun/faces/i_spec_802_htmlunit/Issue802TestCase.class"/>
> + </tests>
> + </jsf.junit>
> +
> +
> + </target>
> +
> +</project>
> Index: jsf-api/doc/standard-html-renderkit-base.xml
> ===================================================================
> --- jsf-api/doc/standard-html-renderkit-base.xml (revision 9513)
> +++ jsf-api/doc/standard-html-renderkit-base.xml (working copy)
> @@ -502,6 +502,31 @@
>
> <description>
> <![CDATA[<p>Represents an HTML <code>input</code> element
> + of type <code>file</code>.</p>]]>
> + </description>
> + <display-name>Input File</display-name>
> + <component-type>javax.faces.HtmlInputFile</component-type>
> + <component-class>javax.faces.component.html.HtmlInputFile</component-class>
> +
> + <xi:include href="uiinput-props.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="core-props.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="events-props.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="focus-props.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="i18n-props.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="input-props.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="text-props.xml" xpointer="xpointer(/root/*)"/>
> +
> + <component-extension>
> + <base-component-type>javax.faces.Input</base-component-type>
> + <renderer-type>javax.faces.File</renderer-type>
> + </component-extension>
> +
> + </component>
> +
> + <component>
> +
> + <description>
> + <![CDATA[<p>Represents an HTML <code>input</code> element
> of type <code>hidden</code>.</p>]]>
> </description>
> <display-name>Input Hidden</display-name>
> @@ -1865,7 +1890,78 @@
> <renders-children>true</renders-children>
> </renderer-extension>
> </renderer>
> +
> + <renderer>
>
> + <description><![CDATA[<p class="changed_added_2_2"><span>Renders</span>
> + an HTML "input" element of "type" "file". The standard HTML_BASIC
> + RenderKit specifies behavior that assumes Servlet 3.0 or later.
> + Portlet implementations must override this implementation with a
> + semantically equivalent one that functions under the constraints
> + of the Portlet specification.</p>
> +
> + <div class="changed_added_2_2">
> +
> + <p><a name="decode">Decode Behavior</a></p>
> +
> + <ul>
> +
> + <p>Obtain the <code>Map</code> from the "requestParameterMap"
> + property of the <code>ExternalContext</code>. If the
> + <code>Map</code> contains an entry for the "clientId" of the
> + component, pass the value of the entry to the
> + <code>setSubmittedValue()</code> method of the component, which
> + must be an instance of <code>EditableValueHolder</code>, and
> + return. Otherwise, obtain the "request" property from the
> + <code>ExternalContext</code> and cast it to
> + <code>javax.servlet.http.HttpServletRequest</code>. Call
> + <code>getParts()</code> on the httpServletRequest. Iterate over
> + the parts. If the "name" property of the current part is equal to
> + the "clientId", pass the current part to the
> + <code>setSubmittedValue()</code> method of the component. If an
> + exception is thrown during the iteration, log the exception and
> + continue.</p>
> +
> + <p>The standard implementation must override the
> + <code>getConvertedValue()</code> so that it simply returns the
> + <code>submittedValue</code> argument.</p>
> +
> + </ul>
> +
> + <p>Encode Behavior</p>
> +
> + <ul>
> +
> + <p> Render the clientId of the component as
> + the value of the "name" attribute. Render the current value of
> + the component as the value of the "value" attribute. If the
> + "styleClass" attribute is specified, render its value as the value
> + of the "class" attribute.
> + </p>
> +
> + </ul>
> +
> +</div> ]]>
> +
> + </description>
> + <component-family>javax.faces.Input</component-family>
> + <renderer-type>javax.faces.File</renderer-type>
> + <renderer-class>
> + <xi:include href="standard-html-renderkit-impl.xml" xpointer="xpointer(/root/input-file-renderer-class/text())"/>
> + </renderer-class>
> +
> + <xi:include href="core-attrs.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="events-attrs.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="focus-attrs.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="i18n-attrs.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="input-attrs.xml" xpointer="xpointer(/root/*)"/>
> + <xi:include href="text-attrs.xml" xpointer="xpointer(/root/*)"/>
> +
> + <renderer-extension>
> + <renders-children>false</renders-children>
> + </renderer-extension>
> + </renderer>
> +
> <renderer>
>
> <description><![CDATA[<p>Renders an HTML "input" element of type
> Index: jsf-api/doc/standard-html-renderkit.xml
> ===================================================================
> --- jsf-api/doc/standard-html-renderkit.xml (revision 9513)
> +++ jsf-api/doc/standard-html-renderkit.xml (working copy)
> @@ -42,7 +42,7 @@
> -->
> <!-- =========== FULL CONFIGURATION FILE ================================== -->
> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0">
> -<!-- Generic User Interface Components -->
> + <!-- Generic User Interface Components -->
> <component>
> <component-type>javax.faces.Column</component-type>
> <component-class>javax.faces.component.UIColumn</component-class>
> @@ -379,7 +379,7 @@
> <method-signature>
> void actionListener(javax.faces.event.ActionEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -1342,7 +1342,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -2791,7 +2791,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -3177,7 +3177,7 @@
> <method-signature>
> void actionListener(javax.faces.event.ActionEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -3749,7 +3749,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -4469,7 +4469,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -4830,7 +4830,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -5056,7 +5056,7 @@
> <component-family>javax.faces.ViewRoot</component-family>
> </component-extension>
> </component>
> -<!-- Concrete HTML Components -->
> + <!-- Concrete HTML Components -->
> <component>
> <description><![CDATA[<p>Represents a column that will be rendered
> in an HTML <code>table</code> element.</p>]]></description>
> @@ -5427,7 +5427,7 @@
> <method-signature>
> void actionListener(javax.faces.event.ActionEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -6066,7 +6066,7 @@
> <method-signature>
> void actionListener(javax.faces.event.ActionEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -8135,6 +8135,753 @@
> </component>
> <component>
> <description><![CDATA[<p>Represents an HTML <code>input</code> element
> + of type <code>file</code>.</p>]]></description>
> + <display-name>Input File</display-name>
> + <component-type>javax.faces.HtmlInputFile</component-type>
> + <component-class>javax.faces.component.html.HtmlInputFile</component-class>
> +
> + <property>
> + <description><![CDATA[
> + A mutable Map of the attributes associated with
> + this component, keyed by attribute name.
> + ]]></description>
> + <display-name>Attributes Map</display-name>
> + <icon/>
> + <property-name>attributes</property-name>
> + <property-class>java.util.Map</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + <read-only>true</read-only>
> + </property-extension>
> + </property>
> + <property>
> + <description><![CDATA[
> + The number of child components associated with
> + this component.
> + ]]></description>
> + <display-name>Child Component Count</display-name>
> + <icon/>
> + <property-name>childCount</property-name>
> + <property-class>int</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + <read-only>true</read-only>
> + </property-extension>
> + </property>
> + <property>
> + <description><![CDATA[
> + A mutable List of the child components associated with
> + this component.
> + ]]></description>
> + <display-name>Child Component List</display-name>
> + <icon/>
> + <property-name>children</property-name>
> + <property-class>java.util.List</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + <read-only>true</read-only>
> + </property-extension>
> + </property>
> + <property>
> + <description><![CDATA[
> + A mutable Map of the facets associated with
> + this component, keyed by facet name.
> + ]]></description>
> + <display-name>Facets Map</display-name>
> + <icon/>
> + <property-name>facets</property-name>
> + <property-class>java.util.Map</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + <read-only>true</read-only>
> + </property-extension>
> + </property>
> + <property>
> + <description><![CDATA[
> + The component family to which this component belongs. This property
> + is used to select an appropriate Renderer.
> + ]]></description>
> + <display-name>Component Family</display-name>
> + <icon/>
> + <property-name>family</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + <read-only>true</read-only>
> + </property-extension>
> + </property>
> + <property>
> + <description><![CDATA[
> + The component identifier for this component. This value must be
> + unique within the closest parent component that is a naming
> + container.
> + ]]></description>
> + <display-name>Component Identifier</display-name>
> + <icon/>
> + <property-name>id</property-name>
> + <property-class>java.lang.String</property-class>
> + </property>
> + <property>
> + <description><![CDATA[
> + The parent component for this component. On the root component
> + in the component tree (which must be of type UIViewRoot), this
> + property is null.
> + ]]></description>
> + <display-name>Parent Component</display-name>
> + <icon/>
> + <property-name>parent</property-name>
> + <property-class>javax.faces.component.UIComponent</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + <read-only>true</read-only>
> + </property-extension>
> + </property>
> + <property>
> + <description><![CDATA[
> + Flag indicating whether or not this component should be rendered
> + (during Render Response Phase), or processed on any subsequent
> + form submit. The default value for this property is true.
> + ]]></description>
> + <display-name>Rendered Flag</display-name>
> + <icon/>
> + <property-name>rendered</property-name>
> + <property-class>boolean</property-class>
> + <property-extension>
> + <value-expression-enabled>true</value-expression-enabled>
> + </property-extension>
> + </property>
> + <property>
> + <description><![CDATA[
> + Identifier used (in conjunction with the "family" property) to
> + select an appropriate Renderer to encode and decode this component.
> + ]]></description>
> + <display-name>Renderer Type</display-name>
> + <icon/>
> + <property-name>rendererType</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + </property-extension>
> + </property>
> + <property>
> + <description><![CDATA[
> + Flag indicating whether or not this component takes responsibility
> + for rendering its own children. This decision is normally delegated
> + to the associated Renderer, if there is one.
> + ]]></description>
> + <display-name>Renders Children</display-name>
> + <icon/>
> + <property-name>rendersChildren</property-name>
> + <property-class>boolean</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + <read-only>true</read-only>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Converter instance registered with this component.
> + </description>
> + <display-name>Converter</display-name>
> + <icon/>
> + <property-name>converter</property-name>
> + <property-class>javax.faces.convert.Converter</property-class>
> + <property-extension>
> + <value-expression-enabled>true</value-expression-enabled>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + For output components, this is the same as the "value" property.
> + For input components, this is the most recently user-entered
> + value, which will be pushed to the application data model during
> + Update Model Values phase, if a value binding is present for the
> + "value" property.
> + </description>
> + <display-name>Local Value</display-name>
> + <icon/>
> + <property-name>localValue</property-name>
> + <property-class>java.lang.Object</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + The current value of this component.
> + </description>
> + <display-name>Value</display-name>
> + <icon/>
> + <property-name>value</property-name>
> + <property-class>java.lang.Object</property-class>
> + <property-extension>
> + <value-expression-enabled>true</value-expression-enabled>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Flag indicating whether the "localValue" property
> + of this component has been set. This property is
> + reset automatically when the "value" propertyis set.
> + </description>
> + <display-name>Local Value Set</display-name>
> + <icon/>
> + <property-name>localValueSet</property-name>
> + <property-class>boolean</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Flag indicating that the user is required to provide a submitted
> + value for this input component.
> + </description>
> + <display-name>Required Flag</display-name>
> + <icon/>
> + <property-name>required</property-name>
> + <property-class>boolean</property-class>
> + <property-extension>
> + <value-expression-enabled>true</value-expression-enabled>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + A ValueExpression enabled attribute that, if present, will be
> + used as the text of the validation message for the "required"
> + facility, if the "required" facility is used.
> + </description>
> + <display-name>Required Message</display-name>
> + <icon/>
> + <property-name>requiredMessage</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <value-expression-enabled>true</value-expression-enabled>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + A ValueExpression enabled attribute that, if present, will be
> + used as the text of the converter message, replacing any message
> + that comes from the converter.
> + </description>
> + <display-name>Converter Message</display-name>
> + <icon/>
> + <property-name>converterMessage</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <value-expression-enabled>true</value-expression-enabled>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + A ValueExpression enabled attribute that, if present, will be
> + used as the text of the validator message, replacing any
> + message that comes from the validator.
> + </description>
> + <display-name>Validator Message</display-name>
> + <icon/>
> + <property-name>validatorMessage</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <value-expression-enabled>true</value-expression-enabled>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + The value submitted for this input component by the user, prior to
> + any required conversion or validation.
> + </description>
> + <display-name>Submitted Value</display-name>
> + <icon/>
> + <property-name>submittedValue</property-name>
> + <property-class>java.lang.Object</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + MethodExpression representing a validator method that will be called
> + during Process Validations to perform correctness checks on the
> + value of this component. The expression must evaluate to a public
> + method that takes FacesContext, UIComponent, and Object parameters,
> + with a return type of void.
> + </description>
> + <display-name>Validator</display-name>
> + <icon/>
> + <property-name>validator</property-name>
> + <property-class>javax.el.MethodExpression</property-class>
> + <property-extension>
> + <method-signature>
> + void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
> + </method-signature>
> + </property-extension>
> + </property>
> + <property>
> + <description><![CDATA[<p>
> +
> + MethodExpression representing a value change listener method
> + that will be notified when a new value has been set for this
> + input component. The expression must evaluate to a public
> + method that takes a <code>ValueChangeEvent</code> parameter,
> + with a return type of void, <span class="changed_added_2_0">or
> + to a public method that takes no arguments with a return type
> + of void. In the latter case, the method has no way of easily
> + knowing what the new value is, but this can be useful in cases
> + where a notification is needed that "this value
> + changed".</span>
> +
> +</p>]]></description>
> + <display-name>Value Change Listener</display-name>
> + <icon/>
> + <property-name>valueChangeListener</property-name>
> + <property-class>javax.el.MethodExpression</property-class>
> + <property-extension>
> + <method-signature>
> + void valueChange(javax.faces.event.ValueChangeEvent)
> + </method-signature>
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> +as required by
> +https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> + <method-signature>
> + void valueChange()
> + </method-signature>
> +-->
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Flag indicating that this component's value must be
> + converted and validated immediately (that is, during
> + Apply Request Values phase), rather than waiting
> + until Process Validations phase.
> + </description>
> + <display-name>Immediate Action</display-name>
> + <icon/>
> + <property-name>immediate</property-name>
> + <property-class>boolean</property-class>
> + <property-extension>
> + <value-expression-enabled>true</value-expression-enabled>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Flag indicating whether or not any required conversion or validation
> + on this component value has been performed successfully.
> + </description>
> + <display-name>Valid Flag</display-name>
> + <icon/>
> + <property-name>valid</property-name>
> + <property-class>valid</property-class>
> + <property-extension>
> + <tag-attribute>false</tag-attribute>
> + </property-extension>
> + </property>
> +
> +
> + <property>
> + <description>
> + CSS style(s) to be applied when this component is rendered.
> + </description>
> + <display-name>CSS Styles</display-name>
> + <icon/>
> + <property-name>style</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Space-separated list of CSS style class(es) to be applied when
> + this element is rendered. This value must be passed through
> + as the "class" attribute on generated markup.
> + </description>
> + <display-name>CSS Style Classes</display-name>
> + <icon/>
> + <property-name>styleClass</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>false</pass-through>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Advisory title information about markup elements generated
> + for this component.
> + </description>
> + <display-name>Advisory Title</display-name>
> + <icon/>
> + <property-name>title</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + </property-extension>
> + </property>
> +
> +
> + <property>
> + <description>
> + Javascript code executed when a pointer button is
> + clicked over this element.
> + </description>
> + <display-name>Button Click Script</display-name>
> + <icon/>
> + <property-name>onclick</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when a pointer button is
> + double clicked over this element.
> + </description>
> + <display-name>Double Click Script</display-name>
> + <icon/>
> + <property-name>ondblclick</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when a pointer button is
> + pressed down over this element.
> + </description>
> + <display-name>Mouse Down Script</display-name>
> + <icon/>
> + <property-name>onmousedown</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when a pointer button is
> + released over this element.
> + </description>
> + <display-name>Mouse Up Script</display-name>
> + <icon/>
> + <property-name>onmouseup</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when a pointer button is
> + moved onto this element.
> + </description>
> + <display-name>Mouse Over Script</display-name>
> + <icon/>
> + <property-name>onmouseover</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when a pointer button is
> + moved within this element.
> + </description>
> + <display-name>Mouse Move Script</display-name>
> + <icon/>
> + <property-name>onmousemove</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when a pointer button is
> + moved away from this element.
> + </description>
> + <display-name>Mouse Out Script</display-name>
> + <icon/>
> + <property-name>onmouseout</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when a key is
> + pressed and released over this element.
> + </description>
> + <display-name>Key Press Script</display-name>
> + <icon/>
> + <property-name>onkeypress</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when a key is
> + pressed down over this element.
> + </description>
> + <display-name>Key Down Script</display-name>
> + <icon/>
> + <property-name>onkeydown</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when a key is
> + released over this element.
> + </description>
> + <display-name>Key Up Script</display-name>
> + <icon/>
> + <property-name>onkeyup</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> +
> +
> + <property>
> + <description>
> + Access key that, when pressed, transfers focus
> + to this element.
> + </description>
> + <display-name>Access Key</display-name>
> + <icon/>
> + <property-name>accesskey</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when this element loses focus.
> + </description>
> + <display-name>Focus Off Script</display-name>
> + <icon/>
> + <property-name>onblur</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when this element receives focus.
> + </description>
> + <display-name>Focus On Script</display-name>
> + <icon/>
> + <property-name>onfocus</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Position of this element in the tabbing order
> + for the current document. This value must be
> + an integer between 0 and 32767.
> + </description>
> + <display-name>Tab Index</display-name>
> + <icon/>
> + <property-name>tabindex</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + </property-extension>
> + </property>
> +
> +
> + <property>
> + <description>
> + Direction indication for text that does not inherit directionality.
> + Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).
> + </description>
> + <display-name>Direction</display-name>
> + <icon/>
> + <property-name>dir</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Code describing the language used in the generated markup
> + for this component.
> + </description>
> + <display-name>Language Code</display-name>
> + <icon/>
> + <property-name>lang</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + </property-extension>
> + </property>
> +
> +
> + <property>
> + <description>
> + Flag indicating that this element must never receive focus or
> + be included in a subsequent submit. A value of false causes
> + no attribute to be rendered, while a value of true causes the
> + attribute to be rendered as disabled="disabled".
> + </description>
> + <display-name>Disabled Flag</display-name>
> + <icon/>
> + <property-name>disabled</property-name>
> + <property-class>boolean</property-class>
> + <property-extension>
> + <pass-through>false</pass-through>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when this element loses focus
> + and its value has been modified since gaining focus.
> + </description>
> + <display-name>Input Change Script</display-name>
> + <icon/>
> + <property-name>onchange</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>false</pass-through>
> + <behavior/>
> + <behavior>valueChange</behavior>
> + <default-behavior>true</default-behavior>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Javascript code executed when text within this
> + element is selected by the user.
> + </description>
> + <display-name>Text Select Script</display-name>
> + <icon/>
> + <property-name>onselect</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + Flag indicating that this component will prohibit changes by
> + the user. The element may receive focus unless it has also
> + been disabled. A value of false causes
> + no attribute to be rendered, while a value of true causes the
> + attribute to be rendered as readonly="readonly".
> + </description>
> + <display-name>Read Only Flag</display-name>
> + <icon/>
> + <property-name>readonly</property-name>
> + <property-class>boolean</property-class>
> + <property-extension>
> + <pass-through>false</pass-through>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + A localized user presentable name for this component.
> + </description>
> + <display-name>Label</display-name>
> + <icon/>
> + <property-name>label</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <renderer-attribute-ignore>true</renderer-attribute-ignore>
> + </property-extension>
> + </property>
> +
> +
> + <property>
> + <description>
> + Alternate textual description of the
> + element rendered by this component.
> + </description>
> + <display-name>Alternate Text</display-name>
> + <icon/>
> + <property-name>alt</property-name>
> + <property-class>java.lang.String</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + If the value of this attribute is "off", render "off" as the value
> + of the attribute. This indicates that the browser should
> + disable its autocomplete feature for this component. This is
> + useful for components that perform autocompletion and do not
> + want the browser interfering. If this attribute is not set or the value
> + is "on", render nothing.
> + </description>
> + <display-name>Enable or disable browser autocompletion.</display-name>
> + <icon/>
> + <property-name>autocomplete</property-name>
> + <property-class>java.lang.String</property-class>
> + </property>
> + <property>
> + <description>
> + The maximum number of characters that may
> + be entered in this field.
> + </description>
> + <display-name>Maximum Length</display-name>
> + <icon/>
> + <property-name>maxlength</property-name>
> + <property-class>int</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + </property-extension>
> + </property>
> + <property>
> + <description>
> + The number of characters used to determine
> + the width of this field.
> + </description>
> + <display-name>Field Width</display-name>
> + <icon/>
> + <property-name>size</property-name>
> + <property-class>int</property-class>
> + <property-extension>
> + <pass-through>true</pass-through>
> + </property-extension>
> + </property>
> +
> + <component-extension>
> + <base-component-type>javax.faces.Input</base-component-type>
> + <renderer-type>javax.faces.File</renderer-type>
> + </component-extension>
> + </component>
> + <component>
> + <description><![CDATA[<p>Represents an HTML <code>input</code> element
> of type <code>hidden</code>.</p>]]></description>
> <display-name>Input Hidden</display-name>
> <component-type>javax.faces.HtmlInputHidden</component-type>
> @@ -8441,7 +9188,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -8796,7 +9543,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -9558,7 +10305,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -10304,7 +11051,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -15505,7 +16252,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -16215,7 +16962,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -16991,7 +17738,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -17729,7 +18476,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -18457,7 +19204,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -19182,7 +19929,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -19899,7 +20646,7 @@
> <method-signature>
> void valueChange(javax.faces.event.ValueChangeEvent)
> </method-signature>
> -<!-- PENDING modify tlddoc to handle an OR of method signatures
> + <!-- PENDING modify tlddoc to handle an OR of method signatures
> as required by
> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=447
> <method-signature>
> @@ -20333,7 +21080,7 @@
> <renderer-type>javax.faces.Radio</renderer-type>
> </component-extension>
> </component>
> -<!--
> + <!--
> the following components are here merely for AttributeManager
> generation.
> -->
> @@ -20699,7 +21446,7 @@
> <renderer-type>javax.faces.Body</renderer-type>
> </component-extension>
> </component>
> -<!-- Standard HTML Renderkit -->
> + <!-- Standard HTML Renderkit -->
> <render-kit>
> <description><![CDATA[
> The standard HTML RenderKit. Please see the spec for additional
> @@ -23219,6 +23966,461 @@
> </renderer-extension>
> </renderer>
> <renderer>
> + <description><![CDATA[<p class="changed_added_2_2"><span>Renders</span>
> + an HTML "input" element of "type" "file". The standard HTML_BASIC
> + RenderKit specifies behavior that assumes Servlet 3.0 or later.
> + Portlet implementations must override this implementation with a
> + semantically equivalent one that functions under the constraints
> + of the Portlet specification.</p>
> +
> + <div class="changed_added_2_2">
> +
> + <p><a name="decode">Decode Behavior</a></p>
> +
> + <ul>
> +
> + <p>Obtain the <code>Map</code> from the "requestParameterMap"
> + property of the <code>ExternalContext</code>. If the
> + <code>Map</code> contains an entry for the "clientId" of the
> + component, pass the value of the entry to the
> + <code>setSubmittedValue()</code> method of the component, which
> + must be an instance of <code>EditableValueHolder</code>, and
> + return. Otherwise, obtain the "request" property from the
> + <code>ExternalContext</code> and cast it to
> + <code>javax.servlet.http.HttpServletRequest</code>. Call
> + <code>getParts()</code> on the httpServletRequest. Iterate over
> + the parts. If the "name" property of the current part is equal to
> + the "clientId", pass the current part to the
> + <code>setSubmittedValue()</code> method of the component. If an
> + exception is thrown during the iteration, log the exception and
> + continue.</p>
> +
> + <p>The standard implementation must override the
> + <code>getConvertedValue()</code> so that it simply returns the
> + <code>submittedValue</code> argument.</p>
> +
> + </ul>
> +
> + <p>Encode Behavior</p>
> +
> + <ul>
> +
> + <p> Render the clientId of the component as
> + the value of the "name" attribute. Render the current value of
> + the component as the value of the "value" attribute. If the
> + "styleClass" attribute is specified, render its value as the value
> + of the "class" attribute.
> + </p>
> +
> + </ul>
> +
> +</div> ]]></description>
> + <component-family>javax.faces.Input</component-family>
> + <renderer-type>javax.faces.File</renderer-type>
> + <renderer-class>
> + com.sun.faces.renderkit.html_basic.FileRenderer
> + </renderer-class>
> +
> + <attribute>
> + <description>
> + CSS style(s) to be applied when this component is rendered.
> + </description>
> + <display-name>CSS Styles</display-name>
> + <icon/>
> + <attribute-name>style</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Space-separated list of CSS style class(es) to be applied when
> + this element is rendered. This value must be passed through
> + as the "class" attribute on generated markup.
> + </description>
> + <display-name>CSS Style Classes</display-name>
> + <icon/>
> + <attribute-name>styleClass</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>false</pass-through>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Advisory title information about markup elements generated
> + for this component.
> + </description>
> + <display-name>Advisory Title</display-name>
> + <icon/>
> + <attribute-name>title</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + </attribute-extension>
> + </attribute>
> +
> +
> + <attribute>
> + <description>
> + Javascript code executed when a pointer button is
> + clicked over this element.
> + </description>
> + <display-name>Button Click Script</display-name>
> + <icon/>
> + <attribute-name>onclick</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when a pointer button is
> + double clicked over this element.
> + </description>
> + <display-name>Double Click Script</display-name>
> + <icon/>
> + <attribute-name>ondblclick</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when a pointer button is
> + pressed down over this element.
> + </description>
> + <display-name>Mouse Down Script</display-name>
> + <icon/>
> + <attribute-name>onmousedown</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when a pointer button is
> + released over this element.
> + </description>
> + <display-name>Mouse Up Script</display-name>
> + <icon/>
> + <attribute-name>onmouseup</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when a pointer button is
> + moved onto this element.
> + </description>
> + <display-name>Mouse Over Script</display-name>
> + <icon/>
> + <attribute-name>onmouseover</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when a pointer button is
> + moved within this element.
> + </description>
> + <display-name>Mouse Move Script</display-name>
> + <icon/>
> + <attribute-name>onmousemove</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when a pointer button is
> + moved away from this element.
> + </description>
> + <display-name>Mouse Out Script</display-name>
> + <icon/>
> + <attribute-name>onmouseout</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when a key is
> + pressed and released over this element.
> + </description>
> + <display-name>Key Press Script</display-name>
> + <icon/>
> + <attribute-name>onkeypress</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when a key is
> + pressed down over this element.
> + </description>
> + <display-name>Key Down Script</display-name>
> + <icon/>
> + <attribute-name>onkeydown</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when a key is
> + released over this element.
> + </description>
> + <display-name>Key Up Script</display-name>
> + <icon/>
> + <attribute-name>onkeyup</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> +
> +
> + <attribute>
> + <description>
> + Access key that, when pressed, transfers focus
> + to this element.
> + </description>
> + <display-name>Access Key</display-name>
> + <icon/>
> + <attribute-name>accesskey</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when this element loses focus.
> + </description>
> + <display-name>Focus Off Script</display-name>
> + <icon/>
> + <attribute-name>onblur</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when this element receives focus.
> + </description>
> + <display-name>Focus On Script</display-name>
> + <icon/>
> + <attribute-name>onfocus</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Position of this element in the tabbing order
> + for the current document. This value must be
> + an integer between 0 and 32767.
> + </description>
> + <display-name>Tab Index</display-name>
> + <icon/>
> + <attribute-name>tabindex</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + </attribute-extension>
> + </attribute>
> +
> +
> + <attribute>
> + <description>
> + Direction indication for text that does not inherit directionality.
> + Valid values are "LTR" (left-to-right) and "RTL" (right-to-left).
> + </description>
> + <display-name>Direction</display-name>
> + <icon/>
> + <attribute-name>dir</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Code describing the language used in the generated markup
> + for this component.
> + </description>
> + <display-name>Language Code</display-name>
> + <icon/>
> + <attribute-name>lang</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + </attribute-extension>
> + </attribute>
> +
> +
> + <attribute>
> + <description>
> + Flag indicating that this element must never receive focus or
> + be included in a subsequent submit. A value of false causes
> + no attribute to be rendered, while a value of true causes the
> + attribute to be rendered as disabled="disabled".
> + </description>
> + <display-name>Disabled Flag</display-name>
> + <icon/>
> + <attribute-name>disabled</attribute-name>
> + <attribute-class>boolean</attribute-class>
> + <attribute-extension>
> + <pass-through>false</pass-through>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when this element loses focus
> + and its value has been modified since gaining focus.
> + </description>
> + <display-name>Input Change Script</display-name>
> + <icon/>
> + <attribute-name>onchange</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>false</pass-through>
> + <behavior/>
> + <behavior>valueChange</behavior>
> + <default-behavior>true</default-behavior>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Javascript code executed when text within this
> + element is selected by the user.
> + </description>
> + <display-name>Text Select Script</display-name>
> + <icon/>
> + <attribute-name>onselect</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + <behavior/>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + Flag indicating that this component will prohibit changes by
> + the user. The element may receive focus unless it has also
> + been disabled. A value of false causes
> + no attribute to be rendered, while a value of true causes the
> + attribute to be rendered as readonly="readonly".
> + </description>
> + <display-name>Read Only Flag</display-name>
> + <icon/>
> + <attribute-name>readonly</attribute-name>
> + <attribute-class>boolean</attribute-class>
> + <attribute-extension>
> + <pass-through>false</pass-through>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + A localized user presentable name for this component.
> + </description>
> + <display-name>Label</display-name>
> + <icon/>
> + <attribute-name>label</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <renderer-attribute-ignore>true</renderer-attribute-ignore>
> + </attribute-extension>
> + </attribute>
> +
> +
> + <attribute>
> + <description>
> + Alternate textual description of the
> + element rendered by this component.
> + </description>
> + <display-name>Alternate Text</display-name>
> + <icon/>
> + <attribute-name>alt</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + If the value of this attribute is "off", render "off" as the value
> + of the attribute. This indicates that the browser should
> + disable its autocomplete feature for this component. This is
> + useful for components that perform autocompletion and do not
> + want the browser interfering. If this attribute is not set or the value
> + is "on", render nothing.
> + </description>
> + <display-name>Enable or disable browser autocompletion.</display-name>
> + <icon/>
> + <attribute-name>autocomplete</attribute-name>
> + <attribute-class>java.lang.String</attribute-class>
> + </attribute>
> + <attribute>
> + <description>
> + The maximum number of characters that may
> + be entered in this field.
> + </description>
> + <display-name>Maximum Length</display-name>
> + <icon/>
> + <attribute-name>maxlength</attribute-name>
> + <attribute-class>int</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + </attribute-extension>
> + </attribute>
> + <attribute>
> + <description>
> + The number of characters used to determine
> + the width of this field.
> + </description>
> + <display-name>Field Width</display-name>
> + <icon/>
> + <attribute-name>size</attribute-name>
> + <attribute-class>int</attribute-class>
> + <attribute-extension>
> + <pass-through>true</pass-through>
> + </attribute-extension>
> + </attribute>
> +
> + <renderer-extension>
> + <renders-children>false</renders-children>
> + </renderer-extension>
> + </renderer>
> + <renderer>
> <description><![CDATA[<p>Renders an HTML "input" element of type
> "hidden".</p>
>
> Index: jsf-api/src/main/java/javax/faces/webapp/FacesServlet.java
> ===================================================================
> --- jsf-api/src/main/java/javax/faces/webapp/FacesServlet.java (revision 9513)
> +++ jsf-api/src/main/java/javax/faces/webapp/FacesServlet.java (working copy)
> @@ -65,6 +65,7 @@
> import javax.servlet.ServletRequest;
> import javax.servlet.ServletResponse;
> import javax.servlet.UnavailableException;
> +import javax.servlet.annotation.MultipartConfig;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
>
> @@ -198,7 +199,7 @@
> *
> * </div>
> */
> -
> +_at_MultipartConfig
> public final class FacesServlet implements Servlet {
>
> /*
>
>
>
> [1] http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1062
>
> [2] https://maven.java.net/service/local/repositories/snapshots/archive/javax/faces/javax.faces-api/2.2-SNAPSHOT/javax.faces-api-2.2-20111215.201520-41-javadoc.jar/!/javadocs/index.html
> --
> | edward.burns_at_oracle.com | office: +1 407 458 0017
> | homepage: | http://ridingthecrest.com/