<%

/*
 * 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.
 */
 
// used by ForwardTest

// Test 3: Forced Resource Type
if(currentNode.pathToInclude && currentNode.forceResourceType) {
  sling.forward(currentNode.pathToInclude, currentNode.forceResourceType);
}

else

// Test 1: Simple Forward 
if(currentNode.pathToInclude) {
  sling.forward(currentNode.pathToInclude);
}

else

// Test 2: Infinite Loop
if(currentNode.testInfiniteLoop) {
  // try to include the item itself, to cause an infinite loop
  sling.forward(resource.getPath());
} else {

// Test 0: No Forward
%><html>
	<body>
		<h1>ESP template</h1>
		<p class="main"><%= currentNode.text %></p>
	</body>
</html><%

}
%>