Author: markt
Date: Mon Nov  2 20:56:28 2009
New Revision: 832102

URL: http://svn.apache.org/viewvc?rev=832102&view=rev
Log:
When a JSP is deleted, make sure the first request post deletion receives the 
correct response (404)

Modified:
    tomcat/tc6.0.x/trunk/   (props changed)
    tomcat/tc6.0.x/trunk/STATUS.txt
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java
    tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc6.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Nov  2 20:56:28 2009
@@ -1 +1 @@
-/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,673796,673820,677910,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757335,757774,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,770809,770876,776921,776924,776935,776945,77
 
7464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809603,812125,812137,812432,813001,813013,813866,814180,815972,817442,819339,819361,820110,820132,820874,820954
+/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757335,757774,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,770809,770876,776921,776924,776935,77
 
6945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809603,812125,812137,812432,813001,813013,813866,814180,815972,817442,819339,819361,820110,820132,820874,820954,831850

Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=832102&r1=832101&r2=832102&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Mon Nov  2 20:56:28 2009
@@ -31,21 +31,6 @@
 PATCHES PROPOSED TO BACKPORT:
   [ New proposals should be added at the end of the list ]
 
-* Fix issue where the first request for a deleted JSPs returns as if the JSP
-  still exists.
-  http://svn.apache.org/viewvc?view=rev&revision=683969
-  +1: markt, funkman, kkolinko
-   0: remm (looks risky, very minor problem), fhanik - minor problem, jim
-  -1: 
-
-  kkolinko: (
-    - This issue does occur only when development = true.
-    When development is false JSP removal is not detected at all.
-
-    - I think that, strictly speaking, JspCompilationContext#removed field
-    has to be volatile. I am proposing the change below (backport of r.831850)
-  )
-
 * Backport cleanup of semantics of thisAccessedTime and
   lastAccessedTime for sessions:
   - preparational whitespace changes
@@ -417,11 +402,6 @@
   +1: kkolinko, rjung
   -1:
 
-* Mark JspCompilationContext#removed as volatile
-  http://svn.apache.org/viewvc?rev=831850&view=rev
-  +1: kkolinko, rjung, markt
-  -1:
-
 * Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=47881
   Fix processing of "startd" and "stopd" arguments, when they are not alone.
   http://svn.apache.org/viewvc?rev=831860&view=rev

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java?rev=832102&r1=832101&r2=832102&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java Mon 
Nov  2 20:56:28 2009
@@ -81,7 +81,7 @@
 
     protected JspRuntimeContext rctxt;
 
-    protected int removed = 0;
+    protected volatile int removed = 0;
 
     protected URLClassLoader jspLoader;
     protected URL baseUrl;
@@ -569,7 +569,7 @@
     }
 
     public boolean isRemoved() {
-        if (removed > 1 ) {
+        if (removed > 0 ) {
             return true;
         }
         return false;
@@ -580,6 +580,9 @@
     public void compile() throws JasperException, FileNotFoundException {
         createCompiler();
         if (jspCompiler.isOutDated()) {
+            if (isRemoved()) {
+                throw new FileNotFoundException(jspUri);
+            }
             try {
                 jspCompiler.removeGeneratedFiles();
                 jspLoader = null;

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java?rev=832102&r1=832101&r2=832102&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java Mon Nov  
2 20:56:28 2009
@@ -408,7 +408,7 @@
             URL jspUrl = ctxt.getResource(jsp);
             if (jspUrl == null) {
                 ctxt.incrementRemoved();
-                return false;
+                return true;
             }
             URLConnection uc = jspUrl.openConnection();
             if (uc instanceof JarURLConnection) {

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java?rev=832102&r1=832101&r2=832102&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java Mon Nov 
 2 20:56:28 2009
@@ -17,6 +17,7 @@
 
 package org.apache.jasper.servlet;
 
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.lang.reflect.Constructor;
 
@@ -289,38 +290,15 @@
                                 Throwable exception, boolean precompile)
         throws ServletException, IOException {
 
-        JspServletWrapper wrapper =
-            (JspServletWrapper) rctxt.getWrapper(jspUri);
+        JspServletWrapper wrapper = rctxt.getWrapper(jspUri);
         if (wrapper == null) {
             synchronized(this) {
-                wrapper = (JspServletWrapper) rctxt.getWrapper(jspUri);
+                wrapper = rctxt.getWrapper(jspUri);
                 if (wrapper == null) {
                     // Check if the requested JSP page exists, to avoid
                     // creating unnecessary directories and files.
                     if (null == context.getResource(jspUri)) {
-                        String includeRequestUri = (String)
-                        request.getAttribute(
-                                "javax.servlet.include.request_uri");
-                        if (includeRequestUri != null) {
-                            // This file was included. Throw an exception as
-                            // a response.sendError() will be ignored
-                            String msg = Localizer.getMessage(
-                                    "jsp.error.file.not.found",jspUri);
-                            // Strictly, filtering this is an application
-                            // responsibility but just in case...
-                            throw new ServletException(
-                                    SecurityUtil.filter(msg));
-                        } else {
-                            try {
-                                response.sendError(
-                                        HttpServletResponse.SC_NOT_FOUND,
-                                        request.getRequestURI());
-                            } catch (IllegalStateException ise) {
-                                log.error(Localizer.getMessage(
-                                        "jsp.error.file.not.found",
-                                        jspUri));
-                            }
-                        }
+                        handleMissingResource(request, response, jspUri);
                         return;
                     }
                     boolean isErrorPage = exception != null;
@@ -331,8 +309,40 @@
             }
         }
 
-        wrapper.service(request, response, precompile);
+        try {
+            wrapper.service(request, response, precompile);
+        } catch (FileNotFoundException fnfe) {
+            handleMissingResource(request, response, jspUri);
+        }
+
+    }
+
 
+    private void handleMissingResource(HttpServletRequest request,
+            HttpServletResponse response, String jspUri)
+            throws ServletException, IOException {
+
+        String includeRequestUri =
+            (String)request.getAttribute("javax.servlet.include.request_uri");
+
+        if (includeRequestUri != null) {
+            // This file was included. Throw an exception as
+            // a response.sendError() will be ignored
+            String msg =
+                Localizer.getMessage("jsp.error.file.not.found",jspUri);
+            // Strictly, filtering this is an application
+            // responsibility but just in case...
+            throw new ServletException(SecurityUtil.filter(msg));
+        } else {
+            try {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND,
+                        request.getRequestURI());
+            } catch (IllegalStateException ise) {
+                log.error(Localizer.getMessage("jsp.error.file.not.found",
+                        jspUri));
+            }
+        }
+        return;
     }
 
 

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java?rev=832102&r1=832101&r2=832102&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java 
Mon Nov  2 20:56:28 2009
@@ -339,6 +339,9 @@
             } else {
                 throw ex;
             }
+        } catch (FileNotFoundException fnfe) {
+            // File has been removed. Let caller handle this.
+            throw fnfe;
         } catch (IOException ex) {
             if (options.getDevelopment()) {
                 throw handleJspException(ex);

Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=832102&r1=832101&r2=832102&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Mon Nov  2 20:56:28 2009
@@ -285,6 +285,11 @@
       <fix>
         Make constants in the TagHandlerPool really constant. (markt)
       </fix>
+      <fix>
+        When development mode is enabled and a JSP is deleted, ensure next
+        request for that JSP is consistent with the JSP having been removed.
+        (markt/kkolinko)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Cluster">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to