1 Reply Latest reply on Oct 14, 2004 2:11 AM by stevenqu

    Filtering JSP page failed

    paszti

      Hi all!

      I use JBoss 3.2.3.

      I'd like to write a filter that removes the new lines from the result of a JSP page.
      Found an excelent article concerning this topic ( http://www-106.ibm.com/developerworks/java/library/j-tomcat/?open&l=101,t=grj,p=TomcatTricks).

      The filter code is really simple:


      package com.ibm.devworks.filters;
      
      import java.io.*;
      import javax.servlet.*;
      import javax.servlet.http.*;
      
      
      class ReplaceTextStream extends ServletOutputStream {
       private OutputStream intStream;
       private ByteArrayOutputStream baStream;
       private boolean closed = false;
      
       private String origText;
       private String newText;
      
       public ReplaceTextStream(OutputStream outStream, String searchText, String replaceText) {
       intStream = outStream;
       baStream = new ByteArrayOutputStream();
       origText = searchText;
       newText = replaceText;
       }
      
       public void write(int i) throws java.io.IOException {
       baStream.write(i);
       }
      
       public void close() throws java.io.IOException {
       if (!closed) {
      
       processStream();
       intStream.close();
       closed = true;
       }
       }
      
       public void flush() throws java.io.IOException {
       if (baStream.size() != 0) {
       if (! closed) {
       processStream(); // need to synchronize the flush!
       baStream = new ByteArrayOutputStream();
       }
       }
       }
      
       public void processStream() throws java.io.IOException {
       intStream.write(replaceContent(baStream.toByteArray()));
       intStream.flush();
       }
      
       public byte [] replaceContent(byte [] inBytes) {
       String retVal ="";
       String firstPart="";
      
       String tpString = new String(inBytes);
       String srchString = (new String(inBytes)).toLowerCase();
      
       int endBody = srchString.indexOf(origText);
      
       if (endBody != -1) {
       firstPart = tpString.substring(0, endBody);
       retVal = firstPart + newText +
       tpString.substring(endBody + origText.length());
      
       } else {
       retVal=tpString;
       }
      
       return retVal.getBytes();
       }
      
      }
      class ReplaceTextWrapper extends HttpServletResponseWrapper {
       private PrintWriter tpWriter;
       private ReplaceTextStream tpStream;
      
       public ReplaceTextWrapper(ServletResponse inResp, String searchText,
       String replaceText) throws java.io.IOException {
       super((HttpServletResponse) inResp);
       tpStream = new ReplaceTextStream(inResp.getOutputStream(), searchText, replaceText);
       tpWriter = new PrintWriter(tpStream);
       }
      
       public ServletOutputStream getOutputStream() throws java.io.IOException {
      
       return tpStream;
       }
       public PrintWriter getWriter() throws java.io.IOException {
      
       return tpWriter;
       }
      }
      
      public final class ReplaceTextFilter implements Filter {
       private FilterConfig filterConfig = null;
       private String searchText = ".";
       private String replaceText = ".";
       public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain)
       throws IOException, ServletException {
      
      
       ReplaceTextWrapper myWrappedResp = new ReplaceTextWrapper( response, searchText, replaceText);
       chain.doFilter(request, myWrappedResp);
       myWrappedResp.getOutputStream().close();
      
       }
      
       public void destroy() {
       }
      
      
       public void init(FilterConfig filterConfig) {
      
       String tpString;
       if (( tpString = filterConfig.getInitParameter("search") ) != null)
       searchText = tpString;
       if (( tpString = filterConfig.getInitParameter("replace") ) != null)
       replaceText = tpString;
      
       this.filterConfig = filterConfig;
      
       }
      
      
      }



      The filter works only when the requested page is a html. If is is renamed to
      jsp extension, this filter is failed. I get a

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
      <HTML><HEAD>
      <META http-equiv=Content-Type content="text/html; charset=iso-8859-1"></HEAD>
      <BODY></BODY></HTML>

      content.
      I suppose that filters work that first perform the jsp page and its result content is filtered.

      What's wrong?

      Tibor