/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.myfaces.trinidadbuild.plugin.faces.parse;

import java.io.IOException;
import java.io.InputStream;

import java.net.URL;
import java.net.URLConnection;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import org.apache.commons.digester.AbstractObjectCreationFactory;
import org.apache.commons.digester.Digester;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.myfaces.trinidadbuild.plugin.faces.parse.rules.BeanPropertySetterRule;
import org.apache.myfaces.trinidadbuild.plugin.faces.util.XIncludeFilter;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;


public class FacesConfigParser
{
  public void merge(
    FacesConfigBean owner,
    URL             url) throws MojoExecutionException
  {
    try
    {
      URLConnection conn = url.openConnection();
      long lastModified = conn.getLastModified();
      InputStream is = conn.getInputStream();

      if (is != null)
      {
        // Establish the current last-modified value
        // As new components are added, they will remember
        // this current value as their own last-modified
        owner.touch(lastModified);

        Digester digester = createDigester();
        digester.push(url);
        digester.push(owner);
        digester.parse(is);
        is.close();
      }
    }
    catch (IOException e)
    {
      throw new MojoExecutionException("Failed to parse " + url, e);
    }
    catch (SAXException e)
    {
      throw new MojoExecutionException("Failed to parse " + url, e);
    }
    catch (ParserConfigurationException e)
    {
      throw new MojoExecutionException("Failed to parse " + url, e);
    }
  }


  static protected Digester createEmptyDigester()
    throws ParserConfigurationException, SAXException
  {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setNamespaceAware(true);
    // requires JAXP 1.3, in JavaSE 5.0
    // spf.setXIncludeAware(true);
    Digester digester = new Digester(spf.newSAXParser());
    digester.setNamespaceAware(true);

    return digester;
  }

  static protected void addComponentDigesterRules(Digester digester, boolean withCreate)
  {
    digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee");

    // faces-config/component
    // Only use if we're creating the component;  turn this off
    // when we're simply including content
    if (withCreate)
    {
      // faces-config/component
      digester.addObjectCreate("faces-config/component", ComponentBean.class);
      digester.addBeanPropertySetter("faces-config/component/component-type",
                                     "componentType");
      digester.addBeanPropertySetter("faces-config/component/component-class",
                                     "componentClass");
      digester.addBeanPropertySetter("faces-config/component/js-component-class",
                                     "jsComponentClass");
      digester.addBeanPropertySetter("faces-config/component/description");
      digester.addSetNext("faces-config/component", "addComponent",
                          ComponentBean.class.getName());
    }

    // faces-config/component/property
    digester.addObjectCreate("faces-config/component/property", PropertyBean.class);
    addComponentPropertyDigesterRules(digester);
    digester.addSetNext("faces-config/component/property", "addProperty",
                        PropertyBean.class.getName());


    // faces-config/component/facet
    digester.addObjectCreate("faces-config/component/facet", FacetBean.class);
    digester.addBeanPropertySetter("faces-config/component/facet/facet-name",
                                   "facetName");
    digester.addBeanPropertySetter("faces-config/component/facet/description");
    digester.addSetNext("faces-config/component/facet", "addFacet",
                        FacetBean.class.getName());

    // Maven Faces Plugin
    digester.setRuleNamespaceURI("http://myfaces.apache.org/maven-faces-plugin");

    // faces-config/component/facet/facet-extension
    digester.addBeanPropertySetter("faces-config/component/facet/facet-extension/hidden");

    // faces-config/component/facet/facet-extension/facet-metadata/accessibility-guideline
    digester.addCallMethod("faces-config/component/facet/facet-extension/facet-metadata/accessibility-guideline",
                           "addAccessibilityGuideline", 1);
    digester.addCallParam("faces-config/component/facet/facet-extension/facet-metadata/accessibility-guideline", 0);

    // faces-config/component/facet/example
    digester.addObjectCreate("faces-config/component/facet/example",
                             ExampleBean.class);
    digester.addBeanPropertySetter("faces-config/component/facet/example/source-description",
                                   "sourceDescription");
    digester.addBeanPropertySetter("faces-config/component/facet/example/source-code",
                                   "sourceCode");
    digester.addSetNext("faces-config/component/facet/example",
                        "addExample", ExampleBean.class.getName());

    // faces-config/component/component-extension
    digester.addBeanPropertySetter("faces-config/component/component-extension/long-description",
                                   "longDescription");
    digester.addBeanPropertySetter("faces-config/component/component-extension/component-family",
                                   "componentFamily");
    digester.addBeanPropertySetter("faces-config/component/component-extension/component-supertype",
                                   "componentSupertype");
    digester.addBeanPropertySetter("faces-config/component/component-extension/component-superclass",
                                   "componentSuperclass");
    digester.addBeanPropertySetter("faces-config/component/component-extension/renderer-type",
                                   "rendererType");
    digester.addBeanPropertySetter("faces-config/component/component-extension/naming-container",
                                   "namingContainer");
    digester.addBeanPropertySetter("faces-config/component/component-extension/accepts-child-components",
                                   "children");
    digester.addBeanPropertySetter("faces-config/component/component-extension/tag-class",
                                   "tagClass");
    digester.addBeanPropertySetter("faces-config/component/component-extension/tag-superclass",
                                   "tagSuperclass");
    digester.addBeanPropertySetter("faces-config/component/component-extension/tag-handler",
                                   "tagHandler");
    digester.addBeanPropertySetter("faces-config/component/component-extension/implementation-type",
                                   "implementationType");
    digester.addCallMethod("faces-config/component/component-extension/tag-class-modifier",
                           "parseTagClassModifier", 1);
    digester.addCallParam("faces-config/component/component-extension/tag-class-modifier", 0);
    digester.addCallMethod("faces-config/component/component-extension/unsupported-agents",
                           "parseUnsupportedAgents", 1);
    digester.addCallParam("faces-config/component/component-extension/unsupported-agents", 0);

    digester.addCallMethod("faces-config/component/component-extension/component-class-modifier",
                           "parseComponentClassModifier", 1);
    digester.addCallParam("faces-config/component/component-extension/component-class-modifier", 0);
    digester.addRule("faces-config/component/component-extension/tag-name",
                     new BeanPropertySetterRule("tagName"));
    digester.addBeanPropertySetter("faces-config/component/component-extension/uix2-local-name",
                                   "localName");
    digester.addBeanPropertySetter("faces-config/component/component-extension/uix2-node-class",
                                   "nodeClass");

    // faces-config/component/component-extension/accessibility-guideline
    digester.addCallMethod("faces-config/component/component-extension/accessibility-guideline",
                           "addAccessibilityGuideline", 1);
    digester.addCallParam("faces-config/component/component-extension/accessibility-guideline", 0);

    // faces-config/component/component-extension/example
    digester.addObjectCreate("faces-config/component/component-extension/example",
                             ExampleBean.class);
    digester.addBeanPropertySetter("faces-config/component/component-extension/example/source-description",
                                   "sourceDescription");
    digester.addBeanPropertySetter("faces-config/component/component-extension/example/source-code",
                                   "sourceCode");
    digester.addSetNext("faces-config/component/component-extension/example",
                        "addExample", ExampleBean.class.getName());

    // faces-config/component/component-extension/screenshot
    digester.addObjectCreate("faces-config/component/component-extension/screenshot",
                             ScreenshotBean.class);
    digester.addBeanPropertySetter("faces-config/component/component-extension/screenshot/description",
                                   "description");
    digester.addBeanPropertySetter("faces-config/component/component-extension/screenshot/image",
                                   "image");
    digester.addSetNext("faces-config/component/component-extension/screenshot",
                        "addScreenshot", ScreenshotBean.class.getName());

    // faces-config/component/component-extension/event
    digester.addObjectCreate("faces-config/component/component-extension/event", EventRefBean.class);
    digester.addBeanPropertySetter("faces-config/component/component-extension/event/event-type",
                                   "eventType");
    digester.addBeanPropertySetter("faces-config/component/component-extension/event/event-delivery-phase",
                                   "eventDeliveryPhases");
    digester.addBeanPropertySetter("faces-config/component/component-extension/event/ignore-source-interface",
                                   "ignoreSourceInterface");
    digester.addSetNext("faces-config/component/component-extension/event", "addEvent",
                        EventRefBean.class.getName());

    // jsr-276 metadata rules
    digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee/faces/design-time-metadata");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/property-metadata/required");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/property-metadata/value-expression", "valueExpression");
    digester.addBeanPropertySetter("faces-config/component/component-extension/component-metadata/default-event-name",
                                   "defaultEventName");
    digester.addBeanPropertySetter("faces-config/component/facet/facet-extension/facet-metadata/hidden");
    digester.addCallMethod("faces-config/component/component-extension/component-metadata/event-names",
                           "parseEventNames", 1);
    digester.addCallParam("faces-config/component/component-extension/component-metadata/event-names", 0);

    // faces-config/component/component-extension/component-metadata/deprecated
    digester.addBeanPropertySetter("faces-config/component/component-extension/component-metadata/deprecated");

    // faces-config/component/facet/facet-extension/facet-metadata/allowed-child-components
    digester.addCallMethod("faces-config/component/facet/facet-extension/facet-metadata/allowed-child-components",
                           "parseAllowedChildComponents", 1);
    digester.addCallParam("faces-config/component/facet/facet-extension/facet-metadata/allowed-child-components", 0);

    // faces-config/component/component-extension/component-metadata/required-ancestor-contracts
    digester.addCallMethod("faces-config/component/component-extension/component-metadata/required-ancestor-contracts",
                           "parseRequiredAncestorContracts", 1);
    digester.addCallParam("faces-config/component/component-extension/component-metadata/required-ancestor-contracts", 0);

    // faces-config/component/component-extension/component-metadata/satisfied-contracts
    digester.addCallMethod("faces-config/component/component-extension/component-metadata/satisfied-contracts",
                           "parseSatisfiedContracts", 1);
    digester.addCallParam("faces-config/component/component-extension/component-metadata/satisfied-contracts", 0);

    // XInclude rules
    digester.setRuleNamespaceURI(XIncludeFilter.XINCLUDE_NAMESPACE);
    digester.addFactoryCreate("faces-config/component/include",
                              ComponentIncludeFactory.class);
    digester.addFactoryCreate("faces-config/component/property/include",
                              ComponentPropertyIncludeFactory.class);
    digester.addFactoryCreate("faces-config/component/component-extension/include",
                              ComponentIncludeFactory.class);
    digester.addFactoryCreate("faces-config/component/component-extension/component-metadata/include",
                              ComponentIncludeFactory.class);
  }

  // Add component property-related digster rules
  protected static void addComponentPropertyDigesterRules(Digester digester)
  {
    String oldNamespace = digester.getRuleNamespaceURI();

    digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee");

    digester.addBeanPropertySetter("faces-config/component/property/property-name",
                                   "propertyName");
    digester.addBeanPropertySetter("faces-config/component/property/property-class",
                                   "propertyClass");
    digester.addBeanPropertySetter("faces-config/component/property/description");
    digester.addBeanPropertySetter("faces-config/component/property/default-value",
                                   "defaultValue");

    // Maven Faces Plugin
    digester.setRuleNamespaceURI("http://myfaces.apache.org/maven-faces-plugin");

    // faces-config/component/property/property-extension
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/state-holder",
                                   "stateHolder");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/jsp-property-name",
                                   "jspPropertyName");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/list",
                                   "list");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/required");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/alias-of",
                                   "aliasOf");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/virtual");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/transient");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/literal-only",
                                   "literalOnly");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/mutable",
                                   "mutable");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/enum",
                                   "enum");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/alternate-class",
                                   "alternateClass");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/tag-attribute-excluded",
                                   "tagAttributeExcluded");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/hidden");
    digester.addCallMethod("faces-config/component/property/property-extension/property-values",
                           "parsePropertyValues", 1);
    digester.addCallParam("faces-config/component/property/property-extension/property-values", 0);
    digester.addCallMethod("faces-config/component/property/property-extension/unsupported-agents",
                           "parseUnsupportedAgents", 1);
    digester.addCallParam("faces-config/component/property/property-extension/unsupported-agents", 0);
    digester.addCallMethod("faces-config/component/property/property-extension/unsupported-render-kits",
                           "parseUnsupportedRenderKits", 1);
    digester.addCallParam("faces-config/component/property/property-extension/unsupported-render-kits", 0);

    digester.addObjectCreate("faces-config/component/property/property-extension/method-binding-signature",
                             MethodSignatureBean.class);
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/method-binding-signature/return-type",
                                   "returnType");
    digester.addCallMethod("faces-config/component/property/property-extension/method-binding-signature/parameter-type",
                           "addParameterType", 1);
    digester.addCallParam("faces-config/component/property/property-extension/method-binding-signature/parameter-type", 0);
    digester.addSetNext("faces-config/component/property/property-extension/method-binding-signature",
                        "setMethodBindingSignature",
                        MethodSignatureBean.class.getName());

    // faces-config/component/property/property-extension/property-metadata
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/property-metadata/use-max-time",
                                   "useMaxTime");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/property-metadata/deprecated");
    digester.addCallMethod("faces-config/component/property/property-extension/property-metadata/no-op", "makeNoOp");

    // faces-config/component/property/property-extension/property-metadata/accessibility-guideline
    digester.addCallMethod("faces-config/component/property/property-extension/property-metadata/accessibility-guideline",
                           "addAccessibilityGuideline", 1);
    digester.addCallParam("faces-config/component/property/property-extension/property-metadata/accessibility-guideline", 0);

    // jsr-276 metadata rules
    digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee/faces/design-time-metadata");
    digester.addCallMethod("faces-config/component/property/property-extension/property-metadata/property-values",
                           "parsePropertyValues", 1);
    digester.addCallParam("faces-config/component/property/property-extension/property-metadata/property-values", 0);
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/property-metadata/deprecated");
    digester.addBeanPropertySetter("faces-config/component/property/property-extension/property-metadata/hidden");

    digester.setRuleNamespaceURI(oldNamespace);
  }

  protected static void addConverterDigesterRules(Digester digester)
  {
    digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee");

    // faces-config/converter
    digester.addObjectCreate("faces-config/converter", ConverterBean.class);
    digester.addBeanPropertySetter("faces-config/converter/converter-id",
                                   "converterId");
    digester.addBeanPropertySetter("faces-config/converter/converter-class",
                                   "converterClass");
    digester.addBeanPropertySetter("faces-config/converter/description");
    digester.addSetNext("faces-config/converter", "addConverter",
                        ConverterBean.class.getName());

    // faces-config/converter/property
    digester.addObjectCreate("faces-config/converter/property", PropertyBean.class);
    digester.addBeanPropertySetter("faces-config/converter/property/property-name",
                                   "propertyName");
    digester.addBeanPropertySetter("faces-config/converter/property/property-class",
                                   "propertyClass");
    digester.addBeanPropertySetter("faces-config/converter/property/description");
    digester.addBeanPropertySetter("faces-config/converter/property/default-value",
                                   "defaultValue");
    digester.addSetNext("faces-config/converter/property", "addProperty",
                        PropertyBean.class.getName());

    // Maven Faces Plugin
    digester.setRuleNamespaceURI("http://myfaces.apache.org/maven-faces-plugin");

    // faces-config/converter/converter-extension
    digester.addBeanPropertySetter("faces-config/converter/converter-extension/root-converter-id",
                                   "rootConverterId");
    digester.addBeanPropertySetter("faces-config/converter/converter-extension/long-description",
                                   "longDescription");
    digester.addBeanPropertySetter("faces-config/converter/converter-extension/tag-class",
                                   "tagClass");
    digester.addRule("faces-config/converter/converter-extension/tag-name",
                     new BeanPropertySetterRule("tagName"));
    digester.addCallMethod("faces-config/converter/converter-extension/tag-class-modifier",
                           "parseTagClassModifier", 1);
    digester.addCallParam("faces-config/converter/converter-extension/tag-class-modifier", 0);

    // faces-config/converter/converter-extension/example
    digester.addObjectCreate("faces-config/converter/converter-extension/example",
                             ExampleBean.class);
    digester.addBeanPropertySetter("faces-config/converter/converter-extension/example/source-description",
                                   "sourceDescription");
    digester.addBeanPropertySetter("faces-config/converter/converter-extension/example/source-code",
                                   "sourceCode");
    digester.addSetNext("faces-config/converter/converter-extension/example",
                        "addExample", ExampleBean.class.getName());

    // faces-config/converter/property/property-extension
    digester.addBeanPropertySetter("faces-config/converter/property/property-extension/tag-attribute-excluded",
                                   "tagAttributeExcluded");
  }

  protected static void addValidatorDigesterRules(Digester digester)
  {
    // Java Enterprise 5.0
    digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee");

    // faces-config/validator
    digester.addObjectCreate("faces-config/validator", ValidatorBean.class);
    digester.addBeanPropertySetter("faces-config/validator/validator-id",
                                   "validatorId");
    digester.addBeanPropertySetter("faces-config/validator/validator-class",
                                   "validatorClass");
    digester.addBeanPropertySetter("faces-config/validator/description");
    digester.addSetNext("faces-config/validator", "addValidator",
                        ValidatorBean.class.getName());

    // faces-config/validator/property
    digester.addObjectCreate("faces-config/validator/property", PropertyBean.class);
    digester.addBeanPropertySetter("faces-config/validator/property/property-name",
                                   "propertyName");
    digester.addBeanPropertySetter("faces-config/validator/property/property-class",
                                   "propertyClass");
    digester.addBeanPropertySetter("faces-config/validator/property/description");
    digester.addBeanPropertySetter("faces-config/validator/property/default-value",
                                   "defaultValue");
    digester.addSetNext("faces-config/validator/property", "addProperty",
                        PropertyBean.class.getName());

    // Maven Faces Plugin
    digester.setRuleNamespaceURI("http://myfaces.apache.org/maven-faces-plugin");

    // faces-config/validator/validator-extension
    digester.addBeanPropertySetter("faces-config/validator/validator-extension/root-validator-id",
                                   "rootValidatorId");
    digester.addBeanPropertySetter("faces-config/validator/validator-extension/long-description",
                                   "longDescription");
    digester.addBeanPropertySetter("faces-config/validator/validator-extension/tag-class",
                                   "tagClass");
    digester.addRule("faces-config/validator/validator-extension/tag-name",
                     new BeanPropertySetterRule("tagName"));
    digester.addCallMethod("faces-config/validator/validator-extension/tag-class-modifier",
                           "parseTagClassModifier", 1);
    digester.addCallParam("faces-config/validator/validator-extension/tag-class-modifier", 0);

    // faces-config/validator/validator-extension/example
    digester.addObjectCreate("faces-config/validator/validator-extension/example",
                             ExampleBean.class);
    digester.addBeanPropertySetter("faces-config/validator/validator-extension/example/source-description",
                                   "sourceDescription");
    digester.addBeanPropertySetter("faces-config/validator/validator-extension/example/source-code",
                                   "sourceCode");
    digester.addSetNext("faces-config/validator/validator-extension/example",
                        "addExample", ExampleBean.class.getName());

    // faces-config/validator/property/property-extension
    digester.addBeanPropertySetter("faces-config/validator/property/property-extension/tag-attribute-excluded",
                                   "tagAttributeExcluded");
    // faces-config/validator/property/property-extension/property-metada
    digester.addBeanPropertySetter("faces-config/validator/property/property-extension/property-metadata/use-max-time",
                                 "useMaxTime");
  }

  protected static void addRenderKitDigesterRules(Digester digester)
  {
    // Java Enterprise 5.0
    digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee");

    // faces-config/render-kit
    digester.addObjectCreate("faces-config/render-kit", RenderKitBean.class);
    digester.addBeanPropertySetter("faces-config/render-kit/render-kit-id",
                                   "renderKitId");
    digester.addSetNext("faces-config/render-kit", "addRenderKit",
                        RenderKitBean.class.getName());

    // faces-config/render-kit/renderer
    digester.addObjectCreate("faces-config/render-kit/renderer", RendererBean.class);
    digester.addBeanPropertySetter("faces-config/render-kit/renderer/description");
    digester.addBeanPropertySetter("faces-config/render-kit/renderer/component-family",
                                   "componentFamily");
    digester.addBeanPropertySetter("faces-config/render-kit/renderer/renderer-type",
                                   "rendererType");
    digester.addBeanPropertySetter("faces-config/render-kit/renderer/renderer-class",
                                   "rendererClass");
    digester.addSetNext("faces-config/render-kit/renderer", "addRenderer",
                        RendererBean.class.getName());

    // Maven Faces Plugin
    digester.setRuleNamespaceURI("http://myfaces.apache.org/maven-faces-plugin");

    // faces-config/render-kit/renderer/renderer-extension
    digester.addBeanPropertySetter("faces-config/render-kit/renderer/renderer-extension/component-type",
                                   "componentType");
    digester.addBeanPropertySetter("faces-config/render-kit/renderer/renderer-extension/renderer-superclass",
                                   "rendererSuperclass");
  }

  protected static void addEventDigesterRules(Digester digester)
  {
    // Java Enterprise 5.0
    // digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee");

    // Maven Faces Plugin
    digester.setRuleNamespaceURI("http://myfaces.apache.org/maven-faces-plugin");

    // faces-config/faces-config-extension/event
    digester.addObjectCreate("faces-config/faces-config-extension/event", EventBean.class);
    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/description");
    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/event-type",
                                   "eventType");
    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/event-class",
                                   "eventClass");
    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/event-listener-class",
                                   "eventListenerClass");
    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/event-source-interface",
                                   "eventSourceInterface");
    digester.addSetNext("faces-config/faces-config-extension/event", "addEvent",
                        EventBean.class.getName());
  }

  protected Digester createDigester() throws ParserConfigurationException, SAXException
  {
    Digester digester = createEmptyDigester();

    addComponentDigesterRules(digester, true);

   //digester.addObjectCreate("faces-config", FacesConfigBean.class);

    addConverterDigesterRules(digester);
    addValidatorDigesterRules(digester);
    addRenderKitDigesterRules(digester);
    addEventDigesterRules(digester);

    // TBD: JSR-276 metadata (ask Jeff Stephenson)

    return digester;
  }

  // Base class for include factories
  abstract static public class AbstractIncludeFactory extends AbstractObjectCreationFactory
  {
    public Object createObject(
      Attributes attributes) throws Exception
    {
      String href = attributes.getValue("href");
      if (href == null)
        throw new IllegalStateException("Missing href attribute");

      URL master = (URL)digester.getRoot();
      URL included = new URL(master, href);

      Digester includedDigester = createEmptyDigester();
      addDigesterRules(includedDigester);
      includedDigester.push(included);
      includedDigester.push(digester.peek());

      URLConnection conn = included.openConnection();
      InputStream is = conn.getInputStream();
      includedDigester.parse(is);
      is.close();

      // We don't really want the included object - but return it anyway
      return included;
    }

    abstract public void addDigesterRules(Digester includedDigester);
  }

  // Factory for component includes
  static public class ComponentIncludeFactory extends AbstractIncludeFactory
  {
    public void addDigesterRules(Digester digester) {
      addComponentDigesterRules(digester, false);
    }
  }

  // Factory for component property includes
  static public class ComponentPropertyIncludeFactory extends AbstractIncludeFactory
  {
    public void addDigesterRules(Digester digester) {
      addComponentPropertyDigesterRules(digester);
    }
  }

}
