You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/01/25 13:08:24 UTC

svn commit: r1438464 - in /tomcat/tc7.0.x/trunk: ./ java/org/apache/jasper/runtime/JspContextWrapper.java webapps/docs/changelog.xml

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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org