Hi guys,
maybe I am way off base here, but wouldn't the @Named annotation from
the Injection JSR fit the bill just fine instead of an attribute on
the @FacesComponent?
Indeed, the @Named annotation says just that - an object is exposed
under a name. Plus, you can optionally specify the name then.
best regards,
Martin
On 2/14/12, Kito Mann <kito.mann_at_virtua.com> wrote:
> Hello Ed,
>
> I understand the decisions you made with respect to the tagName attribute.
> I do have a couple of suggestions, though:
>
> * Rename the tagHandler attribute to something like "createTag".
> "tagHandler" makes me think we're saying the component itself is a
> TagHandler.
> * We still need a tagName attribute, because it must be possible to create
> a different tag name if the default isn't sufficient.
> ___
>
> Kito D. Mann | twitter: kito99 | Author, JSF in Action
> Virtua, Inc. | http://www.virtua.com | JSF/Java EE training and consulting
> http://www.JSFCentral.com - JavaServer Faces FAQ, news, and info | twitter:
> jsfcentral
> +1 203-404-4848 x3
>
> * Listen to the latest headlines in the JSF and Java EE newscast:
> http://blogs.jsfcentral.com/roller/editorsdesk/category/JSF+and+Java+EE+Newscast
> * Sign up for the JSFCentral newsletter: http://oi.vresp.com/?fid=ac048d0e17
>
>
>
> On Mon, Feb 13, 2012 at 5:42 PM, Edward Burns
> <edward.burns_at_oracle.com>wrote:
>
>> Because this one was pretty straightforward, I'm marking it
>> PROVISIONALLY CLOSED, but we can certainly discuss it.
>>
>> ACTION: Please review by 23:59 EST Wednesday 15 February 2012.
>>
>> If all the tests pass locally, I'm going to commit this so it'll be in
>> tonight's nightly build.
>>
>> Here is the changebundle from the issue [1].
>>
>> http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-594
>>
>> This is one approach to specifying and implementing this feature. There
>> are certainly others. This one is optimized to achieve a balance of
>> user productivity and runtime performance.
>>
>> The specification change is the addition of some attributes to the
>> FacesComponent annotation.
>>
>>
>> SECTION: Modified Files
>> ----------------------------
>> M jsf-api/src/main/java/javax/faces/component/FacesComponent.java
>>
>> + * <p><span class="changed_modified_2_2">The</span> presence of this
>> annotation
>> + * on a class that extends {_at_link UIComponent} must cause the runtime to
>> + * register this class as a component suitable for inclusion in a view.
>> + * <span class="changed_added_2_2">If the <code>tagHandler</code>
>> attribute
>> + * is <code>true</code>, the runtime must create a corresponding Facelet
>> + * tag handler according to the rules specified in the attributes of
>> + * this annotation.</span></p>
>>
>> My overall goal is to make it as easy as possible for the developer to
>> have a tag created for their component, without causing all pre-2.2
>> usages of @FacesComponent to be picked up in the scheme.
>>
>> I really wanted to achieve the simplicity of inferring the tag name
>> from the SimpleName of the class to which the annotation is attached.
>> This goal made it impossible to rely on the presence or absence of a
>> value for the "tagName" attribute as an indicator of the intent to
>> autogenerate a tag handler.
>>
>> Therefore, I chose to introduce a "boolean tagHandler() default
>> false;" attribute as a compromise intended to deliver the maximum
>> convention over configuration, without causing the runtime to pay an
>> undue performance penalty. I also didn't want to get in the way of
>> existing composite component usages. With this design, the minimal
>> thing you can do to get a tag looks like this:
>>
>> @FacesComponent(value="myComponentId", tagHandler=true)
>> public class MyComponent extends HtmlInputText {}
>>
>> This will cause a tag named myComponent to appear in tag library
>> <http://java.sun.com/jsf/component>. Note that we have another issue
>> to introduce a short-hand for tag library namespace URLs. Thus, I
>> won't bother with making a short name in this issue.
>>
>> Now, sure, there are other ways to design this, and I'm open to
>> considering them, but let's put this one on the table as a starting
>> point.
>>
>> A
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/LazyTagLibrary.java
>>
>> - This class is an abstraction from CompositeComponentTagLibrary.
>>
>> M
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/CompositeComponentTagLibrary.java
>>
>> - Make this extend LazyTagLibrary.
>>
>> A
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/FacesComponentTagLibrary.java
>>
>> - Now a sibling of CompositeComponentTagLibrary, this LazyTagLibrary is
>> for
>> tags corresponding to components annotated with @FacesComponent
>>
>> M
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/CompositeTagLibrary.java
>>
>> - Leverage the fact that there are exactly two kinds of LazyTagLibrary to
>> consider.
>>
>> M
>> jsf-ri/src/main/java/com/sun/faces/application/ApplicationAssociate.java
>> M
>> jsf-ri/src/main/java/com/sun/faces/application/ApplicationImpl.java
>> M
>> jsf-ri/src/main/java/com/sun/faces/application/annotation/ComponentConfigHandler.java
>>
>> - Wire up the annotation scanning to Facelets, using ApplicationAssociate.
>>
>> A
>> jsf-ri/src/main/java/com/sun/faces/application/annotation/FacesComponentUsage.jav
>>
>> - Helper struct class.
>>
>> M jsf-test/build.xml
>>
>> - new test
>>
>> M nbproject/project.xml
>>
>> - Spellchecker wordlist.
>>
>> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594
>> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit
>> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java/com
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java/com/sun
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java/com/sun/faces
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java/com/sun/faces/test
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java/com/sun/faces/test/i_spec_594_htmlunit
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java/com/sun/faces/test/i_spec_594_htmlunit/IssueSpec594TestCase.java
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/resources
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/pom.xml
>> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war
>> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src
>> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/UserBean.java
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/components
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/components/TagNameExplicitlyDeclared.java
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/components/TagNameDerivedFromClassName.java
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/resources
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/main.xhtml
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/WEB-INF
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/WEB-INF/beans.xml
>> A
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/WEB-INF/web.xml
>> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/pom.xml
>> A jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/build.xml
>>
>> - testcase
>>
>> SECTION: Diffs
>> ----------------------------
>> Index:
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/LazyTagLibrary.java
>> ===================================================================
>> ---
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/LazyTagLibrary.java
>> (revision 0)
>> +++
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/LazyTagLibrary.java
>> (revision 0)
>> @@ -0,0 +1,53 @@
>> +/*
>> + * 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.facelets.tag.jsf;
>> +
>> +import com.sun.faces.facelets.tag.TagLibraryImpl;
>> +
>> +public abstract class LazyTagLibrary extends TagLibraryImpl {
>> +
>> + public LazyTagLibrary(String namespace) {
>> + super(namespace);
>> + }
>> +
>> + public abstract boolean tagLibraryForNSExists(String toTest);
>> +
>> +}
>> Index:
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/CompositeComponentTagLibrary.java
>> ===================================================================
>> ---
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/CompositeComponentTagLibrary.java
>> (revision 9668)
>> +++
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/CompositeComponentTagLibrary.java
>> (working copy)
>> @@ -76,7 +76,7 @@
>> import java.util.logging.Logger;
>>
>>
>> -public class CompositeComponentTagLibrary extends TagLibraryImpl {
>> +public class CompositeComponentTagLibrary extends LazyTagLibrary {
>>
>> private static final Logger LOGGER =
>> FacesLogger.FACELETS_COMPONENT.getLogger();
>>
>> @@ -178,6 +178,7 @@
>> private static final String NS_COMPOSITE_COMPONENT_PREFIX =
>> "http://java.sun.com/jsf/composite/";
>>
>> + @Override
>> public boolean tagLibraryForNSExists(String toTest) {
>> boolean result = false;
>>
>> Index:
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/FacesComponentTagLibrary.java
>> ===================================================================
>> ---
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/FacesComponentTagLibrary.java
>> (revision 0)
>> +++
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/jsf/FacesComponentTagLibrary.java
>> (revision 0)
>> @@ -0,0 +1,154 @@
>> +/*
>> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
>> + *
>> + * Copyright (c) 1997-2012 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.facelets.tag.jsf;
>> +
>> +import com.sun.faces.application.ApplicationAssociate;
>> +import com.sun.faces.application.annotation.FacesComponentUsage;
>> +import com.sun.faces.util.FacesLogger;
>> +import com.sun.faces.util.Util;
>> +import java.util.List;
>> +import java.util.logging.Logger;
>> +import javax.faces.FacesException;
>> +import javax.faces.component.FacesComponent;
>> +import javax.faces.component.UIComponent;
>> +import javax.faces.context.FacesContext;
>> +import javax.faces.view.facelets.TagConfig;
>> +import javax.faces.view.facelets.TagHandler;
>> +
>> +public class FacesComponentTagLibrary extends LazyTagLibrary {
>> +
>> + private static final Logger LOGGER =
>> FacesLogger.FACELETS_COMPONENT.getLogger();
>> +
>> + private ApplicationAssociate appAss;
>> +
>> +
>> + public FacesComponentTagLibrary(String ns) {
>> + super(ns);
>> + if (null == ns) {
>> + throw new NullPointerException();
>> + }
>> + appAss = ApplicationAssociate.getCurrentInstance();
>> + }
>> +
>> +
>> + @Override
>> + public boolean containsTagHandler(String ns, String localName) {
>> + Util.notNull("namespace", ns);
>> + Util.notNull("tagName", localName);
>> +
>> + if (!ns.equals(this.getNamespace())) {
>> + return false;
>> + }
>> +
>> + // Check the cache maintained by our superclass...
>> + boolean containsTagHandler = super.containsTagHandler(ns,
>> localName);
>> + if (!containsTagHandler) {
>> + FacesComponentUsage matchingFacesComponentUsage =
>> + findFacesComponentUsageForLocalName(ns, localName);
>> + containsTagHandler = null != matchingFacesComponentUsage;
>> +
>> + }
>> + return containsTagHandler;
>> + }
>> +
>> + private FacesComponentUsage
>> findFacesComponentUsageForLocalName(String ns, String localName) {
>> + FacesComponentUsage result = null;
>> +
>> + Util.notNull("namespace", ns);
>> + Util.notNull("tagName", localName);
>> +
>> + if (!ns.equals(this.getNamespace())) {
>> + return result;
>> + }
>> + List<FacesComponentUsage> componentsForNamespace =
>> appAss.getComponentsForNamespace(ns);
>> + String tagName;
>> + for (FacesComponentUsage cur: componentsForNamespace) {
>> + FacesComponent curFacesComponent = cur.getAnnotation();
>> + tagName = curFacesComponent.tagName();
>> + // if the current entry has an explicitly declared tagName...
>> + if (null != tagName && 0 < tagName.length()) {
>> + // compare it to the argument tagName
>> + if (localName.equals(tagName)) {
>> + result = cur;
>> + break;
>> + }
>> + } else if (null != tagName) {
>> + tagName = cur.getTarget().getSimpleName();
>> + tagName = tagName.substring(0, 1).toLowerCase() +
>> tagName.substring(1);
>> + if (localName.equals(tagName)) {
>> + result = cur;
>> + break;
>> + }
>> + }
>> + }
>> +
>> + return result;
>> + }
>> +
>> + @Override
>> + public TagHandler createTagHandler(String ns, String localName,
>> TagConfig tag) throws FacesException {
>> + assert(containsTagHandler(ns, localName));
>> + TagHandler result = super.createTagHandler(ns, localName, tag);
>> + if (null == result) {
>> + FacesComponentUsage facesComponentUsage =
>> + findFacesComponentUsageForLocalName(ns, localName);
>> + String componentType =
>> facesComponentUsage.getAnnotation().value();
>> + UIComponent throwAwayComponent =
>> FacesContext.getCurrentInstance().
>> + getApplication().createComponent(componentType);
>> + String rendererType = throwAwayComponent.getRendererType();
>> + super.addComponent(localName, componentType, rendererType);
>> + result = super.createTagHandler(ns, localName, tag);
>> + }
>> + return result;
>> + }
>> +
>> + @Override
>> + public boolean tagLibraryForNSExists(String ns) {
>> + boolean result = false;
>> + List<FacesComponentUsage> componentsForNamespace =
>> appAss.getComponentsForNamespace(ns);
>> +
>> + result = !componentsForNamespace.isEmpty();
>> +
>> + return result;
>> + }
>> +
>> +
>> +}
>> Index:
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/CompositeTagLibrary.java
>> ===================================================================
>> ---
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/CompositeTagLibrary.java
>> (revision 9668)
>> +++
>> jsf-ri/src/main/java/com/sun/faces/facelets/tag/CompositeTagLibrary.java
>> (working copy)
>> @@ -60,6 +60,8 @@
>>
>> import com.sun.faces.facelets.compiler.CompilationMessageHolder;
>> import com.sun.faces.facelets.tag.jsf.CompositeComponentTagLibrary;
>> +import com.sun.faces.facelets.tag.jsf.FacesComponentTagLibrary;
>> +import com.sun.faces.facelets.tag.jsf.LazyTagLibrary;
>> import com.sun.faces.util.Util;
>>
>> import javax.faces.FacesException;
>> @@ -108,13 +110,21 @@
>> }
>> }
>> // PENDING: this is a terribly inefficient impl. Needs
>> refactoring.
>> - CompositeComponentTagLibrary toTest = new
>> CompositeComponentTagLibrary(ns);
>> - if (toTest.tagLibraryForNSExists(ns)) {
>> + LazyTagLibrary lazyLibraries [] = new LazyTagLibrary[2];
>> + lazyLibraries[0] = new CompositeComponentTagLibrary(ns);
>> + lazyLibraries[1] = new FacesComponentTagLibrary(ns);
>> + LazyTagLibrary toTest = null;
>> + for (int i = 0; i < lazyLibraries.length; i++) {
>> + if (lazyLibraries[i].tagLibraryForNSExists(ns)) {
>> + toTest = lazyLibraries[i];
>> + break;
>> + }
>> + }
>> + if (null != toTest) {
>> TagLibrary [] librariesPlusOne = new
>> TagLibrary[libraries.length+1];
>> System.arraycopy(this.libraries, 0, librariesPlusOne,
>> 0, libraries.length);
>> - librariesPlusOne[libraries.length] =
>> - new CompositeComponentTagLibrary(ns);
>> + librariesPlusOne[libraries.length] = toTest;
>> for (int i = 0; i < this.libraries.length; i++) {
>> libraries[i] = null;
>> }
>> Index:
>> jsf-ri/src/main/java/com/sun/faces/application/ApplicationAssociate.java
>> ===================================================================
>> ---
>> jsf-ri/src/main/java/com/sun/faces/application/ApplicationAssociate.java
>> (revision 9668)
>> +++
>> jsf-ri/src/main/java/com/sun/faces/application/ApplicationAssociate.java
>> (working copy)
>> @@ -45,6 +45,7 @@
>> import com.sun.faces.application.resource.ResourceCache;
>> import com.sun.faces.application.resource.ResourceManager;
>> import com.sun.faces.application.annotation.AnnotationManager;
>> +import com.sun.faces.application.annotation.FacesComponentUsage;
>> import com.sun.faces.config.ConfigManager;
>> import com.sun.faces.config.WebConfiguration;
>> import com.sun.faces.facelets.compiler.Compiler;
>> @@ -80,6 +81,7 @@
>> import com.sun.faces.facelets.PrivateApiFaceletCacheAdapter;
>> import com.sun.faces.lifecycle.ELResolverInitPhaseListener;
>>
>> +import java.util.ArrayList;
>> import javax.el.CompositeELResolver;
>> import javax.el.ELResolver;
>> import javax.el.ExpressionFactory;
>> @@ -106,6 +108,7 @@
>> import java.util.concurrent.ConcurrentHashMap;
>> import javax.faces.FactoryFinder;
>> import javax.faces.application.NavigationCase;
>> +import javax.faces.component.FacesComponent;
>> import javax.faces.view.facelets.FaceletCacheFactory;
>> import javax.faces.view.facelets.FaceletFactoryWrapper;
>> import javax.faces.view.facelets.FaceletsResourceResolver;
>> @@ -136,6 +139,14 @@
>> * card, and some may be specified as an asterisk "*".
>> */
>> private Map<String, Set<NavigationCase>> navigationMap = null;
>> +
>> + /*
>> + * The FacesComponentTagLibrary uses the information in this map
>> + * to help it fabricate tag handlers for components annotated with
>> + * FacesComponent.
>> + * Key: namespace
>> + */
>> + private Map<String, List<FacesComponentUsage>>
>> facesComponentsByNamespace = null;
>>
>> // Flag indicating that a response has been rendered.
>> private boolean responseRendered = false;
>> @@ -533,8 +544,39 @@
>> public boolean hasRequestBeenServiced() {
>> return requestServiced;
>> }
>> +
>> + public void addFacesComponent(FacesComponentUsage
>> facesComponentUsage) {
>> + FacesComponent facesComponent =
>> facesComponentUsage.getAnnotation();
>> + assert(facesComponent.tagHandler());
>> + if (null == facesComponentsByNamespace) {
>> + facesComponentsByNamespace = new HashMap<String,
>> List<FacesComponentUsage>>();
>> + }
>>
>> + List<FacesComponentUsage> componentsInNamespace = null;
>> + final String namespace = facesComponent.namespace();
>> +
>> + if
>> (!facesComponentsByNamespace.containsKey(facesComponent.namespace())) {
>> + componentsInNamespace = new ArrayList<FacesComponentUsage>();
>> + facesComponentsByNamespace.put(namespace,
>> componentsInNamespace);
>> + } else {
>> + componentsInNamespace =
>> facesComponentsByNamespace.get(namespace);
>> + }
>> + componentsInNamespace.add(facesComponentUsage);
>>
>> + }
>> +
>> + public List<FacesComponentUsage> getComponentsForNamespace(String ns)
>> {
>> + List<FacesComponentUsage> result = Collections.emptyList();
>> + if (null != facesComponentsByNamespace) {
>> + if (facesComponentsByNamespace.containsKey(ns)) {
>> + result = facesComponentsByNamespace.get(ns);
>> + }
>> +
>> + }
>> +
>> + return result;
>> + }
>> +
>> /**
>> * Add a navigation case to the internal case set. If a case set
>> * does not already exist in the case list map containing this case
>> Index: jsf-ri/src/main/java/com/sun/faces/application/ApplicationImpl.java
>> ===================================================================
>> --- jsf-ri/src/main/java/com/sun/faces/application/ApplicationImpl.java
>> (revision 9668)
>> +++ jsf-ri/src/main/java/com/sun/faces/application/ApplicationImpl.java
>> (working copy)
>> @@ -881,7 +881,7 @@
>> }
>>
>> /**
>> - * @see javax.faces.application.Application#addComponent(String,
>> String)
>> + * @see javax.faces.application.Application#addFacesComponent(String,
>> String)
>> */
>> public void addComponent(String componentType, String componentClass)
>> {
>>
>> Index:
>> jsf-ri/src/main/java/com/sun/faces/application/annotation/ComponentConfigHandler.java
>> ===================================================================
>> ---
>> jsf-ri/src/main/java/com/sun/faces/application/annotation/ComponentConfigHandler.java
>> (revision 9668)
>> +++
>> jsf-ri/src/main/java/com/sun/faces/application/annotation/ComponentConfigHandler.java
>> (working copy)
>> @@ -40,6 +40,7 @@
>>
>> package com.sun.faces.application.annotation;
>>
>> +import com.sun.faces.application.ApplicationAssociate;
>> import java.lang.annotation.Annotation;
>> import java.util.Collection;
>> import java.util.Collections;
>> @@ -67,7 +68,8 @@
>> HANDLES = Collections.unmodifiableCollection(handles);
>> }
>>
>> - private Map<String,String> components;
>> + // key: componentId
>> + private Map<String,FacesComponentUsage> components;
>>
>>
>> // ------------------------------------- Methods from
>> ComponentConfigHandler
>> @@ -89,9 +91,9 @@
>> public void collect(Class<?> target, Annotation annotation) {
>>
>> if (components == null) {
>> - components = new HashMap<String,String>();
>> + components = new HashMap<String,FacesComponentUsage>();
>> }
>> - components.put(((FacesComponent) annotation).value(),
>> target.getName());
>> + components.put(((FacesComponent) annotation).value(),new
>> FacesComponentUsage(target, (FacesComponent) annotation));
>>
>> }
>>
>> @@ -103,8 +105,12 @@
>>
>> if (components != null) {
>> Application app = ctx.getApplication();
>> - for (Map.Entry<String, String> entry : components.entrySet())
>> {
>> - app.addComponent(entry.getKey(), entry.getValue());
>> + ApplicationAssociate appAss =
>> ApplicationAssociate.getCurrentInstance();
>> + for (Map.Entry<String, FacesComponentUsage> entry :
>> components.entrySet()) {
>> + if (entry.getValue().getAnnotation().tagHandler()) {
>> + appAss.addFacesComponent(entry.getValue());
>> + }
>> + app.addComponent(entry.getKey(),
>> entry.getValue().getTarget().getName());
>> }
>> }
>>
>> Index:
>> jsf-ri/src/main/java/com/sun/faces/application/annotation/FacesComponentUsage.java
>> ===================================================================
>> ---
>> jsf-ri/src/main/java/com/sun/faces/application/annotation/FacesComponentUsage.java
>> (revision 0)
>> +++
>> jsf-ri/src/main/java/com/sun/faces/application/annotation/FacesComponentUsage.java
>> (revision 0)
>> @@ -0,0 +1,65 @@
>> +/*
>> + * 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.application.annotation;
>> +
>> +import javax.faces.component.FacesComponent;
>> +
>> +public class FacesComponentUsage {
>> + private Class<?> target;
>> + private FacesComponent annotation;
>> +
>> + public FacesComponentUsage(Class<?> target, FacesComponent
>> annotation) {
>> + this.target = target;
>> + this.annotation = annotation;
>> + }
>> +
>> + public FacesComponent getAnnotation() {
>> + return annotation;
>> + }
>> +
>> + public Class<?> getTarget() {
>> + return target;
>> + }
>> +
>> +
>> +}
>> +
>> +
>> Index: jsf-test/build.xml
>> ===================================================================
>> --- jsf-test/build.xml (revision 9668)
>> +++ jsf-test/build.xml (working copy)
>> @@ -108,7 +108,8 @@
>> JAVASERVERFACES-2113,
>> JAVASERVERFACES-1660,
>> JAVASERVERFACES_SPEC_PUBLIC-479,
>> - JAVASERVERFACES_SPEC_PUBLIC-220" />
>> + JAVASERVERFACES_SPEC_PUBLIC-220,
>> + JAVASERVERFACES_SPEC_PUBLIC-594" />
>>
>> <target name="clean" depends="define.applications"
>> description="">
>> Index:
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java/com/sun/faces/test/i_spec_594_htmlunit/IssueSpec594TestCase.java
>> ===================================================================
>> ---
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java/com/sun/faces/test/i_spec_594_htmlunit/IssueSpec594TestCase.java
>> (revision 0)
>> +++
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/src/main/java/com/sun/faces/test/i_spec_594_htmlunit/IssueSpec594TestCase.java
>> (revision 0)
>> @@ -0,0 +1,77 @@
>> +/*
>> + * 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.test.i_spec_594_htmlunit;
>> +
>> +import com.gargoylesoftware.htmlunit.html.HtmlPage;
>> +
>> +import com.sun.faces.htmlunit.HtmlUnitFacesTestCase;
>> +import junit.framework.Test;
>> +import junit.framework.TestSuite;
>> +
>> +
>> +public class IssueSpec594TestCase extends HtmlUnitFacesTestCase {
>> +
>> + public IssueSpec594TestCase(String name) {
>> + super(name);
>> + }
>> +
>> +
>> + /**
>> + * Return the tests included in this test suite.
>> + */
>> + public static Test suite() {
>> + return (new TestSuite(IssueSpec594TestCase.class));
>> + }
>> +
>> +
>> + // ------------------------------------------------------------ Test
>> Methods
>> +
>> + public void testBasicAppFunctionality() throws Exception {
>> +
>> + HtmlPage page = getPage("/");
>> + String pageXml = page.asXml();
>> +
>>
>> assertTrue(pageXml.matches("(?s).*<input\\s+id=\"tagNameExplicitlyDeclared\"\\s+type=\"text\"\\s+name=\"tagNameExplicitlyDeclared\"/>.*<input\\s+id=\"myTag\"\\s+type=\"text\"\\s+name=\"myTag\"/>.*"));
>> +
>> + assertTrue(pageXml.contains("javax.faces.ViewState"));
>> + }
>> +
>> +
>> +}
>> Index:
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/pom.xml
>> ===================================================================
>> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_htmlunit/pom.xml
>> (revision 0)
>> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_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_594_htmlunit</artifactId>
>> + <packaging>jar</packaging>
>> + <name>i_spec_594_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_jsf_xxxx_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-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/UserBean.java
>> ===================================================================
>> ---
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/UserBean.java
>> (revision 0)
>> +++
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/UserBean.java
>> (revision 0)
>> @@ -0,0 +1,92 @@
>> +package com.sun.faces.test.i_spec_594_war;
>> +
>> +import java.io.Serializable;
>> +import java.util.Date;
>> +import javax.enterprise.context.SessionScoped;
>> +import javax.faces.application.FacesMessage;
>> +import javax.faces.component.UIComponent;
>> +import javax.faces.context.FacesContext;
>> +import javax.faces.validator.ValidatorException;
>> +import javax.inject.Named;
>> +
>> +_at_Named
>> +_at_SessionScoped
>> +public class UserBean implements Serializable {
>> +
>> + protected String firstName = "Duke";
>> + protected String lastName = "Java";
>> + protected Date dob;
>> + protected String sex = "Unknown";
>> + protected String email;
>> + protected String serviceLevel = "medium";
>> +
>> + public UserBean() {}
>> +
>> + public String getFirstName() {
>> + return firstName;
>> + }
>> +
>> + public void setFirstName(String firstName) {
>> + this.firstName = firstName;
>> + }
>> +
>> + public String getLastName() {
>> + return lastName;
>> + }
>> +
>> + public void setLastName(String lastName) {
>> + this.lastName = lastName;
>> + }
>> +
>> + public Date getDob() {
>> + return dob;
>> + }
>> +
>> + public void setDob(Date dob) {
>> + this.dob = dob;
>> + }
>> +
>> + public String getSex() {
>> + return sex;
>> + }
>> +
>> + public void setSex(String sex) {
>> + this.sex = sex;
>> + }
>> +
>> + public String getEmail() {
>> + return email;
>> + }
>> +
>> + public void setEmail(String email) {
>> + this.email = email;
>> + }
>> +
>> + public String getServiceLevel() {
>> + return serviceLevel;
>> + }
>> +
>> + public void setServiceLevel(String serviceLevel) {
>> + this.serviceLevel = serviceLevel;
>> + }
>> +
>> + public void validateEmail(FacesContext context, UIComponent
>> toValidate,
>> + Object value) throws ValidatorException {
>> + String emailStr = (String) value;
>> + if (-1 == emailStr.indexOf("@")) {
>> + FacesMessage message = new FacesMessage("Invalid email
>> address");
>> + throw new ValidatorException(message);
>> + }
>> + }
>> +
>> + public String addConfirmedUser() {
>> + // This method would call a database or other service and add the
>> + // confirmed user information.
>> + // For now, we just place an informative message in request scope
>> + FacesMessage doneMessage =
>> + new FacesMessage("Successfully added new user");
>> + FacesContext.getCurrentInstance().addMessage(null, doneMessage);
>> + return "done";
>> + }
>> +}
>> +
>> Index:
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/components/TagNameExplicitlyDeclared.java
>> ===================================================================
>> ---
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/components/TagNameExplicitlyDeclared.java
>> (revision 0)
>> +++
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/components/TagNameExplicitlyDeclared.java
>> (revision 0)
>> @@ -0,0 +1,49 @@
>> +/*
>> + * 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.test.i_spec_594_war.components;
>> +
>> +import javax.faces.component.FacesComponent;
>> +import javax.faces.component.html.HtmlInputText;
>> +
>> +_at_FacesComponent(value="TagNameExplicitlyDeclared", tagHandler=true,
>> tagName="myTag")
>> +public class TagNameExplicitlyDeclared extends HtmlInputText {
>> +
>> +}
>> Index:
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/components/TagNameDerivedFromClassName.java
>> ===================================================================
>> ---
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/components/TagNameDerivedFromClassName.java
>> (revision 0)
>> +++
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/java/com/sun/faces/test/i_spec_594_war/components/TagNameDerivedFromClassName.java
>> (revision 0)
>> @@ -0,0 +1,49 @@
>> +/*
>> + * 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.test.i_spec_594_war.components;
>> +
>> +import javax.faces.component.FacesComponent;
>> +import javax.faces.component.html.HtmlInputText;
>> +
>> +_at_FacesComponent(value="TagNameDerivedFromClassName", tagHandler=true)
>> +public class TagNameDerivedFromClassName extends HtmlInputText {
>> +
>> +}
>> Index:
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/main.xhtml
>> ===================================================================
>> ---
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/main.xhtml
>> (revision 0)
>> +++
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/main.xhtml
>> (revision 0)
>> @@ -0,0 +1,17 @@
>> +<!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"
>> + xmlns:foo="http://java.sun.com/jsf/component">
>> +<h:head>
>> + <title>A Simple JavaServer Faces 2.0 View</title>
>> +</h:head>
>> +<h:body>
>> + <h:form prependId="false">
>> + First name: #{userBean.firstName} Last name: #{userBean.lastName}
>> + <p><foo:tagNameDerivedFromClassName id="tagNameExplicitlyDeclared"
>> /></p>
>> + <p><foo:myTag id="myTag" /></p>
>> + <p><h:commandButton value="submit" /></p>
>> + </h:form>
>> +</h:body>
>> +</html>
>> Index:
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/WEB-INF/beans.xml
>> ===================================================================
>> Index:
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/WEB-INF/web.xml
>> ===================================================================
>> ---
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/src/main/webapp/WEB-INF/web.xml
>> (revision 0)
>> +++
>> jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_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-594/i_spec_594_war/pom.xml
>> ===================================================================
>> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_war/pom.xml
>> (revision 0)
>> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/i_spec_594_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_594_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.1 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-594/build.xml
>> ===================================================================
>> --- jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/build.xml (revision 0)
>> +++ jsf-test/JAVASERVERFACES_SPEC_PUBLIC-594/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_594" default="test" basedir=".">
>> +
>> + <property file="../../build.properties"/>
>> + <path id="i_spec_594.classpath">
>> + <path refid="html.classpath" />
>> + <pathelement
>> location="${basedir}/i_spec_594_htmlunit/target/classes"/>
>> + </path>
>> +
>> + <import file="${jsf.build.home}/common/ant/common.xml"/>
>> +
>> + <target name="build">
>> + <jsf.mvn dir="${basedir}/i_spec_594_war" goals="install" />
>> + <jsf.mvn dir="${basedir}/i_spec_594_htmlunit" goals="install" />
>> + </target>
>> +
>> + <target name="clean">
>> + <jsf.mvn dir="${basedir}/i_spec_594_htmlunit" goals="clean" />
>> + <jsf.mvn dir="${basedir}/i_spec_594_war" goals="clean" />
>> + </target>
>> +
>> + <target name="install">
>> + <deploy.artifact
>> +
>> artifact="${basedir}/i_spec_594_war/target/i_spec_594_war.war"
>> + appName="i_spec_594_war"/>
>> + </target>
>> +
>> + <target name="remove">
>> + <undeploy.artifact
>> +
>> artifact="${basedir}/i_spec_594_war/target/i_spec_594_war.war"
>> + appName="i_spec_594_war"/>
>> + </target>
>> +
>> + <target name="test" depends="define.scenario.aware.port">
>> +
>> + <jsf.junit context-path="/i_spec_594_war"
>> + classpath-refid="i_spec_594.classpath"
>> + test-results-dir="${regression.test.results.dir}">
>> + <tests>
>> + <fileset
>> dir="${basedir}/i_spec_594_htmlunit/target/classes"
>> +
>> includes="com/sun/faces/test/i_spec_594_htmlunit/IssueSpec594TestCase.class"/>
>> + </tests>
>> + </jsf.junit>
>> +
>> +
>> + </target>
>> +
>> +</project>
>> Index: nbproject/project.xml
>> ===================================================================
>> --- nbproject/project.xml (revision 9668)
>> +++ nbproject/project.xml (working copy)
>> @@ -113,5 +113,8 @@
>> <source-level>1.5</source-level>
>> </compilation-unit>
>> </java-data>
>> + <spellchecker-wordlist xmlns="
>> http://www.netbeans.org/ns/spellchecker-wordlist/1">
>> + <word>Facelet</word>
>> + </spellchecker-wordlist>
>> </configuration>
>> </project>
>> Index: jsf-api/src/main/java/javax/faces/component/FacesComponent.java
>> ===================================================================
>> --- jsf-api/src/main/java/javax/faces/component/FacesComponent.java
>> (revision 9668)
>> +++ jsf-api/src/main/java/javax/faces/component/FacesComponent.java
>> (working copy)
>> @@ -65,10 +65,28 @@
>>
>> */
>>
>> +/**
>> + * <p><span class="changed_modified_2_2">The</span> presence of this
>> annotation
>> + * on a class that extends {_at_link UIComponent} must cause the runtime to
>> + * register this class as a component suitable for inclusion in a view.
>> + * <span class="changed_added_2_2">If the <code>tagHandler</code>
>> attribute
>> + * is <code>true</code>, the runtime must create a corresponding Facelet
>> + * tag handler according to the rules specified in the attributes of
>> + * this annotation.</span></p>
>> + *
>> + */
>> +
>> @Retention(RetentionPolicy.RUNTIME)
>> @Target(ElementType.TYPE)
>> @Inherited
>> public @interface FacesComponent {
>> +
>> + /**
>> + * <p class="changed_added_2_2">Components that declare a
>> + * <code>tagHandler = true</code> attribute will be placed into this
>> tag
>> + * namespace if the namespace attribute is omitted.</p>
>> + */
>> + public static final String NAMESPACE = "
>> http://java.sun.com/jsf/component";
>>
>> /**
>> * <p class="changed_added_2_0">The value of this annotation
>> @@ -79,6 +97,35 @@
>> */
>>
>> String value();
>> -
>> -
>> +
>> + /**
>> + * <p class="changed_added_2_2">If the value of this attribute is
>> + * <code>true</code>, the runtime must create a Facelet tag handler,
>> + * that extends from {_at_link
>> javax.faces.view.facelets.ComponentHandler},
>> + * suitable for use in pages under the tag library with namespace
>> given
>> + * by the value of the {_at_link #namespace} attribute.</p>
>> + */
>> +
>> + boolean tagHandler() default false;
>> +
>> + /**
>> + * <p class="changed_added_2_2">If the value of the {_at_link
>> #tagHandler}
>> + * attribute is <code>true</code>, the runtime must use this
>> + * value as the tag name for including an instance of the component
>> + * annotated with this annotation in a view. If this attribute is
>> not
>> + * specified on a usage of this annotation, the simple name of the
>> + * class on which this annotation is declared, with the first
>> character
>> + * lowercased, is taken to be the value.</p>
>> + */
>> + String tagName() default "";
>> +
>> + /**
>> + * <p class="changed_added_2_2">If the value of the {_at_link
>> #tagHandler}
>> + * attribute is <code>true</code>, the value of this attribute is
>> taken
>> + * to be the tag library namespace into which this component is
>> placed.</p>
>> + *
>> + */
>> +
>> + String namespace() default NAMESPACE;
>> +
>> }
>>
>>
>> SECTION: New Files
>> ----------------------------
>> SEE ATTACHMENTS
>>
>>
>> [1] http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-594
>> --
>> | edward.burns_at_oracle.com | office: +1 407 458 0017
>> | homepage: | http://ridingthecrest.com/
>>
>
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces