Details
Description
There is a bug where the tiles context can get lost, and using tiles in your struts portlet will result in an NPE.
This happened to me, and after googling the problem, it appears that it had also happened to Max Hammers, who also posted a patch for the error. After searching jira, it apears that this issue is not being tracked yet (so that's why I am opening this one). I manually applied the patch to my copy of the source files (it is very simple), and it works perfectly (thanks Max!).
So, Ate et al, please apply Max's patch!
The newsgroup posting can be found at
And the patch is as follows (copy pasted from the above post)
##########################
Index:
src/java/org/apache/portals/bridges/struts/PortletServlet.java
===================================================================
—
src/java/org/apache/portals/bridges/struts/PortletServlet.java
(revision 365364)
+++
src/java/org/apache/portals/bridges/struts/PortletServlet.java
(working copy)
@@ -34,6 +34,7 @@
import org.apache.struts.config.PlugInConfig;
import org.apache.struts.tiles.TilesPlugin;
import org.apache.struts.util.RequestUtils;
+import
org.apache.struts.taglib.tiles.ComponentConstants;
/**
- PortletServlet
@@ -169,6 +170,13 @@
request
.setAttribute(Globals.ERROR_KEY, context
.getErrors());
+ log.debug("Looking for TilesContext
...");
+ if (context.getTilesContext() !=
null)
else
+ log.debug("TilesContext not found!");
+
RequestDispatcher dispatcher = null;
if (context.getDispatchNamed())
dispatcher =
getServletContext().getNamedDispatcher(
Index:
src/java/org/apache/portals/bridges/struts/PortletServletRequestDispatcher.java
===================================================================
—
src/java/org/apache/portals/bridges/struts/PortletServletRequestDispatcher.java
(revision 365364)
+++
src/java/org/apache/portals/bridges/struts/PortletServletRequestDispatcher.java
(working copy)
@@ -30,6 +30,8 @@
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.config.ActionConfig;
+import org.apache.struts.tiles.ComponentContext;
+import
org.apache.struts.taglib.tiles.ComponentConstants;
/**
- PortletServletRequestDispatcher
@@ -92,6 +94,11 @@
.getAttribute(Globals.MESSAGE_KEY));
context.setErrors((ActionMessages)
request
.getAttribute(Globals.ERROR_KEY));
+ // Store tiles context
+
context.setTilesContext((ComponentContext)request.getAttribute(ComponentConstants.COMPONENT_CONTEXT));
+ log.debug("TilesContext in
StrutsPortletRenderContext");
+
+
if (context.getErrors() != null)
{
String originURL =
StrutsPortletURL.getOriginURL(request);
Index:
src/java/org/apache/portals/bridges/struts/StrutsPortletRenderContext.java
===================================================================
—
src/java/org/apache/portals/bridges/struts/StrutsPortletRenderContext.java
(revision 365364)
+++
src/java/org/apache/portals/bridges/struts/StrutsPortletRenderContext.java
(working copy)
@@ -19,6 +19,7 @@
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMessages;
+import org.apache.struts.tiles.ComponentContext;
/**
- StrutsPortletRenderContext
@@ -34,6 +35,9 @@
private boolean requestCancelled;
private ActionMessages messages;
private ActionMessages errors;
+ // Tiles context
+ private ComponentContext tilesContext;
+
public String getPath()Unknown macro: { return path;@@ -82,4 +86,12 @@ { this.errors = errors; }+ public ComponentContext getTilesContext()+ { + return tilesContext; + }+ public void setTilesContext(ComponentContexttilesContext)+ { + this.tilesContext = tilesContext; + } }
##########################