DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=28152>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=28152

problem with wrapper and dofilter

           Summary: problem with wrapper and dofilter
           Product: Struts
           Version: 1.1 Final
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Blocker
          Priority: Other
         Component: Tiles framework
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


I need to capture all the response data that comes back from the servlet. 
So, I have a simple filter that wraps the response object, and sends the 
wrapped object into filterChain.doFilter() method.
I've set up the web.xml so that any servlet access should trigger my filter 
(the <url-pattern> is *.jsp, *.html and *.do). 
When the browser makes a .html request, everything works as expected.
After the filterChain.doFilter(), I can take a look at the wrapped response 
object and print the contents of the response.
However, when I access a .jsp page or .do action, the output stream of my 
wrapper is empty after the last call to <tiles:insert> tag.
If I don't wrap the response, then everything seems to work fine.

I've enclosed the source code & the output that demonstrates the problem.

Is this a bug in Struts ? If this is a bug, is there a patch available?

Thanks


------ Begin ResponseWrapper.java ------
public class ResponseWrapper extends HttpServletResponseWrapper {
        private PrintWriter printWriter; 
        private ResponseOutputStream outputStream;

        public ResponseWrapper(ServletResponse response) throws 
java.io.IOException { 
                super((HttpServletResponse) response);
                
                outputStream = new ResponseOutputStream
(response.getOutputStream());
                printWriter = new PrintWriter(outputStream);
        }

        public ServletOutputStream getOutputStream() throws 
java.io.IOException {
                return outputStream;
        }

        public PrintWriter getWriter() throws java.io.IOException {
                return printWriter;
        }
}
------ End ResponseWrapper.java ------

------ Begin ResponseOutputSteam.java ------
public class ResponseOutputStream extends ServletOutputStream {
        private OutputStream outputStream;
        private ByteArrayOutputStream arrayStream;
        private boolean closed = false;
     
        public ResponseOutputStream(OutputStream stream) {
                outputStream = stream;
                arrayStream = new ByteArrayOutputStream();
        }

        public void write(int i) throws java.io.IOException {
                arrayStream.write(i);
        }

        public void close() throws java.io.IOException {
                if (!closed) {
                  processStream();
                  outputStream.close();
                  closed = true;
                }
         }
                
        public void flush() throws java.io.IOException {
                if (arrayStream.size() != 0) {
                        if (!closed) {
                                processStream();
                                arrayStream = new ByteArrayOutputStream();
                        }
                }
        }

        private void processStream() throws java.io.IOException {
                outputStream.write(replaceContent(arrayStream.toByteArray()));
                outputStream.flush();
        }
  
        public byte[] replaceContent(byte[] bytesContent) {
                byte[] returnContent = new byte[bytesContent.length];
                
                int j = 0;

                for (int i = 0; i < bytesContent.length; i++) {
                        if (bytesContent[i] != '\n' && bytesContent[i] !
= '\t') {
                                returnContent[j++] = bytesContent[i];
                        }
                }
                
                return returnContent;
        }
}
------ End ResponseOutputSteam.java ------

------ Begin ResponseFilter.java ------
public class ResponseFilter implements Filter {
        private FilterConfig filterConfig = null;
        
        public void doFilter(
                        ServletRequest request, 
                        ServletResponse response,
                        FilterChain chain)
                        throws IOException, ServletException {
                ResponseWrapper responseWrapper = new ResponseWrapper
(response); 
                chain.doFilter(request, responseWrapper);  
                responseWrapper.getOutputStream().close();
        }

        public void destroy() {
                this.filterConfig =null;
        }

        public void init(FilterConfig filterConfig) {
                this.filterConfig = filterConfig;
        }
}
------ End ResponseFilter.java ------

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to