001// Licensed to the Apache License, Version 2.0 (the "License"); 002// you may not use this file except in compliance with the License. 003// You may obtain a copy of the License at 004// 005// http://www.apache.org/licenses/LICENSE-2.0 006// 007// Unless required by applicable law or agreed to in writing, software 008// distributed under the License is distributed on an "AS IS" BASIS, 009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 010// See the License for the specific language governing permissions and 011// limitations under the License. 012 013package org.apache.tapestry5.corelib.components; 014 015import org.apache.tapestry5.MarkupWriter; 016import org.apache.tapestry5.annotations.Environmental; 017import org.apache.tapestry5.dom.Element; 018import org.apache.tapestry5.internal.RecursiveContext; 019import org.apache.tapestry5.ioc.annotations.Inject; 020import org.apache.tapestry5.services.Environment; 021 022/** 023 * <p> 024 * Component that marks the place in the template the 025 * recursion should happen. It should only be used inside 026 * {@link Recursive}, otherwise an exception will be 027 * thrown. 028 * </p> 029 * <p> 030 * This was contributed by <a href="https://www.pubfactory.com">KGL PubFactory</a>. 031 * </p> 032 * @since 5.9.0 033 */ 034public class RecursiveBody 035{ 036 037 @Inject 038 private Environment environment; 039 040 @Environmental 041 private RecursiveContext context; 042 043 void beginRender(MarkupWriter writer) 044 { 045 final RecursiveContext recursiveContext = environment.peek(RecursiveContext.class); 046 if (recursiveContext != null) 047 { 048 final Element placeholder = writer 049 .element( 050 Recursive.RECURSIVE_INSERTION_POINT_ELEMENT_NAME, 051 "id", recursiveContext.getId()); 052 context.registerPlaceholder(placeholder); 053 } 054 055 } 056 057 boolean beginRenderTemplate(MarkupWriter writer) 058 { 059 return false; // throw away any body this component instance might have in its declaration 060 } 061 062 void afterRender(MarkupWriter writer) 063 { 064 writer.end(); 065 } 066 067}