RenderingEngine does not restore aggregation state when throwing RenderException
--------------------------------------------------------------------------------

                 Key: MAGNOLIA-3687
                 URL: http://jira.magnolia-cms.com/browse/MAGNOLIA-3687
             Project: Magnolia
          Issue Type: Bug
          Components: templating
    Affects Versions: 4.4.3
            Reporter: Tobias Mattsson
            Assignee: Philipp Bärfuss
            Priority: Major


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:

{code}
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);
        }
    }
}
{code}

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.magnolia-cms.com/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira




----------------------------------------------------------------
For list details see
http://www.magnolia-cms.com/home/community/mailing-lists.html
To unsubscribe, E-mail to: <[email protected]>
----------------------------------------------------------------

Reply via email to