/*
 * 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.
 */

<!-- Test repeated execution -->
doStartTag() called here
doAfterBody() called here
Blah
doAfterBody() called here
Blah
doAfterBody() called here
Blah
doEndTag() called here
doFinally() called here

<!-- Test 0-time execution -->
doStartTag() called here
doEndTag() called here
doFinally() called here

<!-- Test abrupt execution -->
doStartTag() called here
doCatch() called here with class freemarker.core._TemplateModelException: Error while invoking the "testtag" JSP custom tag; see cause exception
doFinally() called here

<!-- Test nested execution -->
doStartTag() called here
doAfterBody() called here
Outer Blah
doStartTag() called here
doAfterBody() called here
Inner Blah
doAfterBody() called here
Inner Blah
doEndTag() called here
doFinally() called here
doAfterBody() called here
Outer Blah
doStartTag() called here
doAfterBody() called here
Inner Blah
doAfterBody() called here
Inner Blah
doEndTag() called here
doFinally() called here
doEndTag() called here
doFinally() called here

<!-- Test nested execution with intermittent non-JSP transform -->
doStartTag() called here
doAfterBody() called here
Outer Blah
doStartTag() called here
doAfterBody() called here
Inner Blah
doAfterBody() called here
Inner Blah
doEndTag() called here
doFinally() called heredoAfterBody() called here
Outer Blah
doStartTag() called here
doAfterBody() called here
Inner Blah
doAfterBody() called here
Inner Blah
doEndTag() called here
doFinally() called heredoEndTag() called here
doFinally() called here

enter TestSimpleTag simpletag1
invoking body i=0
foo
enter TestSimpleTag simpletag2
invoking body i=0
bar
invoking body i=1
bar
invoking body i=2
bar
exit TestSimpleTag simpletag2
invoking body i=1
foo
enter TestSimpleTag simpletag2
invoking body i=0
bar
invoking body i=1
bar
invoking body i=2
bar
exit TestSimpleTag simpletag2
exit TestSimpleTag simpletag1
