The following comment has been added to this issue:

     Author: Keith Garry Boyce
    Created: Sun, 10 Oct 2004 4:21 PM
       Body:
I tried that but it seems that the following is also 2.3

    /**
     * @see javax.servlet.ServletResponse#resetBuffer()
     */
    public void resetBuffer()
    {
        response.resetBuffer();
    }

The following is what worked for me. Note I had to extend DynamoHttpServletResponse 
because stupid dynamo was throwing ClassCastException because there is no standard 
interface for DynamoHttpServletResponse that I could implement.
You of course should not have to do this as the standard HttpServletResponse interface 
should suffice for most containers (I'd leave in the comment though because it took me 
forever to figure out). I don't suppose there is any workaround for this. Anywhere 
here goes... (BTW note what I did with above function):

package org.displaytag.spring.interceptor;

import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;

import javax.servlet.ServletOutputStream;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.tags.TableTagParameters;

import atg.servlet.DynamoHttpServletResponse;


/**
 * Buffers the response; will not send anything directly through to the actual 
response. Note that this blocks the
 * content-type from being set, you must set it manually in the response. For a given 
response, you should call either
 * #getWriter or #getOutputStream , but not both. J2ee 1.3 free implementation.
 * @author rapruitt
 * @author Fabrizio Giustina
 * @version $Revision: 1.5 $ ($Author: fgiust $)
 * @since 1.0
 */
public class BufferedResponseWrapper12 extends DynamoHttpServletResponse implements 
HttpServletResponse // don't extend j2ee 1.3
// HttpServletResponseWrapper
{

    /**
     * logger.
     */
    private static Log log = LogFactory.getLog(BufferedResponseWrapper12.class);

    /**
     * The buffered response.
     */
    private CharArrayWriter outputWriter;

    /**
     * The outputWriter stream.
     */
    private SimpleServletOutputStream servletOutputStream;

    /**
     * The contentType.
     */
    private String contentType;

    /**
     * The wrapped response.
     */
    private HttpServletResponse response;

    /**
     * If state is set, allow getOutputStream() to return the "real" output stream, 
elsewhere returns a internal buffer.
     */
    private boolean state;

    /**
     * Writer has been requested.
     */
    private boolean outRequested;

    /**
     * @param httpServletResponse the response to wrap
     */
    public BufferedResponseWrapper12(HttpServletResponse httpServletResponse)
    {
        this.response = httpServletResponse;
        this.outputWriter = new CharArrayWriter();
        this.servletOutputStream = new SimpleServletOutputStream();
    }

    /**
     * Returns the wrapped servletResponse.
     * @return wrapped servletResponse
     */
    public HttpServletResponse getResponse()
    {
        return this.response;
    }

    /**
     * If the app server sets the content-type of the response, it is sticky and you 
will not be able to change it.
     * Therefore it is intercepted here.
     * @return the ContentType that was most recently set
     */
    public String getContentType()
    {
        return this.contentType;
    }

    /**
     * The content type is NOT set on the wrapped response. You must set it manually. 
Overrides any previously set
     * value.
     * @param theContentType the content type.
     */
    public void setContentType(String theContentType)
    {
        if (state)
        {
            log.debug("Allowing content type");
            getResponse().setContentType(theContentType);
        }
        this.contentType = theContentType;
    }

    /**
     * @see javax.servlet.ServletResponse#getWriter()
     */
    public PrintWriter getWriter() throws IOException
    {

        if (state && !outRequested)
        {
            log.debug("getWriter() returned");

            // ok, exporting in progress, discard old data and go on streaming
            this.servletOutputStream.reset();
            this.outputWriter.reset();
            this.outRequested = true;
            return ((HttpServletResponse) getResponse()).getWriter();
        }

        return new PrintWriter(this.outputWriter);
    }

    /**
     * Flush the buffer, not the response.
     * @throws IOException if encountered when flushing
     */
    public void flushBuffer() throws IOException
    {
        if (outputWriter != null)
        {
            this.outputWriter.flush();
            this.servletOutputStream.outputStream.reset();
        }
    }

    /**
     * @see javax.servlet.ServletResponse#getOutputStream()
     */
    public ServletOutputStream getOutputStream() throws IOException
    {
        return this.servletOutputStream;
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String, 
java.lang.String)
     */
    public void addHeader(String name, String value)
    {
        // if the "magic parameter" is set, a table tag is going to call 
getOutputStream()
        if (TableTagParameters.PARAMETER_EXPORTING.equals(name))
        {
            log.debug("Magic header received, real response is now accessible");
            state = true;
        }
        else
        {
            ((HttpServletResponse) getResponse()).addHeader(name, value);
        }
    }

    /**
     * Return <code>true</code> if ServletOutputStream has been requested from Table 
tag.
     * @return <code>true</code> if ServletOutputStream has been requested
     */
    protected boolean isOutRequested()
    {
        return this.outRequested;
    }

    /**
     * Get the String representation.
     * @return the contents of the response
     */
    public String toString()
    {
        return this.outputWriter.toString() + this.servletOutputStream.toString();
    }

    // -- standard methods --

    /**
     * @see javax.servlet.ServletResponse#getCharacterEncoding()
     */
    public String getCharacterEncoding()
    {
        return response.getCharacterEncoding();
    }

    /**
     * @see javax.servlet.ServletResponse#setContentLength(int)
     */
    public void setContentLength(int len)
    {
        response.setContentLength(len);
    }

    /**
     * @see javax.servlet.ServletResponse#setBufferSize(int)
     */
    public void setBufferSize(int size)
    {
        response.setBufferSize(size);
    }

    /**
     * @see javax.servlet.ServletResponse#getBufferSize()
     */
    public int getBufferSize()
    {
        return response.getBufferSize();
    }

    /**
     * @see javax.servlet.ServletResponse#isCommitted()
     */
    public boolean isCommitted()
    {
        return response.isCommitted();
    }

    /**
     * @see javax.servlet.ServletResponse#reset()
     */
    public void reset()
    {
        response.reset();
    }

    /**
     * @see javax.servlet.ServletResponse#resetBuffer()
     */
    public void resetBuffer()
    {
        if (isCommitted())
            throw new IllegalStateException("committed");
        servletOutputStream.reset();
    }

    /**
     * @see javax.servlet.ServletResponse#setLocale(java.util.Locale)
     */
    public void setLocale(Locale loc)
    {
        response.setLocale(loc);
    }

    /**
     * @see javax.servlet.ServletResponse#getLocale()
     */
    public Locale getLocale()
    {
        return response.getLocale();
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie)
     */
    public void addCookie(Cookie cookie)
    {
        response.addCookie(cookie);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String)
     */
    public boolean containsHeader(String name)
    {
        return response.containsHeader(name);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String)
     */
    public String encodeURL(String url)
    {
        return response.encodeURL(url);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String)
     */
    public String encodeRedirectURL(String url)
    {
        return response.encodeRedirectURL(url);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#encodeUrl(java.lang.String)
     * @deprecated
     */
    public String encodeUrl(String url)
    {
        return response.encodeUrl(url);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#encodeRedirectUrl(java.lang.String)
     * @deprecated
     */
    public String encodeRedirectUrl(String url)
    {
        return response.encodeRedirectUrl(url);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#sendError(int, java.lang.String)
     */
    public void sendError(int sc, String msg) throws IOException
    {
        response.sendError(sc, msg);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#sendError(int)
     */
    public void sendError(int sc) throws IOException
    {
        response.sendError(sc);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String)
     */
    public void sendRedirect(String location) throws IOException
    {
        response.sendRedirect(location);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String, 
long)
     */
    public void setDateHeader(String name, long date)
    {
        response.setDateHeader(name, date);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String, 
long)
     */
    public void addDateHeader(String name, long date)
    {
        response.addDateHeader(name, date);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, 
java.lang.String)
     */
    public void setHeader(String name, String value)
    {
        response.setHeader(name, value);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String, int)
     */
    public void setIntHeader(String name, int value)
    {
        response.setIntHeader(name, value);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String, int)
     */
    public void addIntHeader(String name, int value)
    {
        response.addIntHeader(name, value);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#setStatus(int)
     */
    public void setStatus(int sc)
    {
        response.setStatus(sc);
    }

    /**
     * @see javax.servlet.http.HttpServletResponse#setStatus(int, java.lang.String)
     * @deprecated
     */
    public void setStatus(int sc, String sm)
    {
        response.setStatus(sc, sm);
    }

}



///////////////////// And /////////////////////////////////
package org.displaytag.spring.interceptor;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.Messages;
import org.displaytag.tags.TableTag;
import org.displaytag.tags.TableTagParameters;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter;
/**
 * Allow the author of an included JSP page to reset the content type to something 
else (like a binary stream), and then
 * write the new info back as the exclusive response, clearing the buffers of all 
previously added content.
 * <p>
 * The page author should write to, but not replace, the StringBuffer objects placed 
into request scope at
 * CONTENT_OVERRIDE_BODY and CONTENT_OVERRIDE_TYPE.
 * </p>
 * <p>
 * This interceptor allows TableTag users to perform exports from pages that are run 
as includes, such as from Struts or a
 * jsp:include. If that is your intention, just add this interceptor to your spring 
dispatcher context xml and map it to the appropriate requests,
 * using something like:
 * </p>
 * 
 * <pre>
 * &lt;bean id="handlerMapping" 
 *   class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt  *
 *   &lt;property name="interceptors"&gt;
 *       &lt;list&gt;
 *            &lt;bean 
class="org.displaytag.spring.interceptor.DisplayTagInterceptor"/&gt;
 *       &lt;/list&gt
 * &lt;/bean&gt;

 * </pre>
 * 
 * @author Keith Garry Boyce
 * @author rapruitt
 * @author Fabrizio Giustina
 * @version $Revision: 1.19 $ ($Author: fgiust $)
 * @since 1.0
 */
public class DisplayTagInterceptor implements HandlerInterceptor {

    final static Log log = LogFactory.getLog(DisplayTagInterceptor.class);
    /* (non-Javadoc)
     * @see 
org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest,
 javax.servlet.http.HttpServletResponse, java.lang.Object)
     */
    public boolean preHandle(HttpServletRequest servletRequest, HttpServletResponse 
servletResponse, Object handler) throws Exception {
////
        if (servletRequest.getParameter(TableTagParameters.PARAMETER_EXPORTING) == 
null)
        {
            if (log.isDebugEnabled())
            {
                
log.debug(Messages.getString("DisplayTagInterceptor.parameternotfound")); //$NON-NLS-1$
            }
            //don't intercept!
            return true;
        }

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        BufferedResponseWrapper12 wrapper = new 
BufferedResponseWrapper12(servletResponse);

        request.setAttribute(TableTag.FILTER_CONTENT_OVERRIDE_BODY, Boolean.TRUE);

        HandlerAdapter handlerAdaptor = new SimpleControllerHandlerAdapter();
        handlerAdaptor.handle(request,wrapper,handler);

        if (wrapper.isOutRequested())
        {
            // data already written
            log.debug("Everything done, exiting");
            return false;
        }
        

        // if you reach this point the PARAMETER_EXPORTING has been found, but the 
special header has never been set in
        // response (this is the signal from table tag that it is going to write 
exported data)
        log.debug("Something went wrong, displaytag never requested writer as 
expected.");

        String pageContent;
        String contentType;

        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        String characterEncoding = resp.getCharacterEncoding();
        if (characterEncoding != null)
        {
            characterEncoding = "; charset=" + characterEncoding; //$NON-NLS-1$
        }
        log.debug(Messages.getString("DisplayTagInterceptor.notoverriding")); 
//$NON-NLS-1$
        pageContent = wrapper.toString();
        contentType = wrapper.getContentType();

        if (contentType != null)
        {
            if (contentType.indexOf("charset") > -1) //$NON-NLS-1$
            {
                // charset is already specified (see #921811)
                servletResponse.setContentType(contentType);
            }
            else
            {
                servletResponse.setContentType(contentType + 
StringUtils.defaultString(characterEncoding));
            }
        }
        servletResponse.setContentLength(pageContent.length());

        PrintWriter out = servletResponse.getWriter();
        out.write(pageContent);
        return false;

    }

    /* (non-Javadoc)
     * @see 
org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest,
 javax.servlet.http.HttpServletResponse, java.lang.Object, 
org.springframework.web.servlet.ModelAndView)
     */
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object 
arg2, ModelAndView arg3) throws Exception {
        // Nothing to do
        
    }

    /* (non-Javadoc)
     * @see 
org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest,
 javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
     */
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, 
Object arg2, Exception arg3) throws Exception {
//      Nothing to do        
    }

}



---------------------------------------------------------------------
View this comment:
  http://jira.codehaus.org/browse/DISPL-30?page=comments#action_25185

---------------------------------------------------------------------
View the issue:
  http://jira.codehaus.org/browse/DISPL-30

Here is an overview of the issue:
---------------------------------------------------------------------
        Key: DISPL-30
    Summary: Spring Interceptor for use with servlet 2.2 containers
       Type: New Feature

     Status: Unassigned
   Priority: Minor

 Original Estimate: Unknown
 Time Spent: Unknown
  Remaining: Unknown

    Project: DisplayTag
 Components: 
             Export
   Versions:
             1.0 RC1

   Assignee: 
   Reporter: fabrizio giustina

    Created: Sat, 2 Oct 2004 4:13 AM
    Updated: Sun, 10 Oct 2004 4:21 PM

Description:
Se http://forum.springframework.org/viewtopic.php?t=1004 and displaytag-user mailing 
list

Boyce, Keith Garry

I developed an interceptor to use instead of responseOverrideFilter for use in Servlet 
2.2 containers with ServletWrapperController (posted on jira). Please give me credit 
in javadoc if you decide to use it. Here is the code:

Code:
/*
 * DisplayTagInterceptor.java
 *
 * Copyright 2004 by Electronic Data Systems
 * Corporation. All rights reserved.
 *
 * An unpublished work created Sep 26, 2004, 2004. This work is a
 * trade secret of EDS and unauthorized use or copying
 * is prohibited.
 *
 */
package org.springframework.web.servlet.mvc;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.filter.BufferedResponseWrapper;
import org.displaytag.tags.TableTag;
import org.displaytag.tags.TableTagParameters;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.HandlerAdapter;
/**
 * @author jztb88
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class DisplayTagInterceptor implements HandlerInterceptor {

    final static Log log = LogFactory.getLog(DisplayTagInterceptor.class);
    /* (non-Javadoc)
     * @see 
org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest,
 javax.servlet.http.HttpServletResponse, java.lang.Object)
     */
    public boolean preHandle(HttpServletRequest servletRequest, HttpServletResponse 
servletResponse, Object handler) throws Exception {
        if (servletRequest.getParameter(TableTagParameters.PARAMETER_EXPORTING) == 
null)
        {
            if (log.isDebugEnabled())
            {
                log.debug("Filter has been called, but PARAMETER_EXPORTING parameter 
has not been found.");
            }
            return true;
        }

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        BufferedResponseWrapper wrapper = new 
BufferedResponseWrapper((HttpServletResponse) servletResponse);

        // In a portlet environment, you do not have direct access to the actual 
request object, so any attribute that
        // is added will not be visible outside of your portlet. So instead, users 
MUST append to the StringBuffer, so
        // that the portlets do not have to bind a new attribute to the request.
        request.setAttribute(TableTag.FILTER_CONTENT_OVERRIDE_BODY, new 
StringBuffer(8096));
        request.setAttribute(TableTag.FILTER_CONTENT_OVERRIDE_TYPE, new 
StringBuffer(80));
        request.setAttribute(TableTag.FILTER_CONTENT_OVERRIDE_FILENAME, new 
StringBuffer(80));

        HandlerAdapter handlerAdaptor = new SimpleControllerHandlerAdapter();
        handlerAdaptor.handle(request,wrapper,handler);
       

        String pageContent;
        String contentType;
        StringBuffer buf = (StringBuffer) 
request.getAttribute(TableTag.FILTER_CONTENT_OVERRIDE_BODY);
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        String characterEncoding = resp.getCharacterEncoding();
        if (characterEncoding != null)
        {
            characterEncoding = "; charset=" + characterEncoding;
        }
        if (buf != null && buf.length() > 0)
        {
            pageContent = buf.toString();
            contentType = 
ObjectUtils.toString(request.getAttribute(TableTag.FILTER_CONTENT_OVERRIDE_TYPE));
            if (log.isDebugEnabled())
            {
                log.debug("Overriding output, writing new output with content type " + 
contentType);
            }

            StringBuffer filename = (StringBuffer) 
request.getAttribute(TableTag.FILTER_CONTENT_OVERRIDE_FILENAME);

            if (filename != null && StringUtils.isNotEmpty(filename.toString()))
            {
                if (log.isDebugEnabled())
                {
                    log.debug("Filename specified as " + filename);
                }
                resp.setHeader("Content-Disposition", "attachment; filename=\"" + 
filename + "\"");
            }
        }
        else
        {
            log.debug("NOT overriding input. ");
            pageContent = wrapper.toString();
            contentType = wrapper.getContentType();
        }

        if (contentType != null)
        {
            if (contentType.indexOf("charset") > -1)
            {
                // charset is already specified (see #921811)
                servletResponse.setContentType(contentType);
            }
            else
            {
                servletResponse.setContentType(contentType + 
StringUtils.defaultString(characterEncoding));
            }
        }
        servletResponse.setContentLength(pageContent.length());

        PrintWriter out = servletResponse.getWriter();
        out.write(pageContent);
        out.close();
        return false;
    }

    /* (non-Javadoc)
     * @see 
org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest,
 javax.servlet.http.HttpServletResponse, java.lang.Object, 
org.springframework.web.servlet.ModelAndView)
     */
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object 
arg2, ModelAndView arg3) throws Exception {
        // Nothing to do
       
    }

    /* (non-Javadoc)
     * @see 
org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest,
 javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
     */
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, 
Object arg2, Exception arg3) throws Exception {
//      Nothing to do       
    }

}



---------------------------------------------------------------------
JIRA INFORMATION:
This message is automatically generated by JIRA.

If you think it was sent incorrectly contact one of the administrators:
   http://jira.codehaus.org/secure/Administrators.jspa

If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira



-------------------------------------------------------
This SF.net email is sponsored by: IT Product Guide on ITManagersJournal
Use IT products in your business? Tell us what you think of them. Give us
Your Opinions, Get Free ThinkGeek Gift Certificates! Click to find out more
http://productguide.itmanagersjournal.com/guidepromo.tmpl
_______________________________________________
displaytag-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/displaytag-devel

Reply via email to