You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gk...@apache.org on 2008/02/02 13:25:37 UTC

svn commit: r617787 - in /cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl: ./ src/main/java/org/apache/cocoon/servletservice/ src/test/java/org/apache/cocoon/servletservice/

Author: gkossakowski
Date: Sat Feb  2 04:25:35 2008
New Revision: 617787

URL: http://svn.apache.org/viewvc?rev=617787&view=rev
Log:
Revert "COCOON-2150: Fixed this issue by buffering response and making more sane checking of status code returned by called servlet."

This reverts commit r615697.

Modified:
    cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/pom.xml
    cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java
    cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/ServletServiceContextTestCase.java

Modified: cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/pom.xml
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/pom.xml?rev=617787&r1=617786&r2=617787&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/pom.xml (original)
+++ cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/pom.xml Sat Feb  2 04:25:35 2008
@@ -114,10 +114,6 @@
       <groupId>commons-collections</groupId>
       <artifactId>commons-collections</artifactId>
     </dependency>
-    <dependency>
-    	<groupId>commons-io</groupId>
-    	<artifactId>commons-io</artifactId>
-    </dependency>
     <!-- test -->
     <dependency>
       <groupId>junit</groupId>

Modified: cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java?rev=617787&r1=617786&r2=617787&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java (original)
+++ cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/ServletServiceContext.java Sat Feb  2 04:25:35 2008
@@ -16,13 +16,9 @@
  */
 package org.apache.cocoon.servletservice;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -41,7 +37,6 @@
 import javax.servlet.Servlet;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
@@ -49,7 +44,6 @@
 import javax.servlet.http.HttpServletResponseWrapper;
 
 import org.apache.cocoon.servletservice.util.ServletContextWrapper;
-import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.excalibur.source.Source;
@@ -482,7 +476,7 @@
         protected void forward(ServletRequest request, ServletResponse response, boolean superCall)
                         throws ServletException, IOException {
             try {
-                StatusRetrievableBufferedWrappedResponse wrappedResponse = new StatusRetrievableBufferedWrappedResponse(
+                StatusRetrievableWrappedResponse wrappedResponse = new StatusRetrievableWrappedResponse(
                                 (HttpServletResponse) response);
                 // FIXME: I think that Cocoon should always set status code on
                 // its own
@@ -502,24 +496,24 @@
                                     wrappedResponse);
                 }
 
-                //FIXME: I'm disabling catching of ServletException for now because I'm not sure if we should catch it at all (GK)
-                /*ServletException se = null;
+                ServletException se = null;
                 try {
                     ServletServiceContext.this.servlet.service(request, wrappedResponse);
                 } catch (ServletException e) {
                     se = e;
-                }*/
-                ServletServiceContext.this.servlet.service(request, wrappedResponse);
+                }
 
-                NamedDispatcher _super = (NamedDispatcher) ServletServiceContext.this.getNamedDispatcher(SUPER);
-                //If servlet returned SC_NOT_FOUND and there is a super servlet we are trying to call it in order to check
-                //whether super servlet does not happen to handle currently processed request
-                if (wrappedResponse.getStatus() == HttpServletResponse.SC_NOT_FOUND && _super != null) {
-                	//Here we can pass original response object because we don't need to buffer response anymore
-                    _super.forward(request, response);
-                } else {
-                	wrappedResponse.setFlushToWrapped(true);
-                	wrappedResponse.flushBuffer();
+                int status = wrappedResponse.getStatus();
+                if (se != null || (status < 200 || status >= 400)) {
+                    wrappedResponse.reset();
+                    NamedDispatcher _super = (NamedDispatcher) ServletServiceContext.this.getNamedDispatcher(SUPER);
+                    if (_super != null) {
+                        _super.forward(request, wrappedResponse);
+                    } else {
+                        wrappedResponse.getWriter().println("Resource not found");
+                        wrappedResponse.setStatus(HttpServletResponse.SC_NOT_FOUND);
+                        throw se;
+                    }
                 }
 
             } finally {
@@ -532,25 +526,12 @@
         }
     }
 
-    /**
-     * This class buffers response and lets to read status code that servlet set to it. This way it can be read later
-     * and OO machinery can decide whether to call super servlet (if servlet set NOT_FOUND status code) or to really
-     * flush the buffer to the wrapped response object.
-     */
-    public static class StatusRetrievableBufferedWrappedResponse extends HttpServletResponseWrapper {
+    public static class StatusRetrievableWrappedResponse extends HttpServletResponseWrapper {
 
        	private int status;
-       	private ServletOutputStream servletStream;
-        private PrintWriter writer;
-        private ByteArrayOutputStream bufferingStream;
-        private boolean committed;
-        private boolean flushToWrapped;
 
-       	public StatusRetrievableBufferedWrappedResponse(HttpServletResponse wrapped) {
+       	public StatusRetrievableWrappedResponse(HttpServletResponse wrapped) {
        		super(wrapped);
-       		bufferingStream = new ByteArrayOutputStream();
-       		committed = false;
-       		this.flushToWrapped = false;
        	}
 
     	public void setStatus(int sc, String sm) {
@@ -576,78 +557,6 @@
     		this.status = errorCode;
     		super.sendError(errorCode, errorMessage);
     	}
-    	
-        public ServletOutputStream getOutputStream() throws IOException {
-            if (this.writer != null) {
-                throw new IllegalStateException( "Tried to create output stream; writer already exists" );
-            }
-
-            if (this.servletStream == null) {
-                this.servletStream = new ServletOutputStream() {
-
-                    public void flush() throws IOException {
-                        StatusRetrievableBufferedWrappedResponse.this.bufferingStream.flush();
-                    }
-
-                    public void write(int b) throws IOException {
-                        StatusRetrievableBufferedWrappedResponse.this.bufferingStream.write(b);
-                    }
-
-                    /*
-                     * This method is probably never called, the close will be
-                     * initiated directly on this.outputStream by the one who set
-                     * it via BlockCallHttpServletResponse.setOutputStream()
-                     */
-                    public void close() throws IOException {
-                        StatusRetrievableBufferedWrappedResponse.this.bufferingStream.close();
-                    }
-
-
-                };
-            }
-
-            return this.servletStream;
-        }
-
-        public PrintWriter getWriter() throws IOException {
-            if (this.servletStream != null) {
-                throw new IllegalStateException( "Tried to create writer; output stream already exists" );
-            }
-
-            if (this.writer == null) {
-                this.writer =
-                        new PrintWriter(new OutputStreamWriter(this.bufferingStream, this.getCharacterEncoding()));
-            }
-
-            return this.writer;
-        }
-        
-        public void flushBuffer() throws IOException {
-        	committed = true;
-        	if (flushToWrapped) {
-        		IOUtils.copy(new ByteArrayInputStream(bufferingStream.toByteArray()), super.getOutputStream());
-        		super.flushBuffer();
-        	}
-        }
-        
-        public void reset() {
-        	resetBuffer();
-        }
-        
-        public void resetBuffer() {
-        	if (committed)
-        		throw new IllegalStateException("The response has been already committed.");
-        	
-        	servletStream = null;
-        	writer = null;
-        	bufferingStream = new ByteArrayOutputStream();
-        	super.reset();
-        }
-        
-        public void setFlushToWrapped(boolean flushToWrapped) {
-        	this.flushToWrapped = flushToWrapped;
-        }
-
     }
 
 }

Modified: cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/ServletServiceContextTestCase.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/ServletServiceContextTestCase.java?rev=617787&r1=617786&r2=617787&view=diff
==============================================================================
--- cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/ServletServiceContextTestCase.java (original)
+++ cocoon/trunk/core/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/ServletServiceContextTestCase.java Sat Feb  2 04:25:35 2008
@@ -219,8 +219,8 @@
             protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                 super.service(request, response);
                 response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-                //Testing if error reported in COCOON-2150 issue is resolved
-                response.flushBuffer();
+                //FIXME: Uncomment this line in order to see the same error as reported in COCOON-2150 issue
+                //response.flushBuffer();
             }
 
         };
@@ -284,8 +284,8 @@
             protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                 super.service(request, response);
                 response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-                //Testing if error reported in COCOON-2150 issue is resolved
-                response.flushBuffer();
+                //FIXME: Uncomment this line in order to see the same error as reported in COCOON-2150 issue
+                //response.flushBuffer();
             }
 
         };
@@ -296,8 +296,8 @@
             protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
             	super.service(request, response);
                 response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-                //Testing if error reported in COCOON-2150 issue is resolved
-                response.flushBuffer();
+                //FIXME: Uncomment this line in order to see the same error as reported in COCOON-2150 issue
+                //response.flushBuffer();
             }
         };