From e3492884c0aba26ad60cef38c0476afd9d4a4370 Mon Sep 17 00:00:00 2001 From: Jeremy Grelle Date: Wed, 30 Apr 2008 19:21:20 +0000 Subject: [PATCH] SWF-657 - AjaxTilesView does not resolve deeply nested tiles attributes for rendering as fragments if the containing view has not previously been rendered. --- .../js/ajax/tiles2/AjaxTilesView.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) 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 a8ed9da9..159421b3 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 @@ -26,7 +26,6 @@ import javax.servlet.http.HttpServletResponse; import org.apache.tiles.Attribute; import org.apache.tiles.Definition; -import org.apache.tiles.Attribute.AttributeType; import org.apache.tiles.access.TilesAccess; import org.apache.tiles.context.TilesRequestContext; import org.apache.tiles.impl.BasicTilesContainer; @@ -67,6 +66,14 @@ public class AjaxTilesView extends TilesView { ServletContext servletContext = getServletContext(); if (ajaxHandler.isAjaxRequest(request, response)) { + + String[] attrNames = getRenderFragments(model, request, response); + if (attrNames.length == 0) { + logger.warn("An Ajax request was detected, but no fragments were specified to be re-rendered. " + + "Falling back to full page render."); + super.renderMergedOutputModel(model, request, response); + } + BasicTilesContainer container = (BasicTilesContainer) TilesAccess.getContainer(servletContext); if (container == null) { throw new ServletException("Tiles container is not initialized. " @@ -83,11 +90,16 @@ public class AjaxTilesView extends TilesView { Map flattenedAttributeMap = new HashMap(); flattenAttributeMap(container, tilesRequestContext, flattenedAttributeMap, compositeDefinition); - String[] attrNames = getRenderFragments(model, request, response); response.flushBuffer(); for (int i = 0; i < attrNames.length; i++) { Attribute attributeToRender = (Attribute) flattenedAttributeMap.get(attrNames[i]); - container.render(attributeToRender, response.getWriter(), new Object[] { request, response }); + + if (attributeToRender == null) { + throw new ServletException("No tiles attribute with a name of '" + attrNames[i] + + "' could be found for the current view: " + this); + } else { + container.render(attributeToRender, response.getWriter(), new Object[] { request, response }); + } } } else { super.renderMergedOutputModel(model, request, response); @@ -105,13 +117,14 @@ public class AjaxTilesView extends TilesView { while (i.hasNext()) { Object key = i.next(); Attribute attr = (Attribute) compositeDefinition.getAttributes().get(key); - if (attr.getType() == AttributeType.DEFINITION) { - Definition nestedDefinition = container.getDefinitionsFactory().getDefinition( - attr.getValue().toString(), requestContext); + Definition nestedDefinition = container.getDefinitionsFactory().getDefinition(attr.getValue().toString(), + requestContext); + if (nestedDefinition != null) { flattenAttributeMap(container, requestContext, resultMap, nestedDefinition); } else { resultMap.put(key, attr); } + } } }