diff --git a/spring-js/src/main/java/org/springframework/js/ajax/tiles2/AjaxTilesView.java b/spring-js/src/main/java/org/springframework/js/ajax/tiles2/AjaxTilesView.java index 693171af..08ee1894 100644 --- a/spring-js/src/main/java/org/springframework/js/ajax/tiles2/AjaxTilesView.java +++ b/spring-js/src/main/java/org/springframework/js/ajax/tiles2/AjaxTilesView.java @@ -124,7 +124,9 @@ public class AjaxTilesView extends TilesView { throw new ServletException("No tiles attribute with a name of '" + fragmentsToRender[i] + "' could be found for the current view: " + this); } else { - container.render(attributeToRender, new Object[] { request, response }); + container.startContext(request, response).inheritCascadedAttributes(compositeDefinition); + container.render(attributeToRender, request, response); + container.endContext(request, response); } } } else { diff --git a/spring-js/src/test/java/org/springframework/js/ajax/tiles2/AjaxTilesViewTests.java b/spring-js/src/test/java/org/springframework/js/ajax/tiles2/AjaxTilesViewTests.java index 7f7df721..1ab9d27c 100644 --- a/spring-js/src/test/java/org/springframework/js/ajax/tiles2/AjaxTilesViewTests.java +++ b/spring-js/src/test/java/org/springframework/js/ajax/tiles2/AjaxTilesViewTests.java @@ -3,6 +3,7 @@ package org.springframework.js.ajax.tiles2; import java.util.HashMap; import java.util.Map; +import junit.framework.Assert; import junit.framework.TestCase; import org.apache.tiles.Attribute; @@ -11,6 +12,7 @@ import org.apache.tiles.Definition; import org.apache.tiles.context.TilesRequestContext; import org.apache.tiles.context.TilesRequestContextFactory; import org.apache.tiles.impl.BasicTilesContainer; +import org.apache.tiles.preparer.ViewPreparer; import org.apache.tiles.servlet.context.ServletTilesRequestContextFactory; import org.apache.tiles.servlet.context.ServletUtil; import org.springframework.js.ajax.SpringJavascriptAjaxHandler; @@ -100,6 +102,24 @@ public class AjaxTilesViewTests extends TestCase { assertEquals("/WEB-INF/searchNavigation.jsp", response.getForwardedUrl()); } + public void testRenderFragment_InheritCascadedAttribute() throws Exception { + BasicTilesContainer container = (BasicTilesContainer) ServletUtil.getCurrentContainer(request, servletContext); + ServletTilesRequestContextFactory tilesRequestContextFactory = new ServletTilesRequestContextFactory(); + tilesRequestContextFactory.init(new HashMap()); + TilesRequestContext tilesRequestContext = tilesRequestContextFactory.createRequestContext(container + .getApplicationContext(), new Object[] { request, response }); + Definition definition = container.getDefinitionsFactory().getDefinition("search.body", tilesRequestContext); + definition.setPreparer("org.springframework.js.ajax.tiles2.AjaxTilesViewTests$AttributeTestingPreparer"); + + setupStaticWebApplicationContext(); + request.addHeader("Accept", SpringJavascriptAjaxHandler.AJAX_ACCEPT_CONTENT_TYPE); + request.addParameter("fragments", "body"); + ajaxTilesView.setUrl("search"); + ajaxTilesView.afterPropertiesSet(); + ajaxTilesView.renderMergedOutputModel(new HashMap(), request, response); + assertTrue(AttributeTestingPreparer.invoked); + } + public void testRenderFragment_DynamicAttribute() throws Exception { BasicTilesContainer container = (BasicTilesContainer) ServletUtil.getCurrentContainer(request, servletContext); Object[] requestItems = new Object[] { request, response }; @@ -149,4 +169,13 @@ public class AjaxTilesViewTests extends TestCase { assertEquals("f3", fragments[2]); } + public static class AttributeTestingPreparer implements ViewPreparer { + public static boolean invoked; + + public void execute(TilesRequestContext tilesContext, AttributeContext attributeContext) { + invoked = true; + Assert.assertTrue(attributeContext.getAttribute("searchNavigation") != null); + } + } + }