/**
* Licensed under the Artistic License; you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://displaytag.sourceforge.net/license.html
*
* THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.displaytag.filter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletRequest;
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.tags.TableTag;
import org.displaytag.tags.TableTagParameters;
/**
* Actually writes out the content of the wrapped response. Used by the j2ee filter and the Spring interceptor
* implementations.
* @author Fabrizio Giustina
* @version $Revision$ ($Author$)
*/
public final class ExportDelegate
{
/**
* logger.
*/
private static Log log = LogFactory.getLog(ExportDelegate.class);
/**
* Don�t instantiate.
*/
private ExportDelegate()
{
// unused
}
/**
* Actually writes exported data. Extracts content from the Map stored in request with the
* <code>TableTag.FILTER_CONTENT_OVERRIDE_BODY</code> key.
* @param wrapper BufferedResponseWrapper implementation
* @param response HttpServletResponse
* @param request ServletRequest
* @throws IOException exception thrown by response writer/outputStream
*/
protected static void writeExport(HttpServletResponse response, ServletRequest request,
BufferedResponseWrapper wrapper) throws IOException
{
if (wrapper.isOutRequested())
{
// data already written
log.debug("Filter operating in unbuffered mode. Everything done, exiting");
return;
}
// 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("Filter operating in buffered mode. ");
Map bean = (Map) request.getAttribute(TableTag.FILTER_CONTENT_OVERRIDE_BODY);
if (log.isDebugEnabled())
{
log.debug(bean);
}
Object pageContent = bean.get(TableTagParameters.BEAN_BODY);
if (pageContent == null)
{
if (log.isDebugEnabled())
{
log.debug("Filter is enabled but exported content has not been found. Maybe an error occurred?");
}
response.setContentType(wrapper.getContentType());
PrintWriter out = response.getWriter();
out.write(wrapper.getContentAsString());
out.flush();
return;
}
// clear headers
if (!response.isCommitted())
{
response.reset();
}
String filename = (String) bean.get(TableTagParameters.BEAN_FILENAME);
String contentType = (String) bean.get(TableTagParameters.BEAN_CONTENTTYPE);
if (StringUtils.isNotBlank(filename))
{
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
}
String characterEncoding = wrapper.getCharacterEncoding();
String wrappedContentType = wrapper.getContentType();
if (wrappedContentType != null && wrappedContentType.indexOf("charset") > -1)
{
// charset is already specified (see #921811)
characterEncoding = StringUtils.substringAfter(wrappedContentType, "charset=");
}
if (characterEncoding != null && contentType.indexOf("charset") == -1) //$NON-NLS-1$
{
contentType += "; charset=" + characterEncoding; //$NON-NLS-1$
}
response.setContentType(contentType);
if (pageContent instanceof String)
{
// text content
if (characterEncoding != null)
{
response.setContentLength(((String) pageContent).getBytes(characterEncoding).length);
}
else
{
response.setContentLength(((String) pageContent).getBytes().length);
}
PrintWriter out = response.getWriter();
out.write((String) pageContent);
out.flush();
}
else
{
// dealing with binary content
byte[] content = (byte[]) pageContent;
response.setContentLength(content.length);
OutputStream out = response.getOutputStream();
out.write(content);
out.flush();
}
}
}