Author: markt Date: Fri Jan 25 12:06:04 2013 New Revision: 1438463 URL: http://svn.apache.org/viewvc?rev=1438463&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/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java Modified: tomcat/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java?rev=1438463&r1=1438462&r2=1438463&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java (original) +++ tomcat/trunk/java/org/apache/jasper/runtime/JspContextWrapper.java Fri Jan 25 12:06:04 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; @@ -78,10 +77,22 @@ public class JspContextWrapper extends P private final 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; @@ -126,7 +137,7 @@ public class JspContextWrapper extends P return pageAttributes.get(name); } - return invokingJspCtxt.getAttribute(name, scope); + return rootJspCtxt.getAttribute(name, scope); } @Override @@ -159,7 +170,7 @@ public class JspContextWrapper extends P removeAttribute(name, PAGE_SCOPE); } } else { - invokingJspCtxt.setAttribute(name, value, scope); + rootJspCtxt.setAttribute(name, value, scope); } } @@ -173,13 +184,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); } } } @@ -196,11 +207,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 @@ -214,7 +225,7 @@ public class JspContextWrapper extends P if (scope == PAGE_SCOPE) { pageAttributes.remove(name); } else { - invokingJspCtxt.removeAttribute(name, scope); + rootJspCtxt.removeAttribute(name, scope); } } @@ -229,7 +240,7 @@ public class JspContextWrapper extends P if (pageAttributes.get(name) != null) { return PAGE_SCOPE; } else { - return invokingJspCtxt.getAttributesScope(name); + return rootJspCtxt.getAttributesScope(name); } } @@ -239,7 +250,7 @@ public class JspContextWrapper extends P return Collections.enumeration(pageAttributes.keySet()); } - return invokingJspCtxt.getAttributeNamesInScope(scope); + return rootJspCtxt.getAttributeNamesInScope(scope); } @Override @@ -249,12 +260,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 @@ -269,7 +280,7 @@ public class JspContextWrapper extends P @Override public ServletResponse getResponse() { - return invokingJspCtxt.getResponse(); + return rootJspCtxt.getResponse(); } @Override @@ -284,7 +295,10 @@ public class JspContextWrapper extends P @Override public ServletContext getServletContext() { - return invokingJspCtxt.getServletContext(); + if (servletContext == null) { + servletContext = rootJspCtxt.getServletContext(); + } + return servletContext; } @Override @@ -484,7 +498,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) { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org