<!--
  Copyright 2002,2004 The Apache Software Foundation.
  
  Licensed 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.
-->

<j:jelly xmlns:j="jelly:core"
    xmlns:jx="jelly:org.apache.commons.jelly.core.extension.CoreExtensionTagLibrary">
    
    <j:if test="${test.simple}">
        <j:useBean var="foo" 
          class="org.apache.commons.jelly.core.Customer"
          name="testing"
          city="sydney"/>
    </j:if>
    
    <j:if test="${test.extension}">
        <jx:useBeanX var="foo" 
          class="org.apache.commons.jelly.core.Customer"
          name="testing"
          city="sydney"/>
    </j:if>
    
    <j:if test="${test.badProperty}">
        <j:catch var="ex">
            <jx:useBean var="foo" 
              class="org.apache.commons.jelly.core.Customer"
              name="testing"
              city="sydney"
              foo="bar"/>
        </j:catch>
    </j:if>
    
    <j:if test="${test.badPropertyIgnored}">
        <jx:useBeanXP var="foo" 
            class="org.apache.commons.jelly.core.Customer"
            name="testing"
            city="sydney"
            foo="bar"/> 
    </j:if>
    
</j:jelly>