<?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.
-->
<taglib 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-jsptaglibrary_2_1.xsd"
    version="2.1">
   <description>$description</description>
   <display-name>$displayname</display-name>
   <tlib-version>1.1.7</tlib-version>
   <short-name>$shortname</short-name>
   <uri>$uri</uri>
   
   

$baseContent

## ----------------------------- START MACROS -----------------------------
##
## -------------------------------
## writeJSFComponentProperty
## -------------------------------
##
#macro (writeJSFComponentProperty $property)
#if (!$property.isTagExcluded())
      <attribute>
#if ($property.longDescription)
         <description><![CDATA[$property.longDescription]]></description>
#else
         <description><![CDATA[]]></description>
#end
         <name>$property.jspName</name>
#if ($property.isRequired())
         <required>$property.isRequired()</required>
#end
#if ($property.isMethodExpression() || $property.isMethodBinding())
#if ($property.getMethodBindingSignature())
        <deferred-method>
#set ($sig = $property.getMethodBindingSignature())
            <method-signature>$sig.returnType myMethod( $sig.parameterTypesAsString )</method-signature>

        </deferred-method>
#else
## This is a very special case. If a property is MethodBinding or MethodExpression
## this should have a signature. If not, for allow multiple MethodBinding
## simulate a ValueExpression and write a custom code like in 
## org.apache.myfaces.custom.suggestajax.AbstractSuggestAjaxTag
         <deferred-value/>
#end
#elseif ($property.isLiteralOnly())
         <rtexprvalue>false</rtexprvalue>
#else
#if ( "$!property.isRtexprvalue()" == "")
#set ($type = $utils.getClassFromFullClass($property.className))
#if($property.deferredValueType)
         <deferred-value>
             <type>$property.deferredValueType</type>
         </deferred-value>
#elseif ($type == "String")
         <deferred-value>
            <type>java.lang.String</type>
         </deferred-value>
#else
         <deferred-value>
             <type>$property.className</type>
         </deferred-value>
#end
#else
         <rtexprvalue>$property.isRtexprvalue().booleanValue()</rtexprvalue>
#end
#end
      </attribute>
#end
#end
##
## -------------------------------
## writeJSFAttachedObjectProperty
## -------------------------------
##
#macro (writeJSFAttachedObjectProperty $property)
#if (!$property.isTagExcluded())
      <attribute>
#if ($property.longDescription)
         <description><![CDATA[$property.longDescription]]></description>
#else
         <description><![CDATA[]]></description>
#end
         <name>$property.name</name>
#if ($property.isRequired())
         <required>$property.isRequired()</required>
#end
#if ($property.isLiteralOnly())
         <rtexprvalue>false</rtexprvalue>
#else
#set ($type = $utils.getClassFromFullClass($property.className))
#if($property.deferredValueType)
         <deferred-value>
             <type>$property.deferredValueType</type>
         </deferred-value>             
#elseif ($type == "String")
         <deferred-value>
            <type>java.lang.String</type>
         </deferred-value>
#else
         <deferred-value>
             <type>$property.className</type>
         </deferred-value>
#end
#end
      </attribute>
#end
#end
##
## -------------------------------
## writeJSFAttribute
## -------------------------------
##
#macro (writeJSFAttribute $attribute)
      <attribute>
#if ($attribute.longDescription)
         <description><![CDATA[$attribute.longDescription]]></description>
#else
         <description><![CDATA[]]></description>
#end
         <name>$attribute.name</name>
         <required>$attribute.isRequired()</required>
#set ($type = $utils.getClassFromFullClass($attribute.className))
#if ($type == "MethodExpression")
        <deferred-method>
          <method-signature>${attribute.deferredMethodSignature}</method-signature>
        </deferred-method>
#elseif ($type == "ValueExpression")
         <deferred-value>
#if($attribute.deferredValueType)
             <type>$attribute.deferredValueType</type>
#end
         </deferred-value>
#else
         <rtexprvalue>$attribute.isRtexprvalue()</rtexprvalue>
#if ($attribute.className)         
         <type>$attribute.className</type>
#else
         <type>java.lang.String</type>
#end
#end
      </attribute>
#end
## ----------------------------- END MACROS -------------------------------
    <!-- Component Tags -->
#set ($componentList = ${model.getComponents()})
#foreach( $component in $componentList )
#if ($modelIds.contains($component.modelId) 
    && ($component.name))
#if ($utils.getTagPrefix($component.name) == $shortname)
## Check if we don't have a facelet tag taking precedence over this description
#if (! ${model.findFaceletTagByName($component.name)})
   <tag>
      <description><![CDATA[$component.longDescription]]></description>
      <name>$utils.getTagName($component.name)</name>
      <tag-class>$component.tagClass</tag-class>
#if ($component.bodyContent)
      <body-content>$component.bodyContent</body-content>
#else
      <body-content>JSP</body-content>
#end
      
#set ($propertyList = ${component.propertyList})
#foreach( $property in $propertyList )
#writeJSFComponentProperty($property)
#end
#if ($component.tagHandler)
#set ($faceletTag = ${model.findFaceletTagByClassName($component.tagHandler)} )
#if ($faceletTag)
#set ($attributeList = $faceletTag.attributeList)
#foreach( $attribute in $attributeList )
#writeJSFAttribute($attribute)
#end
#end
#end
   </tag>
#end
#end
#end
#end
   <!-- Converter tags -->
#set ($componentList = ${model.getConverters()})
#foreach( $component in $componentList )
#if ($modelIds.contains($component.modelId) 
    && ($component.name))
#if ($utils.getTagPrefix($component.name) == $shortname)
## Check if we don't have a facelet tag taking precedence over this description
#if (! ${model.findFaceletTagByName($component.name)}) 
   <tag>
      <description><![CDATA[$component.longDescription]]></description>
      <name>$utils.getTagName($component.name)</name>
      <tag-class>$component.tagClass</tag-class>
#if ($component.bodyContent)
      <body-content>$component.bodyContent</body-content>
#else
      <body-content>empty</body-content>
#end
      
#set ($propertyList = ${component.propertyList})
#foreach( $property in $propertyList )
#writeJSFAttachedObjectProperty($property)
#end
#if ($component.tagHandler)
#set ($faceletTag = ${model.findFaceletTagByClassName($component.tagHandler)} )
#if ($faceletTag)
#set ($attributeList = $faceletTag.attributeList)
#foreach( $attribute in $attributeList )
#writeJSFAttribute($attribute)
#end
#end
#elseif ($jsf20)
      <attribute>
        <description><![CDATA[]]></description>
        <name>for</name>
        <required>false</required>
        <deferred-value>
         <type>java.lang.String</type>
        </deferred-value>
      </attribute>
#end
   </tag>
#end
#end
#end
#end
   <!-- Validator tags -->
#set ($componentList = ${model.getValidators()})
#foreach( $component in $componentList )
#if ($modelIds.contains($component.modelId) 
    && ($component.name))
#if ($utils.getTagPrefix($component.name) == $shortname)
## Check if we don't have a facelet tag taking precedence over this description
#if (! ${model.findFaceletTagByName($component.name)}) 
   <tag>
      <description><![CDATA[$component.longDescription]]></description>
      <name>$utils.getTagName($component.name)</name>
      <tag-class>$component.tagClass</tag-class>
#if ($component.bodyContent)
      <body-content>$component.bodyContent</body-content>
#else
      <body-content>empty</body-content>
#end
      
#set ($propertyList = ${component.propertyList})
#foreach( $property in $propertyList )
#writeJSFAttachedObjectProperty($property)
#end
#if ($component.tagHandler)
#set ($faceletTag = ${model.findFaceletTagByClassName($component.tagHandler)} )
#if ($faceletTag)
#set ($attributeList = $faceletTag.attributeList)
#foreach( $attribute in $attributeList )
#writeJSFAttribute($attribute)
#end
#end
#elseif ($jsf20)
      <attribute>
        <description><![CDATA[]]></description>
        <name>for</name>
        <required>false</required>
        <deferred-value>
         <type>java.lang.String</type>
        </deferred-value>
      </attribute>
#end
   </tag>
#end
#end
#end
#end

   <!-- Behavior tags -->
#set ($behaviorList = ${model.getBehaviors()})
#foreach( $component in $behaviorList )
#if ($modelIds.contains($component.modelId) 
    && ($component.name))
#if ($component.behaviorId)
## Check if we don't have a facelet tag taking precedence over this description
#if (! ${model.findFaceletTagByName($component.name)}) 
   <tag>
      <description><![CDATA[$component.longDescription]]></description>
      <name>$utils.getTagName($component.name)</name>
      <tag-class>$component.tagClass</tag-class>
#if ($component.bodyContent)
      <body-content>$component.bodyContent</body-content>
#else
      <body-content>empty</body-content>
#end
#set ($propertyList = ${component.propertyList})
#foreach( $property in $propertyList )
#writeJSFAttachedObjectProperty($property)
#end
      <attribute>
        <description><![CDATA[]]></description>
        <name>for</name>
        <required>false</required>
        <deferred-value>
         <type>java.lang.String</type>
        </deferred-value>
      </attribute>
   </tag>
#end
#end
#end
#end

   <!-- Single Tags -->
#set ($tagList = $model.getTags())
#foreach( $tag in $tagList )
#if ($modelIds.contains($tag.modelId) && ($tag.name))
#if ($utils.getTagPrefix($tag.name) == $shortname)
## Check if we don't have a facelet tag taking precedence over this description
#if (! ${model.findFaceletTagByName($tag.name)})
   <tag>
      <description><![CDATA[$tag.longDescription]]></description>
      <name>$utils.getTagName($tag.name)</name>
      <tag-class>$tag.className</tag-class>
      <body-content>$tag.bodyContent</body-content>
#set ($attributeList = ${tag.attributeList})
#foreach( $attribute in $attributeList )
#writeJSFAttribute($attribute)
#end
#if ($tag.tagHandler)
#set ($faceletTag = ${model.findFaceletTagByClassName($tag.tagHandler)} )
#if ($faceletTag)
#set ($attributeList = $faceletTag.attributeList)
#foreach( $attribute in $attributeList )
#writeJSFAttribute($attribute)
#end
#end
#end
   </tag>
#end
#end
#end
#end

   <!-- Facelets Tags -->
#set ($tagList = $model.getFaceletTags())
#foreach( $tag in $tagList )
#if ($modelIds.contains($tag.modelId) && ($tag.name))
#if ($utils.getTagPrefix($tag.name) == $shortname)
   <tag>
      <description><![CDATA[$tag.longDescription]]></description>
      <name>$utils.getTagName($tag.name)</name>
      <tag-class>$tag.className</tag-class>
      <body-content>$tag.bodyContent</body-content>
#set ($attributeList = ${tag.attributeList})
#foreach( $attribute in $attributeList )
#writeJSFAttribute($attribute)
#end
   </tag>
#end
#end
#end

   <!-- Facelets Functions -->
#set ($functionList = $model.getFaceletFunctions())
#foreach( $faceletFunction in $functionList )
#if ($modelIds.contains($faceletFunction.modelId) && ($faceletFunction.name))
#if ($utils.getTagPrefix($faceletFunction.name) == $shortname)
   <function>
#if ($faceletFunction.longDescription)
       <description><![CDATA[$faceletFunction.longDescription]]></description>
#elseif ($faceletFunction.description)
       <description><![CDATA[$faceletFunction.description]]></description>
#else
       <description><![CDATA[]]></description>
#end
       <name>$utils.getTagName($faceletFunction.name)</name>
       <function-class>$faceletFunction.sourceClassName</function-class>
       <function-signature>$faceletFunction.declaredSignature</function-signature>
   </function>   
#end
#end
#end
</taglib>
