<?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>

    <!-- 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>
        </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>
        </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>
