<!--
  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.simpleSystemInvoke}">
        <j:invokeStatic method="getProperty" className="java.lang.System" var="propertyName">
            <j:arg value="${propertyName}" />
        </j:invokeStatic>
    </j:if>
    
    <j:if test="${test.systemInvoke}">
        <j:invokeStatic method="setProperty" className="java.lang.System" var="result">
            <j:arg value="${propertyName}" />
            <j:arg value="${propertyValue}"/>
        </j:invokeStatic>
    </j:if>

    <j:if test="${test.messageFormatInvoke}">
        <j:invokeStatic method="format" className="java.text.MessageFormat" var="message">
            <j:arg value="${message}" />
            <j:arg value="${args}" />
        </j:invokeStatic>
    </j:if>
    
    <j:if test="${test.invokeThatThrowsException}">
        <j:set var="exceptionMessage" value="method threw an exception"/>
        <j:catch var="jellyException">
            <j:invokeStatic className="org.apache.commons.jelly.core.ExceptionBean" method="staticMethod" exceptionVar="exceptionThrown">
                <j:arg value="${exceptionMessage}"/>
            </j:invokeStatic>
        </j:catch>
    </j:if>
    <j:if test="${test.invokeThatDoesNotHandleException}">
        <j:set var="exceptionMessage" value="method threw an exception"/>
        <j:catch var="jellyException">
            <j:invokeStatic className="org.apache.commons.jelly.core.ExceptionBean" method="staticMethod">
                <j:arg value="${exceptionMessage}"/>
            </j:invokeStatic>
        </j:catch>
    </j:if>
    
    
</j:jelly>

