package org.jtwig.render.node.renderer; import org.jtwig.environment.Environment; import org.jtwig.model.tree.EmbedNode; import org.jtwig.model.tree.Node; import org.jtwig.render.RenderRequest; import org.jtwig.render.RenderResourceRequest; import org.jtwig.render.RenderResourceService; import org.jtwig.render.context.model.BlockContext; import org.jtwig.render.expression.CalculateExpressionService; import org.jtwig.render.node.RenderNodeService; import org.jtwig.renderable.Renderable; import org.jtwig.renderable.impl.EmptyRenderable; import org.jtwig.resource.ResourceService; import org.jtwig.resource.exceptions.ResourceNotFoundException; import org.jtwig.resource.metadata.ResourceMetadata; import org.jtwig.resource.reference.ResourceReference; import org.jtwig.util.ErrorMessageFormatter; import org.jtwig.value.WrappedCollection; import org.jtwig.value.convert.Converter; public class EmbedNodeRender implements NodeRender<EmbedNode> { @Override public Renderable render(RenderRequest renderRequest, EmbedNode node) { Environment environment = renderRequest.getEnvironment(); CalculateExpressionService calculateExpressionService = environment.getRenderEnvironment().getCalculateExpressionService(); Object path = calculateExpressionService.calculate(renderRequest, node.getResourceExpression()); ResourceReference current = renderRequest.getRenderContext().getCurrent(ResourceReference.class); ResourceService resourceService = environment.getResourceEnvironment().getResourceService(); ResourceReference newReference = resourceService.resolve(current, getString(renderRequest, path)); ResourceMetadata resourceMetadata = resourceService.loadMetadata(newReference); if (resourceMetadata.exists()) { Converter<WrappedCollection> collectionConverter = environment.getValueEnvironment().getCollectionConverter(); RenderNodeService renderNodeService = environment.getRenderEnvironment().getRenderNodeService(); RenderResourceService renderResourceService = environment.getRenderEnvironment().getRenderResourceService(); Object mapValue = calculateExpressionService.calculate(renderRequest, node.getMapExpression()); WrappedCollection includeModel = collectionConverter.convert(mapValue).or(WrappedCollection.empty()); renderRequest.getRenderContext().start(BlockContext.class, BlockContext.newContext()); for (Node subNode : node.getNodes()) { renderNodeService.render(renderRequest, subNode); } Renderable renderable = renderResourceService.render(renderRequest, new RenderResourceRequest(newReference, false, !node.isInheritModel(), includeModel)); renderRequest.getRenderContext().end(BlockContext.class); return renderable; } else { if (node.isIgnoreMissing()) { return EmptyRenderable.instance(); } else { throw new ResourceNotFoundException(ErrorMessageFormatter.errorMessage(node.getPosition(), String.format("Resource '%s' not found", path))); } } } private String getString(RenderRequest request, Object input) { return request.getEnvironment().getValueEnvironment().getStringConverter().convert(input); } }