@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); } }
@Test(expected = RenderException.class) public void testOnRenderThrowsRenderExceptionOnInternalIOException() throws Exception { // GIVEN final RenderingContext rctx = mock(RenderingContext.class); doThrow(new IOException()).when(rctx).getAppendable(); // WHEN renderer.onRender(null, null, rctx, null, null); // THEN // no then here - expect an RenderException as defined in @Test }
PrintWriter out = getPrintWriterFor(renderingContext.getAppendable()); out.write("\n <!-- "); out.write(msg);
AppendableWriter out = renderingCtx.getAppendable();
@Test public void testOnRender() throws Exception { // GIVEN final RenderingContext rctx = mock(RenderingContext.class); final AppendableWriter writer = mock(AppendableWriter.class); when(rctx.getAppendable()).thenReturn(writer); final ConfiguredRenderableDefinition rd = new ConfiguredRenderableDefinition(); final String i18nBasename = "basename"; rd.setI18nBasename(i18nBasename); // WHEN renderer.onRender(null, rd, rctx, null, null); // THEN verify(renderer.getFmHelper()).render(null, null, i18nBasename, null, writer); }
@Test public void testRenderFromNodeAndAppendable() throws Exception { // GIVEN final Node content = new MockNode("parent"); TemplateDefinitionAssignment templateDefinitionAssignment = mock(TemplateDefinitionAssignment.class); RenderingContext renderingCtx = mock(RenderingContext.class); DefaultRenderingEngine renderingEngine = createDefaultRenderingEngine(rendererRegistry, templateDefinitionAssignment, renderingCtx); TemplateDefinition templateDefinition = mock(TemplateDefinition.class); when(templateDefinitionAssignment.getAssignedTemplateDefinition(content)).thenReturn(templateDefinition); when(templateDefinition.getRenderType()).thenReturn(FREEMARKER_RENDERER_TYPE); Renderer renderer = registerMockRenderer(rendererRegistry); final StringBuilder builder = new StringBuilder(); OutputProvider builderWrapper = new AppendableOnlyOutputProvider(builder); final AppendableWriter writer = new AppendableWriter(builder); when(renderingCtx.getAppendable()).thenReturn(writer); // WHEN renderingEngine.render(content, builderWrapper); // THEN verify(renderer).render(renderingCtx, DefaultRenderingEngine.EMPTY_CONTEXT); }
@Test public void testRenderThrowsRenderExceptionAndTheExceptionHandlerIsInvocedInCaseOfInternalIOException() throws Exception { // GIVEN final Node content = new MockNode("parent"); TemplateDefinitionAssignment templateDefinitionAssignment = mock(TemplateDefinitionAssignment.class); RenderingContext renderingCtx = mock(RenderingContext.class); DefaultRenderingEngine renderingEngine = createDefaultRenderingEngine(rendererRegistry, templateDefinitionAssignment, renderingCtx); TemplateDefinition templateDefinition = mock(TemplateDefinition.class); when(templateDefinitionAssignment.getAssignedTemplateDefinition(content)).thenReturn(templateDefinition); when(templateDefinition.getRenderType()).thenReturn(FREEMARKER_RENDERER_TYPE); Renderer renderer = registerMockRenderer(rendererRegistry); final StringBuilder builder = new StringBuilder(); OutputProvider builderWrapper = new AppendableOnlyOutputProvider(builder); final AppendableWriter writer = new AppendableWriter(builder); when(renderingCtx.getAppendable()).thenReturn(writer); final RenderException renderException = new RenderException("oh - oh!"); doThrow(renderException).when(renderer).render(renderingCtx, DefaultRenderingEngine.EMPTY_CONTEXT); doThrow(new IOException()).when(renderingCtx).getAppendable(); // WHEN renderingEngine.render(content, builderWrapper); // THEN - no code here as we expect an Exception verify(renderingCtx).handleException(renderException); }
@Test public void testRenderExceptionHandlerIsInvokedOnRenderException() throws Exception { // GIVEN final Node content = new MockNode("parent"); TemplateDefinitionAssignment templateDefinitionAssignment = mock(TemplateDefinitionAssignment.class); RenderingContext renderingCtx = mock(RenderingContext.class); DefaultRenderingEngine renderingEngine = createDefaultRenderingEngine(rendererRegistry, templateDefinitionAssignment, renderingCtx); TemplateDefinition templateDefinition = mock(TemplateDefinition.class); when(templateDefinitionAssignment.getAssignedTemplateDefinition(content)).thenReturn(templateDefinition); Renderer renderer = registerMockRenderer(rendererRegistry); final StringBuilder builder = new StringBuilder(); OutputProvider builderWrapper = new AppendableOnlyOutputProvider(builder); final AppendableWriter writer = new AppendableWriter(builder); when(renderingCtx.getAppendable()).thenReturn(writer); when(templateDefinition.getRenderType()).thenReturn(FREEMARKER_RENDERER_TYPE); final RenderException e = new RenderException("TEST!"); doThrow(e).when(renderer).render(renderingCtx, DefaultRenderingEngine.EMPTY_CONTEXT); // WHEN renderingEngine.render(content, builderWrapper); // THEN verify(renderingCtx).handleException(e); }
final String contentType = content.getProperty("contentType").getString(); AppendableWriter out = renderingCtx.getAppendable(); if (!isAdmin || isPreview) { response.setContentType(contentType);
@Test // the engine is doing the exception handling, not the renderer public void testOnRenderThrowsTemplateException() throws Exception { // GIVEN final RenderingContext rctx = mock(RenderingContext.class); final AppendableWriter writer = mock(AppendableWriter.class); when(rctx.getAppendable()).thenReturn(writer); final ConfiguredRenderableDefinition rd = new ConfiguredRenderableDefinition(); final String i18nBasename = "basename"; rd.setI18nBasename(i18nBasename); doThrow(new TemplateException(null)).when(renderer.getFmHelper()).render(null, null, i18nBasename, null, writer); // WHEN try { renderer.onRender(null, rd, rctx, null, null); } catch (Throwable t) { // THEN: exception is thrown return; } fail("Should never get here!"); }
@Override protected void onRender(Node content, RenderableDefinition definition, RenderingContext renderingCtx, Map<String, Object> ctx, String templateScript) throws RenderException { final Locale locale = MgnlContext.getAggregationState().getLocale(); try { AppendableWriter out = renderingCtx.getAppendable(); fmHelper.setEscapeHtml(getRenderingEngine().getEscapeHtml()); fmHelper.render(templateScript, locale, definition.getI18nBasename(), ctx, out); } catch (TemplateException e) { throw new RenderException(e); } catch (IOException e) { throw new RenderException(e); } }
AppendableWriter out = ctx.getAppendable(); out.append(htmlCommentLogMessage(logMessage));