dev@javaserverfaces.java.net

Seeking Review: part one of introduce ComponentHandler to public API

From: Ed Burns <Ed.Burns_at_Sun.COM>
Date: Wed, 04 Mar 2009 05:21:29 -0800

Issue: 274-Facelets


SECTION: Modified Files
----------------------------
M common/ant/glassfishV3prelude/container.xml

- Unrelated: fix typo in pathname: include glassfishV3prelude

M jsf-api/doc/web-facesconfig_2_0.xsd
M jsf-api/src/javax/faces/FactoryFinder.java
M jsf-ri/src/com/sun/faces/config/processor/FactoryConfigProcessor.java
M jsf-ri/src/com/sun/faces/jsf-ri-config.xml

- add tag-handler-helper-factory content

M jsf-api/src/javax/faces/webapp/pdl/facelets/tag/ComponentHandler.java

- add ivars and methods to make this work

- More changes will be necessary to comply with Andy Schwartz's latest request

M jsf-api/src/javax/faces/webapp/pdl/facelets/tag/TagHandlerHelper.java

- This class should have been public

M jsf-ri/src/com/sun/faces/facelets/tag/jsf/html/HtmlComponentHandler.java
M jsf-ri/src/com/sun/faces/facelets/tag/MetaRulesetImpl.java

A jsf-ri/src/com/sun/faces/facelets/tag/jsf/ComponentTagHandlerHelperImpl.java

- Copy code from ComponentHandlerImpl. Next checkin will remove
  ComponentHandlerImpl entirely.

A jsf-ri/src/com/sun/faces/facelets/tag/jsf/TagHandlerHelperFactoryImpl.java

- Implementation of TagHandlerHelperFactory

SECTION: Diffs
----------------------------
Index: common/ant/glassfishV3prelude/container.xml
===================================================================
--- common/ant/glassfishV3prelude/container.xml (revision 6754)
+++ common/ant/glassfishV3prelude/container.xml (working copy)
@@ -37,7 +37,7 @@
 -->
 <project name="GlassFishV3" basedir=".">
 
- <property name="validation.root.dir" value="${basedir}/common/ant/glassfishV3"/>
+ <property name="validation.root.dir" value="${basedir}/common/ant/glassfishV3prelude"/>
     <property name="validation.root.build.dir" value="${validation.root.dir}/build-bean-validation"/>
     <property name="validation.tmp.bnd" value="${validation.root.build.dir}/tmp.bnd"/>
     <property name="validation.dist.dir" value="${validation.root.build.dir}/dist"/>
Index: jsf-api/doc/web-facesconfig_2_0.xsd
===================================================================
--- jsf-api/doc/web-facesconfig_2_0.xsd (revision 6754)
+++ jsf-api/doc/web-facesconfig_2_0.xsd (working copy)
@@ -798,6 +798,20 @@
                     </xsd:documentation>
                 </xsd:annotation>
             </xsd:element>
+ <xsd:element name="tag-handler-helper-factory"
+ type="javaee:fully-qualified-classType">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ The "tag-handler-helper-factory" element contains
+ the fully qualified class name of the concrete
+ PageDeclarationLanguageFactory
+ implementation class that will be called when
+ FactoryFinder.getFactory(TAG_HANDLER_HELPER_FACTORY) is called.
+
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
             <xsd:element name="render-kit-factory"
                          type="javaee:fully-qualified-classType">
                 <xsd:annotation>
Index: jsf-api/src/javax/faces/FactoryFinder.java
===================================================================
--- jsf-api/src/javax/faces/FactoryFinder.java (revision 6754)
+++ jsf-api/src/javax/faces/FactoryFinder.java (working copy)
@@ -218,7 +218,7 @@
      * {_at_link javax.faces.webapp.pdl.tag.TagHandlerHelper} class name.</p>
      */
     public final static String TAG_HANDLER_HELPER_FACTORY =
- "javax.faces.webapp.pdl.tag.TagHandlerHelperFactory";
+ "javax.faces.webapp.pdl.facelets.tag.TagHandlerHelperFactory";
 
     // ------------------------------------------------------- Static Variables
 
@@ -241,7 +241,8 @@
          LIFECYCLE_FACTORY,
          PAGE_DECLARATION_LANGUAGE_FACTORY,
          PARTIAL_VIEW_CONTEXT_FACTORY,
- RENDER_KIT_FACTORY
+ RENDER_KIT_FACTORY,
+ TAG_HANDLER_HELPER_FACTORY
     };
 
     /**
@@ -635,6 +636,8 @@
                  javax.faces.render.RenderKitFactory.class);
             factoryClasses.put(PAGE_DECLARATION_LANGUAGE_FACTORY,
                  javax.faces.webapp.pdl.PageDeclarationLanguageFactory.class);
+ factoryClasses.put(TAG_HANDLER_HELPER_FACTORY,
+ javax.faces.webapp.pdl.facelets.tag.TagHandlerHelperFactory.class);
         }
         return factoryClasses.get(factoryClassName);
 
Index: jsf-api/src/javax/faces/webapp/pdl/facelets/tag/ComponentHandler.java
===================================================================
--- jsf-api/src/javax/faces/webapp/pdl/facelets/tag/ComponentHandler.java (revision 6754)
+++ jsf-api/src/javax/faces/webapp/pdl/facelets/tag/ComponentHandler.java (working copy)
@@ -54,6 +54,7 @@
 public class ComponentHandler extends MetaTagHandler {
     
     private TagHandlerHelper helper = null;
+ private ComponentConfig componentConfig = null;
 
     /**
      * <p class="changed_added_2_0">Leverage the {_at_link
@@ -65,11 +66,33 @@
      */
     public ComponentHandler(ComponentConfig config) {
         super(config);
+ this.componentConfig = config;
+
         TagHandlerHelperFactory helperFactory = (TagHandlerHelperFactory)
                 FactoryFinder.getFactory(FactoryFinder.TAG_HANDLER_HELPER_FACTORY);
         helper = helperFactory.createComponentHandlerHelper(this);
-
     }
+
+ public Tag getTag() {
+ return this.tag;
+ }
+
+ public ComponentConfig getComponentConfig() {
+ return this.componentConfig;
+ }
+
+ public TagAttribute getTagAttribute(String localName) {
+ return super.getAttribute(localName);
+ }
+
+ public String getTagId() {
+ return this.tagId;
+ }
+
+ @Override
+ public void setAttributes(FaceletContext ctx, Object instance) {
+ super.setAttributes(ctx, instance);
+ }
 
     /**
      * <p class="changed_added_2_0">The default implementation simply
@@ -103,6 +126,13 @@
         helper.apply(ctx, parent);
     }
     
+ public void applyNextHandler(FaceletContext ctx, UIComponent c)
+ throws IOException, FacesException, ELException {
+ // first allow c to get populated
+ this.nextHandler.apply(ctx, c);
+ }
+
+
     /**
      * <p class="changed_added_2_0">This method is guaranteed to be
      * called after the component has been created but before it has
@@ -117,7 +147,7 @@
      *
      * @since 2.0
      */
- protected void onComponentCreated(FaceletContext ctx, UIComponent c,
+ public void onComponentCreated(FaceletContext ctx, UIComponent c,
             UIComponent parent) {
         
     }
@@ -136,7 +166,7 @@
      *
      * @since 2.0
      */
- protected void onComponentPopulated(FaceletContext ctx, UIComponent c,
+ public void onComponentPopulated(FaceletContext ctx, UIComponent c,
             UIComponent parent) {
         
     }
Index: jsf-api/src/javax/faces/webapp/pdl/facelets/tag/TagHandlerHelper.java
===================================================================
--- jsf-api/src/javax/faces/webapp/pdl/facelets/tag/TagHandlerHelper.java (revision 6754)
+++ jsf-api/src/javax/faces/webapp/pdl/facelets/tag/TagHandlerHelper.java (working copy)
@@ -54,7 +54,7 @@
  * @since 2.0
  */
 
-abstract class TagHandlerHelper {
+public abstract class TagHandlerHelper {
 
     /**
      * <p class="changed_added_2_0">Return a {_at_link MetaRuleset}
Index: jsf-ri/src/com/sun/faces/facelets/tag/jsf/ComponentTagHandlerHelperImpl.java
===================================================================
--- jsf-ri/src/com/sun/faces/facelets/tag/jsf/ComponentTagHandlerHelperImpl.java (revision 0)
+++ jsf-ri/src/com/sun/faces/facelets/tag/jsf/ComponentTagHandlerHelperImpl.java (revision 0)
@@ -0,0 +1,327 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 1997-2007 Sun Microsystems, Inc. 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.html
+ * or glassfish/bootstrap/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 glassfish/bootstrap/legal/LICENSE.txt.
+ * Sun designates this particular file as subject to the "Classpath" exception
+ * as provided by Sun in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the License
+ * Header, with the fields enclosed by brackets [] replaced by your own
+ * identifying information: "Portions Copyrighted [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.MetaRulesetImpl;
+import com.sun.faces.facelets.tag.jsf.core.FacetHandler;
+import com.sun.faces.util.FacesLogger;
+import com.sun.faces.util.Util;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.el.ELException;
+import javax.el.ValueExpression;
+import javax.faces.FacesException;
+import javax.faces.application.Application;
+import javax.faces.component.ActionSource;
+import javax.faces.component.EditableValueHolder;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
+import javax.faces.component.ValueHolder;
+import javax.faces.component.behavior.AjaxBehavior;
+import javax.faces.component.behavior.AjaxBehaviors;
+import javax.faces.component.behavior.BehaviorHolder;
+import javax.faces.context.FacesContext;
+import javax.faces.event.InitialStateEvent;
+import javax.faces.webapp.pdl.facelets.FaceletContext;
+import javax.faces.webapp.pdl.facelets.FaceletException;
+import javax.faces.webapp.pdl.facelets.tag.ComponentConfig;
+import javax.faces.webapp.pdl.facelets.tag.ComponentHandler;
+import javax.faces.webapp.pdl.facelets.tag.MetaRuleset;
+import javax.faces.webapp.pdl.facelets.tag.TagAttribute;
+import javax.faces.webapp.pdl.facelets.tag.TagException;
+import javax.faces.webapp.pdl.facelets.tag.TagHandlerHelper;
+
+public class ComponentTagHandlerHelperImpl extends TagHandlerHelper {
+
+ private static final String INITIAL_STATE_EVENT_KEY = "facelets.tag.InitialStateEvent";
+
+ private ComponentHandler owner;
+
+ private final static Logger log = FacesLogger.FACELETS_COMPONENT.getLogger();
+
+ private final TagAttribute binding;
+
+ protected String componentType;
+
+ protected final TagAttribute id;
+
+ private final String rendererType;
+
+
+ public ComponentTagHandlerHelperImpl(ComponentHandler owner) {
+ this.owner = owner;
+ ComponentConfig config = owner.getComponentConfig();
+ this.componentType = config.getComponentType();
+ this.rendererType = config.getRendererType();
+ this.id = owner.getTagAttribute("id");
+ this.binding = owner.getTagAttribute("binding");
+
+ }
+
+ /**
+ * Method handles UIComponent tree creation in accordance with the JSF 1.2
+ * spec.
+ * <ol>
+ * <li>First determines this UIComponent's id by calling
+ * {_at_link #getId(FaceletContext) getId(FaceletContext)}.</li>
+ * <li>Search the parent for an existing UIComponent of the id we just
+ * grabbed</li>
+ * <li>If found, {_at_link com.sun.faces.facelets.tag.jsf.ComponentSupport#markForDeletion(javax.faces.component.UIComponent) mark}
+ * its children for deletion.</li>
+ * <li>If <i>not</i> found, call
+ * {_at_link #createComponent(FaceletContext) createComponent}.
+ * <ol>
+ * <li>Only here do we apply
+ * {_at_link com.sun.faces.facelets.tag.MetaTagHandlerImpl#setAttributes(FaceletContext, Object)}</li>
+ * <li>Set the UIComponent's id</li>
+ * <li>Set the RendererType of this instance</li>
+ * </ol>
+ * </li>
+ * <li>Now apply the nextHandler, passing the UIComponent we've
+ * created/found.</li>
+ * <li>Now add the UIComponent to the passed parent</li>
+ * <li>Lastly, if the UIComponent already existed (found), then
+ * {_at_link ComponentSupport#finalizeForDeletion(UIComponent) finalize} for deletion.</li>
+ * </ol>
+ *
+ * @see com.sun.faces.facelets.FaceletHandler#apply(com.sun.faces.facelets.FaceletContext, javax.faces.component.UIComponent)
+ *
+ * @throws TagException
+ * if the UIComponent parent is null
+ */
+
+ @Override
+ public void apply(FaceletContext ctx, UIComponent parent) throws IOException, FacesException, FaceletException, ELException {
+ // make sure our parent is not null
+ if (parent == null) {
+ throw new TagException(owner.getTag(), "Parent UIComponent was null");
+ }
+
+ // our id
+ String id = ctx.generateUniqueId(owner.getTagId());
+
+ // grab our component
+ UIComponent c = ComponentSupport.findChildByTagId(parent, id);
+ boolean componentFound = false;
+ if (c != null) {
+ componentFound = true;
+ // mark all children for cleaning
+ if (log.isLoggable(Level.FINE)) {
+ log.fine(owner.getTag()
+ + " Component["+id+"] Found, marking children for cleanup");
+ }
+ ComponentSupport.markForDeletion(c);
+ } else {
+ c = this.createComponent(ctx);
+ if (log.isLoggable(Level.FINE)) {
+ log.fine(owner.getTag() + " Component["+id+"] Created: "
+ + c.getClass().getName());
+ }
+ owner.setAttributes(ctx, c);
+
+ // mark it owned by a facelet instance
+ c.getAttributes().put(ComponentSupport.MARK_CREATED, id);
+
+ // assign our unique id
+ if (this.id != null) {
+ c.setId(this.id.getValue(ctx));
+ } else {
+ UIViewRoot root = ComponentSupport.getViewRoot(ctx, parent);
+ if (root != null) {
+ String uid = root.createUniqueId();
+ c.setId(uid);
+ }
+ }
+
+ if (this.rendererType != null) {
+ c.setRendererType(this.rendererType);
+ }
+
+ // hook method
+ this.privateOnComponentCreated(ctx, c, parent);
+ owner.onComponentCreated(ctx, c, parent);
+ }
+ c.pushComponentToEL(ctx.getFacesContext(), c);
+ // first allow c to get populated
+ owner.applyNextHandler(ctx, c);
+
+ // finish cleaning up orphaned children
+ if (componentFound) {
+ ComponentSupport.finalizeForDeletion(c);
+
+ if (getFacetName(ctx, parent) == null) {
+ parent.getChildren().remove(c);
+ }
+ }
+
+ c.processEvent(getInitialStateEvent(ctx.getFacesContext(), c));
+ owner.onComponentPopulated(ctx, c, parent);
+
+ // add to the tree afterwards
+ // this allows children to determine if it's
+ // been part of the tree or not yet
+ ComponentSupport.addComponent(ctx, parent, c);
+ c.popComponentFromEL(ctx.getFacesContext());
+
+
+ }
+
+ @Override
+ public MetaRuleset createMetaRuleset(Class type) {
+ Util.notNull("type", type);
+ MetaRuleset m = new MetaRulesetImpl(owner.getTag(), type);
+
+ // ignore standard component attributes
+ m.ignore("binding").ignore("id");
+
+ // add auto wiring for attributes
+ m.addRule(ComponentRule.Instance);
+
+ // if it's an ActionSource
+ if (ActionSource.class.isAssignableFrom(type)) {
+ m.addRule(ActionSourceRule.Instance);
+ }
+
+ // if it's a ValueHolder
+ if (ValueHolder.class.isAssignableFrom(type)) {
+ m.addRule(ValueHolderRule.Instance);
+
+ // if it's an EditableValueHolder
+ if (EditableValueHolder.class.isAssignableFrom(type)) {
+ m.ignore("submittedValue");
+ m.ignore("valid");
+ m.addRule(EditableValueHolderRule.Instance);
+ }
+ }
+
+ return m;
+ }
+
+ /**
+ * If the binding attribute was specified, use that in conjuction with our
+ * componentType String variable to call createComponent on the Application,
+ * otherwise just pass the componentType String.
+ * <p />
+ * If the binding was used, then set the ValueExpression "binding" on the
+ * created UIComponent.
+ *
+ * @see Application#createComponent(javax.faces.el.ValueBinding,
+ * javax.faces.context.FacesContext, java.lang.String)
+ * @see Application#createComponent(java.lang.String)
+ * @param ctx
+ * FaceletContext to use in creating a component
+ * @return
+ */
+ private UIComponent createComponent(FaceletContext ctx) {
+ UIComponent c = null;
+ FacesContext faces = ctx.getFacesContext();
+ Application app = faces.getApplication();
+ if (this.binding != null) {
+ ValueExpression ve = this.binding.getValueExpression(ctx,
+ Object.class);
+ c = app.createComponent(ve, faces, this.componentType, this.rendererType);
+ if (c != null) {
+ // Make sure the component supports 1.2
+ c.setValueExpression("binding", ve);
+ }
+ } else {
+ c = app.createComponent(faces, this.componentType, this.rendererType);
+ }
+ return c;
+ }
+
+ /**
+ * A hook method for allowing developers to do additional processing once Facelets
+ * creates the component. The 'setAttributes' method is still perferred, but this
+ * method will provide the parent UIComponent before it's been added to the tree and
+ * before any children have been added to the newly created UIComponent.
+ *
+ * @param ctx
+ * @param c
+ * @param parent
+ */
+ private void privateOnComponentCreated(FaceletContext ctx, UIComponent c, UIComponent parent) {
+ AjaxBehaviors ajaxBehaviors = (AjaxBehaviors)ctx.getFacesContext().getAttributes().
+ get(AjaxBehaviors.AJAX_BEHAVIORS);
+ if (ajaxBehaviors != null) {
+ AjaxBehavior ajaxBehavior = ajaxBehaviors.getCurrentBehavior();
+ if (ajaxBehavior != null) {
+ if (c instanceof BehaviorHolder) {
+ BehaviorHolder bHolder = (BehaviorHolder)c;
+ String event = bHolder.getDefaultEventName();
+ if (null != ajaxBehavior.getEvent()) {
+ event = ajaxBehavior.getEvent();
+ }
+ Collection eventNames = bHolder.getEventNames();
+ if (null != eventNames && eventNames.contains(event) ||
+ event.equals(bHolder.getDefaultEventName())) {
+ bHolder.addBehavior(event, ajaxBehavior);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Return the Facet name we are scoped in, otherwise null
+ * @param ctx
+ * @return
+ */
+ private final String getFacetName(FaceletContext ctx, UIComponent parent) {
+ return (String) parent.getAttributes().get(FacetHandler.KEY);
+ }
+
+ private static InitialStateEvent getInitialStateEvent(FacesContext context,
+ UIComponent source) {
+ InitialStateEvent ise = null;
+ Map<Object,Object> attrs = context.getAttributes();
+ if (null == (ise = (InitialStateEvent) attrs.get(INITIAL_STATE_EVENT_KEY))) {
+ ise = new InitialStateEvent(source);
+ attrs.put(INITIAL_STATE_EVENT_KEY, ise);
+ }
+ else {
+ ise.setComponent(source);
+ }
+
+ return ise;
+ }
+
+
+}
Index: jsf-ri/src/com/sun/faces/facelets/tag/jsf/TagHandlerHelperFactoryImpl.java
===================================================================
--- jsf-ri/src/com/sun/faces/facelets/tag/jsf/TagHandlerHelperFactoryImpl.java (revision 0)
+++ jsf-ri/src/com/sun/faces/facelets/tag/jsf/TagHandlerHelperFactoryImpl.java (revision 0)
@@ -0,0 +1,52 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 1997-2007 Sun Microsystems, Inc. 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.html
+ * or glassfish/bootstrap/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 glassfish/bootstrap/legal/LICENSE.txt.
+ * Sun designates this particular file as subject to the "Classpath" exception
+ * as provided by Sun in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the License
+ * Header, with the fields enclosed by brackets [] replaced by your own
+ * identifying information: "Portions Copyrighted [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 javax.faces.webapp.pdl.facelets.tag.ComponentHandler;
+import javax.faces.webapp.pdl.facelets.tag.TagHandlerHelper;
+import javax.faces.webapp.pdl.facelets.tag.TagHandlerHelperFactory;
+
+public class TagHandlerHelperFactoryImpl extends TagHandlerHelperFactory {
+
+ @Override
+ public TagHandlerHelper createComponentHandlerHelper(ComponentHandler owner) {
+ return new ComponentTagHandlerHelperImpl(owner);
+ }
+
+
+
+}
Index: jsf-ri/src/com/sun/faces/facelets/tag/jsf/html/HtmlComponentHandler.java
===================================================================
--- jsf-ri/src/com/sun/faces/facelets/tag/jsf/html/HtmlComponentHandler.java (revision 6754)
+++ jsf-ri/src/com/sun/faces/facelets/tag/jsf/html/HtmlComponentHandler.java (working copy)
@@ -53,13 +53,13 @@
 
 import javax.faces.webapp.pdl.facelets.tag.MetaRuleset;
 import javax.faces.webapp.pdl.facelets.tag.ComponentConfig;
-import com.sun.faces.facelets.tag.jsf.ComponentHandlerImpl;
+import javax.faces.webapp.pdl.facelets.tag.ComponentHandler;
 
 /**
  * @author Jacob Hookom
  * @version $Id$
  */
-public class HtmlComponentHandler extends ComponentHandlerImpl {
+public class HtmlComponentHandler extends ComponentHandler {
 
     /**
      * @param config
Index: jsf-ri/src/com/sun/faces/facelets/tag/MetaRulesetImpl.java
===================================================================
--- jsf-ri/src/com/sun/faces/facelets/tag/MetaRulesetImpl.java (revision 6754)
+++ jsf-ri/src/com/sun/faces/facelets/tag/MetaRulesetImpl.java (working copy)
@@ -78,7 +78,7 @@
  * @author Jacob Hookom
  * @version $Id$
  */
-final class MetaRulesetImpl extends MetaRuleset {
+public final class MetaRulesetImpl extends MetaRuleset {
 
     private final static Logger LOGGER = FacesLogger.FACELETS_META.getLogger();
     private final static WeakHashMap<Class, MetadataTarget> metadata =
Index: jsf-ri/src/com/sun/faces/jsf-ri-config.xml
===================================================================
--- jsf-ri/src/com/sun/faces/jsf-ri-config.xml (revision 6754)
+++ jsf-ri/src/com/sun/faces/jsf-ri-config.xml (working copy)
@@ -71,6 +71,9 @@
     <page-declaration-language-factory>
       com.sun.faces.application.view.PageDeclarationLanguageFactoryImpl
     </page-declaration-language-factory>
+ <tag-handler-helper-factory>
+ com.sun.faces.facelets.tag.jsf.TagHandlerHelperFactoryImpl
+ </tag-handler-helper-factory>
     <external-context-factory>
       com.sun.faces.context.ExternalContextFactoryImpl
     </external-context-factory>
Index: jsf-ri/src/com/sun/faces/config/processor/FactoryConfigProcessor.java
===================================================================
--- jsf-ri/src/com/sun/faces/config/processor/FactoryConfigProcessor.java (revision 6754)
+++ jsf-ri/src/com/sun/faces/config/processor/FactoryConfigProcessor.java (working copy)
@@ -94,6 +94,11 @@
     private static final String PAGE_DECLARATION_LANGUAGE_FACTORY = "page-declaration-language-factory";
 
     /**
+ * <code>/faces-config/factory/tag-handler-helper-factory</code>
+ */
+ private static final String TAG_HANDLER_HELPER_FACTORY = "tag-handler-helper-factory";
+
+ /**
      * <code>/faces-config/factory/faces-context-factory</code>
      */
     private static final String FACES_CONTEXT_FACTORY = "faces-context-factory";
@@ -252,6 +257,9 @@
                 } else if (PAGE_DECLARATION_LANGUAGE_FACTORY.equals(n.getLocalName())) {
                     setFactory(FactoryFinder.PAGE_DECLARATION_LANGUAGE_FACTORY,
                                getNodeText(n));
+ } else if (TAG_HANDLER_HELPER_FACTORY.equals(n.getLocalName())) {
+ setFactory(FactoryFinder.TAG_HANDLER_HELPER_FACTORY,
+ getNodeText(n));
                 } else if (EXTERNAL_CONTEXT_FACTORY.equals(n.getLocalName())) {
                     extCount.incrementAndGet();
                     setFactory(FactoryFinder.EXTERNAL_CONTEXT_FACTORY,


SECTION: New Files
----------------------------
SEE ATTACHMENTS

-- 
| ed.burns_at_sun.com  | office: 408 884 9519 OR x31640
| homepage:         | http://ridingthecrest.com/