<?xml version="1.0" encoding="utf-8"?>

<!--
 * 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.
-->

<faces-config 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-facesconfig_1_2.xsd" 
              version="1.2">

$baseContent

#set ($componentList = ${model.getComponents()})
#foreach( $component in $componentList )
#if ($modelIds.contains($component.modelId)
    && !($component.isConfigExcluded()))
  <component>
#if ($component.longDescription)
    <description><![CDATA[$component.longDescription]]></description>
#end    
    <component-type>$component.type</component-type>
    <component-class>$component.className</component-class>
#set ($facetList = ${component.facetList})
#foreach( $facet in $facetList )
    <facet>
#if ($facet.longDescription)
        <description><![CDATA[$facet.longDescription]]></description>
#end
        <facet-name>$facet.name</facet-name>
    </facet>
#end
#set ($propertyList = ${component.propertyList})
#foreach( $property in $propertyList )
## Theorically, it should only add properties visible on tld or transient
## (not visible on tld but used on renderers like "transient").
## On myfaces core 1.2, only "transient" property use it.
## But inclusive, some tagExcluded properties belongs to the
## component class or are used by some reason (for example in UIInput 
## valid, localValueSet or submittedValue).
## Anyway, this information works only as metadata.
#if (!$property.name.equals("binding"))  ## binding is used only in tag class or tag handler
## !$property.isTagExcluded() || $property.isTransient()
#if ( true )
    <property>
#if ($property.longDescription)
         <description><![CDATA[$property.longDescription]]></description>
#end
         <property-name>$property.name</property-name>
         <property-class>$property.className</property-class>
#if($utils.getDefaultValueField($property))
#set ($defaultValue = $utils.getDefaultValueField($property))
#if ($defaultValue.charAt(0) == '"')
#set ($dVsize = $defaultValue.length() - 1)
#set ($defaultValue = $defaultValue.substring(1,$dVsize) ) 
#end
         <default-value>$defaultValue</default-value>
#end
    </property>
#end
#end
#end
##    <component-extension>
##      <component-family>$component.family</component-family>
###if ($component.rendererType)
###if (!($component.rendererType == ""))
##      <renderer-type>$component.rendererType</renderer-type>
###end
###end
##    </component-extension>
  </component>    
#end
#end
#set ($converterList = ${model.getConverters()})
#foreach( $converter in $converterList )
#if ($modelIds.contains($converter.modelId)
    && !($converter.isConfigExcluded()))
  <converter>
#if ($converter.longDescription)
    <description><![CDATA[$converter.longDescription]]></description>
#end    
    <converter-id>$converter.converterId</converter-id>
    <converter-class>$converter.className</converter-class>
#set ($propertyList = ${converter.propertyList})
#foreach( $property in $propertyList )
#if (!$property.name.equals("binding"))  ## binding is used only in tag class or tag handler
    <property>
#if ($property.longDescription)
         <description><![CDATA[$property.longDescription]]></description>
#end
         <property-name>$property.name</property-name>
         <property-class>$property.className</property-class>
#if($utils.getDefaultValueField($property))
#set ($defaultValue = $utils.getDefaultValueField($property))
#if ($defaultValue.charAt(0) == '"')
#set ($dVsize = $defaultValue.length() - 1)
#set ($defaultValue = $defaultValue.substring(1,$dVsize) ) 
#end
         <default-value>$defaultValue</default-value>
#end
    </property>
#end
#end
  </converter>
#end
#end
#set ($validatorList = ${model.getValidators()})
#foreach( $validator in $validatorList )
#if ($modelIds.contains($validator.modelId) &&
    !($validator.isConfigExcluded().booleanValue()) &&
    $validator.validatorId)
  <validator>
#if ($validator.longDescription)
    <description><![CDATA[$validator.longDescription]]></description>
#end
#if ($validator.name)
   <display-name>$utils.getTagName($validator.name)</display-name>
#end
    <validator-id>$validator.validatorId</validator-id>
    <validator-class>$validator.className</validator-class>
#set ($propertyList = ${validator.propertyList})
#foreach( $property in $propertyList )
#if (!$property.name.equals("binding"))  ## binding is used only in tag class or tag handler
    <property>
#if ($property.longDescription)
         <description><![CDATA[$property.longDescription]]></description>
#end
         <property-name>$property.name</property-name>
         <property-class>$property.className</property-class>
#if($utils.getDefaultValueField($property))
#set ($defaultValue = $utils.getDefaultValueField($property))
#if ($defaultValue.charAt(0) == '"')
#set ($dVsize = $defaultValue.length() - 1)
#set ($defaultValue = $defaultValue.substring(1,$dVsize) ) 
#end
         <default-value>$defaultValue</default-value>
#end
    </property>
#end
#end
  </validator>
#end
#end
#set ($renderKitList = ${model.getRenderKits()})
#foreach( $renderKit in $renderKitList )
  <render-kit>
    <render-kit-id>$renderKit.renderKitId</render-kit-id>
#if ($renderKit.className)
    <render-kit-class>$renderKit.className</render-kit-class>
#end
#set ($rendererList = ${renderKit.getRenderers()})
#foreach( $renderer in $rendererList )
      <renderer>
        <component-family>$renderer.componentFamily</component-family>
        <renderer-type>$renderer.rendererType</renderer-type>
        <renderer-class>$renderer.className</renderer-class>
      </renderer>
#end
  </render-kit>
#end
</faces-config>
