[MAGNOLIA-3687] RenderingEngine does not restore aggregation state when throwing RenderException Created: 12/May/11  Updated: 19/Dec/16  Resolved: 04/Nov/15

Status: Closed
Project: Magnolia
Component/s: rendering, templating
Affects Version/s: 4.4.3
Fix Version/s: None

Type: Bug Priority: Major
Reporter: Tobias Mattsson Assignee: Unassigned
Resolution: Won't Do Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
relation
is related to MAGNOLIA-3591 Original previewMode is forgotten whe... Closed
Template:
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Date of First Response:

 Description   

In DefaultRenderingEngine.java there's a number of situations that can cause a RenderException to be thrown. At the start of the method the AggregationState is updated to reflect the renderable that is to be rendered. This is not reset when an exception is thrown.

Proposed solution:

protected void render(Content content, String definitionName, RenderingHelper helper, Writer out) throws RenderException {
    Content orgMainContent = null;
    Content orgCurrentContent = null;

    AggregationState state = getAggregationStateSafely();
    if (state != null) {
        orgMainContent = state.getMainContent();
        orgCurrentContent = state.getCurrentContent();

        state.setCurrentContent(content);
        // if not yet set the passed content is the entry point of the rendering
        if (orgMainContent == null) {
            state.setMainContent(content);
        }
    }

    try {

        RenderableDefinition definition = helper.getDefinition(definitionName);
        if (definition == null) {
            throw new RenderException("Can't find renderable definition " + definitionName + " for content: " + content.getHandle());
        }

        Object renderer = helper.getRenderer(definition);
        if (renderer == null) {
            throw new RenderException("Can't find renderer for type " + definition.getType() + " of content: " + content.getHandle());
        }

        helper.render(content, definition, renderer, out);
    }
    catch (IOException e) {
        throw new RenderException("Can't render " + content.getHandle(), e);
    } finally {
        if (state != null) {
            state.setMainContent(orgMainContent);
            state.setCurrentContent(orgCurrentContent);
        }
    }
}


 Comments   
Comment by Michael Mühlebach [ 04/Nov/15 ]

Given the thousands of other issues we have open that are more highly requested, we won't be able to address this issue in the foreseeable future. Instead we will focus on issues with a higher impact, and more votes.
Thanks for taking the time to raise this issue. As you are no doubt aware this issue has been on our backlog for some time now with very little movement.
I'm going to close this to set expectations so the issue doesn't stay open for years with few updates. If the issue is still relevant please feel free to reopen it or create a new issue.

Generated at Mon Feb 12 03:48:43 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.