<!--
  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">

    <j:if test="${test.simpleInvoke}">
        <j:set var="namearg" value="Jane Doe"/>
        <j:new var="foo" className="org.apache.commons.jelly.core.Customer"/>
        <j:invoke method="setName" on="${foo}">
            <j:arg value="${namearg}"/>
        </j:invoke>
        <j:invoke method="setCity" on="${foo}">
            <j:arg value="Chicago"/>
        </j:invoke>
        <j:invoke method="addOrder" on="${foo}">
            <j:arg><j:new className="org.apache.commons.jelly.core.Order"/></j:arg>
        </j:invoke>
    </j:if>

    <j:if test="${test.invokeWithVar}">
        <j:new var="list" className="java.util.ArrayList"/>
        <j:invoke on="${list}" method="add"><j:arg value="One"/></j:invoke>
        <j:invoke on="${list}" method="add"><j:arg value="Two"/></j:invoke>
        <j:invoke on="${list}" method="add"><j:arg value="Three"/></j:invoke>
        <j:invoke on="${list}" method="size" var="size"/>
    </j:if>

    <j:if test="${test.invokeWithReturnedValueAsArg}">
        <j:new var="list" className="java.util.ArrayList"/>
        <j:invoke on="${list}" method="add"><j:arg value="Jane Doe"/></j:invoke>
        <j:invoke on="${list}" method="add"><j:arg value="Chicago"/></j:invoke>
        
        <j:new var="customer" className="org.apache.commons.jelly.core.Customer">
            <j:arg><j:invoke on="${list}" method="get"><j:arg type="int" value="0"/></j:invoke></j:arg>
            <j:arg><j:invoke on="${list}" method="get"><j:arg type="int" value="1"/></j:invoke></j:arg>
        </j:new>
    </j:if>

    <j:if test="${test.invokeWithReturnedValueAsArgAndVar}">
        <j:new var="list" className="java.util.ArrayList"/>
        <j:invoke on="${list}" method="add"><j:arg value="Jane Doe"/></j:invoke>
        <j:invoke on="${list}" method="add"><j:arg value="Chicago"/></j:invoke>
        
        <j:new var="customer" className="org.apache.commons.jelly.core.Customer">
            <j:arg><j:invoke on="${list}" method="get"><j:arg type="int" value="0"/></j:invoke></j:arg>
            <j:arg><j:invoke on="${list}" method="get" var="argtwo"><j:arg type="int" value="1"/></j:invoke></j:arg>
        </j:new>
    </j:if>
    
    <j:if test="${test.invokeThatThrowsException}">
        <j:set var="exceptionMessage" value="method threw an exception"/>
        <j:new var="exceptionBean" className="org.apache.commons.jelly.core.ExceptionBean"/>
        <j:catch var="jellyException">
            <j:invoke on="${exceptionBean}" method="instanceMethod" exceptionVar="exceptionThrown">
                <j:arg value="${exceptionMessage}"/>
            </j:invoke>
        </j:catch>
    </j:if>
    <j:if test="${test.invokeThatDoesNotHandleException}">
        <j:set var="exceptionMessage" value="method threw an exception"/>
        <j:new var="exceptionBean" className="org.apache.commons.jelly.core.ExceptionBean"/>
        <j:catch var="jellyException">
            <j:invoke on="${exceptionBean}" method="instanceMethod">
                <j:arg value="${exceptionMessage}"/>
            </j:invoke>
        </j:catch>
    </j:if>

</j:jelly>
