/** * Returns the "current content" from the aggregation state. Override this method if your component needs a * different target node. */ protected Node currentContent() { return renderingContext.getCurrentContent(); }
@Override public void render(RenderingContext ctx, Map<String, Object> contextObjects) throws RenderException { Node content = ctx.getCurrentContent(); InputStream stream = null; try { stream = this.getInputStream(content); final HttpServletResponse response = MgnlContext.getWebContext().getResponse(); response.setContentLength(stream.available()); if (content.hasNode(BINARY_NODE) && content.getNode(BINARY_NODE).hasProperty(JcrConstants.JCR_MIMETYPE)) { final String mimeType = content.getNode(BINARY_NODE).getProperty(JcrConstants.JCR_MIMETYPE).getString(); response.setContentType(mimeType); } else if (content.hasProperty(EXTENSION_PROPERTY)) { final String extension = content.getProperty(EXTENSION_PROPERTY).getString(); final String mimeType = MIMEMapping.getMIMEType(extension); response.setContentType(mimeType); } IOUtils.copy(stream, ctx.getOutputStream()); } catch (RepositoryException e) { throw new RenderException("Can't read binary data for resource " + content, e); } catch (IOException e) { throw new RenderException("Can't write binary data to the output stream.", e); } finally { IOUtils.closeQuietly(stream); } }
@Override public void handleException(RenderException renderException, RenderingContext renderingContext) { try { final String path = renderingContext.getCurrentContent().getPath(); final PrintWriter printWriter = getPrintWriterFor(renderingContext.getAppendable()); final String id = renderingContext.getRenderableDefinition().getId(); final AggregationState aggregationState = aggregationStateProvider.get(); final String msg = String.format("Error while rendering [%s] with template [%s] for URI [%s]:\n%s", path, id, formatURI(aggregationState), ExceptionUtils.getMessage(renderException)); this.processException(renderException, printWriter, msg); } catch (RepositoryException e) { throw new RuntimeException("Can't log template exception.", e); } catch (IOException e) { throw new RuntimeException("Can't log template exception.", e); } }
try path = renderingContext.getCurrentContent().getPath();
@Test(expected = RenderException.class) public void testRenderWhenGetIdentifierThrowsException() throws RepositoryException, RenderException { // GIVEN Node content = mock(Node.class); doThrow(new RepositoryException()).when(content).getIdentifier(); AbstractRenderer renderer = new DummyRenderer(); when(ctx.getCurrentContent()).thenReturn(content); // WHEN renderer.render(ctx, null); // THEN - expect Exception in line above... }
@Test(expected = RenderException.class) public void testRenderWithTemplateScriptBeingNull() throws Exception { // GIVEN Map<String, Object> contextObjects = new LinkedHashMap<String, Object>(); RenderableDefinition definition = mock(RenderableDefinition.class); when(definition.getModelClass()).thenReturn(DummyModel.class); when(ctx.getCurrentContent()).thenReturn(content); when(ctx.getRenderableDefinition()).thenReturn(definition); AbstractRenderer renderer = new DummyRenderer() { @Override protected String resolveTemplateScript(Node content, RenderableDefinition definition, RenderingModel<?> model, String actionResult) { return null; } }; // WHEN renderer.render(ctx, contextObjects); // THEN - expected Exception }
@Test public void testRenderWithModelAttributePrefixBeingNullAndRenderingSkipped() throws Exception { // GIVEN RenderableDefinition definition = mock(RenderableDefinition.class); when(definition.getModelClass()).thenReturn(SkipRenderingDummyModel.class); when(ctx.getCurrentContent()).thenReturn(content); when(ctx.getRenderableDefinition()).thenReturn(definition); AbstractRenderer renderer = new DummyRenderer() { @Override protected String resolveTemplateScript(Node content, RenderableDefinition definition, RenderingModel<?> model, String actionResult) { throw new RuntimeException("Should have exited method before this call!"); } }; // WHEN renderer.render(ctx, null); // THEN - didn't get a RuntimeException on call above so execution stopped before calling determineTemplatePath... }
@Test public void testRender() throws Exception { // GIVEN Map<String, Object> contextObjects = new LinkedHashMap<String, Object>(); RenderableDefinition definition = mock(RenderableDefinition.class); when(definition.getModelClass()).thenReturn(DummyModel.class); when(ctx.getCurrentContent()).thenReturn(content); when(ctx.getRenderableDefinition()).thenReturn(definition); DummyRenderer renderer = new DummyRenderer(); // WHEN renderer.render(ctx, contextObjects); // THEN assertTrue(renderer.wasOnRenderCalled()); assertEquals(parentModel, MgnlContext.getAttribute(AbstractRenderer.MODEL_ATTRIBUTE)); }
@Override public void render(final RenderingContext renderingCtx, Map<String, Object> contextObjects) throws RenderException { Node content = renderingCtx.getCurrentContent(); try { RenderableDefinition renderableDefinition = renderingCtx.getRenderableDefinition(); // Merge in case of a page if (content != null && NodeUtil.isNodeType(content, NodeTypes.Page.NAME)) { final Site site = getSite(content); renderableDefinition = BeanMergerUtil.merge(renderableDefinition, site.getTemplates().getPrototype(), fallbackTemplateDefinition.getFallbackTemplateDefinition()); } renderingCtx.push(content, renderableDefinition); try { super.render(renderingCtx, contextObjects); } finally { renderingCtx.pop(); } } catch (RepositoryException e) { throw new RenderException(String.format("Could not determine node type of node [%s]", content), e); } }
@Override public void render(RenderingContext ctx, Map<String, Object> contextObjects) throws RenderException { String logMessage = ""; Node content = ctx.getCurrentContent();
@Override public void render(final RenderingContext renderingCtx, Map<String, Object> contextObjects) throws RenderException { Node content = renderingCtx.getCurrentContent(); try { RenderableDefinition renderableDefinition = renderingCtx.getRenderableDefinition(); // Merge in case of a page if (content != null && NodeUtil.isNodeType(content, NodeTypes.Page.NAME)) { final Site site = getSite(content); renderableDefinition = BeanMergerUtil.merge(renderableDefinition, site.getTemplates().getPrototype(), fallbackTemplateDefinition.getFallbackTemplateDefinition()); } renderingCtx.push(content, renderableDefinition); try { rendererRegistry.getProvider(wrappedRendererType).get().render(renderingCtx, contextObjects); } catch (Registry.NoSuchDefinitionException e) { throw new RenderException("Render type '" + wrappedRendererType + "' does not exist.", e); } finally { renderingCtx.pop(); } } catch (RepositoryException e) { throw new RenderException(String.format("Could not determine node type of node [%s]", content), e); } }
@Override public void render(final RenderingContext renderingCtx, Map<String, Object> contextObjects) throws RenderException { Node content = renderingCtx.getCurrentContent(); // FIXME for the time being we only render pages and areas but not components try { final Site site = getSite(content); RenderableDefinition renderableDefinition = renderingCtx.getRenderableDefinition(); // merge in case of a page if (renderableDefinition instanceof STKPage) { renderableDefinition = (RenderableDefinition) BeanMergerUtil.merge(renderableDefinition, site.getTemplates().getPrototype(), DefaultSTKTemplateConfiguration.getInstance()); } // FIXME we should not push() if the definition is not merged renderingCtx.push(content, renderableDefinition); try { super.render(renderingCtx, contextObjects); } finally { renderingCtx.pop(); } } catch (Exception e) { throw new RenderException(e); } }
Node content = renderingCtx.getCurrentContent(); RenderableDefinition definition = renderingCtx.getRenderableDefinition();