<?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.
-->
<!DOCTYPE facelet-taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">

    <namespace>$uri</namespace>

$baseContent

    <!-- Component Tags -->
#set ($componentList = ${model.getComponents()})
#foreach( $component in $componentList )
#if ($modelIds.contains($component.modelId) 
    && ($component.name))
#if (!$component.isConfigExcluded())
#if ($utils.getTagPrefix($component.name) == $shortname)
    <tag>
        <tag-name>$utils.getTagName($component.name)</tag-name>
        <component>
            <component-type>$component.type</component-type>
#if ($component.rendererType)
#if (!($component.rendererType == ""))
            <renderer-type>$component.rendererType</renderer-type>
#end
#end
#if ($component.tagHandler)
            <handler-class>$component.tagHandler</handler-class>
#end
        </component>
    </tag>
#end
#end
#end
#end

   <!-- Converter tags -->
#set ($componentList = ${model.getConverters()})
#foreach( $component in $componentList )
#if ($modelIds.contains($component.modelId) 
    && ($component.name))
#if ($component.converterId)
#if ($utils.getTagPrefix($component.name) == $shortname) 
    <tag>
        <tag-name>$utils.getTagName($component.name)</tag-name>
        <converter>
            <converter-id>$component.converterId</converter-id>
#if ($component.tagHandler)
            <handler-class>$component.tagHandler</handler-class>
#end
        </converter>
    </tag>
#end
#end
#end
#end

   <!-- Validator tags -->
#set ($componentList = ${model.getValidators()})
#foreach( $component in $componentList )
#if ($modelIds.contains($component.modelId) 
    && ($component.name))
#if ($component.validatorId)
#if ($utils.getTagPrefix($component.name) == $shortname)
    <tag>
        <tag-name>$utils.getTagName($component.name)</tag-name>
        <validator>
            <validator-id>$component.validatorId</validator-id>
#if ($component.tagHandler)
            <handler-class>$component.tagHandler</handler-class>
#end
        </validator>
    </tag>
#end
#end
#end
#end
    
   <!-- Single Tags -->
#set ($tagList = $model.getTags())
#foreach( $tag in $tagList )
#if ($modelIds.contains($tag.modelId))
#if ($tag.tagHandler)
#if ($utils.getTagPrefix($tag.name) == $shortname)
   <tag>
      <tag-name>$utils.getTagName($tag.name)</tag-name>
      <handler-class>$tag.tagHandler</handler-class>
   </tag>
#end
#end
#end
#end

</facelet-taglib>
