webtier@glassfish.java.net

Jsf Extensions/DynaFaces

From: <webtier_at_javadesktop.org>
Date: Tue, 19 Aug 2008 00:23:20 PDT

Hi
I have been using dynafaces for a while and it is a great project. I been using ajaxZone and it is like magic just add the tag and presto everything contained within get ajaxified.
Unfortunately I recently need to add a application wide filter to do some post processing and this filter has broken the ajaxZone. I have tried everything to try to fix this but no luck. I have verified that the ajax request is being sent and a blank ajax response is returned and it seems to be a problem with the PostProcessingStream of my PostProcessingServletResponseWrapper not being written to. I can see that my PostProcessingStream in being wrapped in a noOpPrintWriter by AsyncResponse. Any insight would be greatly appreciated. My code is below

Thanks

[code]
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

      PostProcessingServletOutputStream postProcessingStream = new PostProcessingStream(servletResponse.getOutputStream());
      PostProcessingServletResponseWrapper wrappedResp = new PostProcessingServletResponseWrapper(servletResponse, postProcessingStream);

      try{
         chain.doFilter(servletRequest, , wrappedResp);
      }finally{
         wrappedResp.close();
      }
   }

public abstract class PostProcessingServletOutputStream extends ServletOutputStream {
   /** original servlet Response Stream */
   protected OutputStream origResponseStream;
   /** buffer stream of output */
   protected ByteArrayOutputStream bufferStream;
   private boolean closed = false;
   
   public PostProcessingServletOutputStream(ServletOutputStream servletOutputStream)
throws java.io.IOException{
      origResponseStream = servletOutputStream;
      bufferStream = new ByteArrayOutputStream();
   }

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

   public void close() throws java.io.IOException {
      if (!closed) {
         if (getPostProcessRequired() ){
            doPostProcessStream();
         }else
            origResponseStream.write(bufferStream.toByteArray());
         origResponseStream.flush();
         origResponseStream.close();
         closed = true;
      }
   }

   public void flush() throws java.io.IOException {
      if (bufferStream.size() != 0) {
         if (!closed) {
            if (getPostProcessRequired()){
               doPostProcessStream();
            }else
               origResponseStream.write(bufferStream.toByteArray());
            origResponseStream.flush();
            bufferStream.reset();
         }
      }
   }

   /** indicates if post processing is required */
   public abstract boolean getPostProcessRequired();

   /** does post processing on response and write out to actual response */
   public void doPostProcessStream() throws java.io.IOException{
      System.out.print(bufferStream.toByteArray());//prints nothing
      ......
      ......
      ......
      origResponseStream.write(postProcessed);
   }

}
public class PostProcessingServletResponseWrapper extends HttpServletResponseWrapper {
    /** Using output stream flag. */
    protected boolean usingOutputStream = false;
    /** Using writer flag. */
    protected boolean usingWriter = false;

   private PrintWriter wrappedWriter;
   private PostProcessingServletOutputStream wrappedStream;

   public PostProcessingServletResponseWrapper(ServletResponse response, PostProcessingServletOutputStream postProcessingServletOutputStream) throws java.io.IOException {
      super((HttpServletResponse) response);
      wrappedStream = postProcessingServletOutputStream;
   }

   public PrintWriter getWriter() throws java.io.IOException {
            if (usingOutputStream)
                throw new IllegalStateException("getOutputStream() was already called");
            if (Globals.STRICT_SERVLET_COMPLIANCE) {
                setCharacterEncoding(getCharacterEncoding());
            }
            if (wrappedWriter == null) {
             wrappedWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(wrappedStream, getCharacterEncoding())),false);
            }
            usingWriter = true;
      return wrappedWriter;
   }

   public ServletOutputStream getOutputStream() throws java.io.IOException {
        if (usingWriter)
            throw new IllegalStateException("getWriter() was already called");
        usingOutputStream = true;
      return wrappedStream;
   }
   /** calls close on PostProcessingServletOutputStream to run doPostProcessStream if needed */
   public void close() throws java.io.IOException {
      wrappedStream.close();
      super.getOutputStream().close();

   }

   public void setContentType(String type) {
      if(type!=null)
         super.setContentType(contentType);
   }
}[/code]
[Message sent by forum member 'nonome' (nonome)]

http://forums.java.net/jive/thread.jspa?messageID=294078