Registers Tiles model
Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/388861ff Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/388861ff Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/388861ff Branch: refs/heads/master Commit: 388861ff073f54f7959a35cc205b264237d043d0 Parents: 27ad6cb Author: Lukasz Lenart <lukasz.len...@gmail.com> Authored: Fri Nov 27 13:36:52 2015 +0100 Committer: Lukasz Lenart <lukasz.len...@gmail.com> Committed: Fri Nov 27 13:36:52 2015 +0100 ---------------------------------------------------------------------- .../StrutsFreeMarkerAttributeRenderer.java | 27 +++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/388861ff/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsFreeMarkerAttributeRenderer.java ---------------------------------------------------------------------- diff --git a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsFreeMarkerAttributeRenderer.java b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsFreeMarkerAttributeRenderer.java index 032f7e6..849053a 100644 --- a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsFreeMarkerAttributeRenderer.java +++ b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsFreeMarkerAttributeRenderer.java @@ -23,18 +23,25 @@ import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.config.ConfigurationException; import com.opensymphony.xwork2.inject.Container; +import freemarker.ext.beans.BeanModel; +import freemarker.template.Configuration; import freemarker.template.TemplateException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.struts2.ServletActionContext; +import org.apache.struts2.views.JspSupportServlet; +import org.apache.struts2.views.freemarker.FreemarkerManager; import org.apache.struts2.views.freemarker.FreemarkerResult; +import org.apache.struts2.views.freemarker.StrutsBeanWrapper; import org.apache.tiles.Attribute; import org.apache.tiles.context.TilesRequestContext; +import org.apache.tiles.freemarker.template.TilesFMModelRepository; import org.apache.tiles.impl.InvalidTemplateException; import org.apache.tiles.renderer.impl.AbstractTypeDetectingAttributeRenderer; import org.apache.tiles.servlet.context.ServletTilesRequestContext; import org.apache.tiles.servlet.context.ServletUtil; +import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @@ -55,7 +62,8 @@ public class StrutsFreeMarkerAttributeRenderer extends AbstractTypeDetectingAttr if (ctx == null) { throw new ConfigurationException("There is no ActionContext for current request!"); } - ActionInvocation invocation = ctx.getActionInvocation(); + + registerTilesBeanModel(ctx); String include = (String) value; FreemarkerResult result = new FreemarkerResult(include); @@ -65,6 +73,7 @@ public class StrutsFreeMarkerAttributeRenderer extends AbstractTypeDetectingAttr container.inject(result); try { + ActionInvocation invocation = ctx.getActionInvocation(); result.doExecute(include, invocation); } catch (TemplateException e) { LOG.error("Exception was thrown during rendering value {}: {}", value, e.getMessage()); @@ -88,4 +97,20 @@ public class StrutsFreeMarkerAttributeRenderer extends AbstractTypeDetectingAttr return false; } + /** + * This register dedicated BeanModel to support tiles tags. + * It requires {@link org.apache.struts2.views.JspSupportServlet} to be registered in web.xml + */ + protected void registerTilesBeanModel(ActionContext ctx) { + ServletContext servletContext = ServletActionContext.getServletContext(); + Configuration configuration = ctx.getInstance(FreemarkerManager.class).getConfiguration(servletContext); + + StrutsBeanWrapper wrapper = (StrutsBeanWrapper) ctx.getInstance(FreemarkerManager.class).getWrapper(); + + LOG.trace("Adding support for Tiles tags, please remember to register {} in web.xml!", JspSupportServlet.class.getName()); + + BeanModel tilesBeanModel = new BeanModel(new TilesFMModelRepository(), wrapper); + configuration.setSharedVariable("tiles", tilesBeanModel); + } + }