package nl.gertontenham.magnolia.templating.utils; import info.magnolia.jcr.util.NodeUtil; import info.magnolia.registry.RegistrationException; import info.magnolia.rendering.engine.RenderException; import info.magnolia.rendering.model.RenderingModel; import info.magnolia.rendering.renderer.Renderer; import info.magnolia.rendering.renderer.RenderingModelBasedRenderer; import info.magnolia.rendering.renderer.registry.RendererRegistry; import info.magnolia.rendering.template.RenderableDefinition; import info.magnolia.rendering.template.TemplateDefinition; import info.magnolia.rendering.template.assignment.TemplateDefinitionAssignment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.jcr.Node; import javax.servlet.ServletException; /** * Created by gtenham on 2015-04-07. */ public class RenderingUtils { private static final Logger log = LoggerFactory.getLogger(RenderingUtils.class); private RendererRegistry rendererRegistry; private TemplateDefinitionAssignment templateDefinitionAssignment; @Inject public RenderingUtils(RendererRegistry rendererRegistry, TemplateDefinitionAssignment templateDefinitionAssignment) { this.rendererRegistry = rendererRegistry; this.templateDefinitionAssignment = templateDefinitionAssignment; } public RenderingModel getRenderingModel(Node node) throws ServletException { TemplateDefinition templateDefinition = getTemplateDefinition(node); RenderingModelBasedRenderer renderingModelBasedRenderer = getRenderingModelBasedRenderer(templateDefinition); RenderingModel renderingModel; try { renderingModel = renderingModelBasedRenderer.newModel(node, templateDefinition, null); } catch (RenderException e) { throw new ServletException(e.getMessage(), e); } return renderingModel; } /** * Returns the TemplateDefinition for the supplied content. Never returns null. */ private TemplateDefinition getTemplateDefinition(Node content) throws ServletException { TemplateDefinition templateDefinition; try { templateDefinition = templateDefinitionAssignment.getAssignedTemplateDefinition(content); } catch (RegistrationException e) { throw new ServletException("No template set or template not available for node with identifier: " + NodeUtil.getNodeIdentifierIfPossible(content)); } if (templateDefinition == null) { throw new ServletException("Template not available for node with identifier: " + NodeUtil.getNodeIdentifierIfPossible(content)); } return templateDefinition; } /** * Returns the Renderer for the supplied renderable if it supports RenderingModel. Never returns null. * @throws IllegalArgumentException if there is no renderer registered for the renderable * @throws ServletException if the renderer does not support RenderingModel */ private RenderingModelBasedRenderer getRenderingModelBasedRenderer(RenderableDefinition renderableDefinition) throws ServletException { Renderer renderer; try { renderer = rendererRegistry.getRenderer(renderableDefinition.getRenderType()); } catch (RegistrationException e) { throw new ServletException(e); } if (!(renderer instanceof RenderingModelBasedRenderer)) { throw new ServletException("Renderer [" + renderableDefinition.getRenderType() + "] does not support RenderingModel"); } return (RenderingModelBasedRenderer) renderer; } }