Author: markt Date: Fri Jan 25 12:08:23 2013 New Revision: 1438464 URL: http://svn.apache.org/viewvc?rev=1438464&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=53869 Performance improvement for pages with lots of heavily nested tags. Retain a reference to the root JSP context rather than traversing the hierarchy on every call. Based on a patch suggested by Sheldon Shao.
Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1438463 Modified: tomcat/tc7.0.x/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java?rev=1438464&r1=1438463&r2=1438464&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java Fri Jan 25 12:08:23 2013 @@ -14,7 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.jasper.runtime; import java.io.IOException; @@ -77,10 +76,22 @@ public class JspContextWrapper extends P private HashMap<String, Object> originalNestedVars; + private ServletContext servletContext = null; + + private ELContext elContext = null; + + private PageContext rootJspCtxt; + public JspContextWrapper(JspContext jspContext, ArrayList<String> nestedVars, ArrayList<String> atBeginVars, ArrayList<String> atEndVars, Map<String,String> aliases) { this.invokingJspCtxt = (PageContext) jspContext; + if (jspContext instanceof JspContextWrapper) { + rootJspCtxt = ((JspContextWrapper)jspContext).rootJspCtxt; + } + else { + rootJspCtxt = invokingJspCtxt; + } this.nestedVars = nestedVars; this.atBeginVars = atBeginVars; this.atEndVars = atEndVars; @@ -123,7 +134,7 @@ public class JspContextWrapper extends P return pageAttributes.get(name); } - return invokingJspCtxt.getAttribute(name, scope); + return rootJspCtxt.getAttribute(name, scope); } @Override @@ -156,7 +167,7 @@ public class JspContextWrapper extends P removeAttribute(name, PAGE_SCOPE); } } else { - invokingJspCtxt.setAttribute(name, value, scope); + rootJspCtxt.setAttribute(name, value, scope); } } @@ -170,13 +181,13 @@ public class JspContextWrapper extends P Object o = pageAttributes.get(name); if (o == null) { - o = invokingJspCtxt.getAttribute(name, REQUEST_SCOPE); + o = rootJspCtxt.getAttribute(name, REQUEST_SCOPE); if (o == null) { if (getSession() != null) { - o = invokingJspCtxt.getAttribute(name, SESSION_SCOPE); + o = rootJspCtxt.getAttribute(name, SESSION_SCOPE); } if (o == null) { - o = invokingJspCtxt.getAttribute(name, APPLICATION_SCOPE); + o = rootJspCtxt.getAttribute(name, APPLICATION_SCOPE); } } } @@ -193,11 +204,11 @@ public class JspContextWrapper extends P } pageAttributes.remove(name); - invokingJspCtxt.removeAttribute(name, REQUEST_SCOPE); + rootJspCtxt.removeAttribute(name, REQUEST_SCOPE); if (getSession() != null) { - invokingJspCtxt.removeAttribute(name, SESSION_SCOPE); + rootJspCtxt.removeAttribute(name, SESSION_SCOPE); } - invokingJspCtxt.removeAttribute(name, APPLICATION_SCOPE); + rootJspCtxt.removeAttribute(name, APPLICATION_SCOPE); } @Override @@ -211,7 +222,7 @@ public class JspContextWrapper extends P if (scope == PAGE_SCOPE) { pageAttributes.remove(name); } else { - invokingJspCtxt.removeAttribute(name, scope); + rootJspCtxt.removeAttribute(name, scope); } } @@ -226,7 +237,7 @@ public class JspContextWrapper extends P if (pageAttributes.get(name) != null) { return PAGE_SCOPE; } else { - return invokingJspCtxt.getAttributesScope(name); + return rootJspCtxt.getAttributesScope(name); } } @@ -236,7 +247,7 @@ public class JspContextWrapper extends P return Collections.enumeration(pageAttributes.keySet()); } - return invokingJspCtxt.getAttributeNamesInScope(scope); + return rootJspCtxt.getAttributeNamesInScope(scope); } @Override @@ -246,12 +257,12 @@ public class JspContextWrapper extends P @Override public JspWriter getOut() { - return invokingJspCtxt.getOut(); + return rootJspCtxt.getOut(); } @Override public HttpSession getSession() { - return invokingJspCtxt.getSession(); + return rootJspCtxt.getSession(); } @Override @@ -266,7 +277,7 @@ public class JspContextWrapper extends P @Override public ServletResponse getResponse() { - return invokingJspCtxt.getResponse(); + return rootJspCtxt.getResponse(); } @Override @@ -281,7 +292,10 @@ public class JspContextWrapper extends P @Override public ServletContext getServletContext() { - return invokingJspCtxt.getServletContext(); + if (servletContext == null) { + servletContext = rootJspCtxt.getServletContext(); + } + return servletContext; } @Override @@ -481,7 +495,10 @@ public class JspContextWrapper extends P public ELContext getELContext() { // instead decorate!!! - return this.invokingJspCtxt.getELContext(); + if (elContext == null) { + elContext = rootJspCtxt.getELContext(); + } + return elContext; /* if (this.elContext != null) { Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1438464&r1=1438463&r2=1438464&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Fri Jan 25 12:08:23 2013 @@ -101,6 +101,12 @@ <subsection name="Jasper"> <changelog> <fix> + <bug>53869</bug>: Performance improvement for pages with lots of heavily + nested tags. Retain a reference to the root JSP context rather than + traversing the hierarchy on every call. Based on a patch suggested by + Sheldon Shao. (markt) + </fix> + <fix> <bug>54440</bug>: Correct a regression caused by the changes for <bug>54240</bug> that broke compilation of JSPs with JspC. Patch provided by Sheldon Shao. (markt) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org