/*
Wotonomy: OpenStep design patterns for pure Java applications.
Copyright (C) 2000 Blacksmith, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see http://www.gnu.org
*/
package net.wotonomy.web;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import net.wotonomy.foundation.NSArray;
/**
* A pure java implementation of WOResponse.
*
* @author michael@mpowers.net
* @author $Author: cgruber $
* @version $Revision: 905 $
*/
public class WOResponse extends WOMessage
implements WOActionResults
{
protected static String defaultEncoding;
private static SimpleDateFormat htmlDateFormat;
static
{
defaultEncoding = "ISO8859_1";
htmlDateFormat = new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss z" );
htmlDateFormat.setTimeZone(
TimeZone.getTimeZone( "GMT" ) );
}
private int status;
/**
* Parameterless constructor which should not be called.
*/
public WOResponse ()
{
status = -1; // -1 indicates not yet set
}
/**
* Sets the status code of the response.
* You should use the constants defined in HttpServletResponse.
*/
public void setStatus (int code)
{
status = code;
}
/**
* Gets the current status code for the response.
*/
public int status ()
{
return status;
}
/**
* Sets a header in the response to disable client caching.
* (Whether this works depends on the client implementation.)
*/
public void disableClientCaching ()
{
String dateString = htmlDateFormat.format( new Date() );
setHeader( dateString, "Date" );
setHeader( dateString, "Expires" );
setHeader( "no-cache", "Pragma" );
setHeaders( new NSArray( new Object[] {
"private", "no-cache", "max-age = 0" } ), "Cache-Control" );
//System.out.println( "disableClientCaching: " + dateString );
}
/**
* Returns this object. (Implements the WOActionResults interface.)
*/
public WOResponse generateResponse()
{
return this;
}
/**
* Generates the response using the specified servlet response,
* but does not flush the buffer. The caller is responsible
* for sending the response to the client.
* Note that this method is currently responsible for setting
* the content type to "text/html". As far as I can tell, WORequests
* have no way to set the content type and therefore must always
* be of type "text/html".
*/
void generateServletResponse
(javax.servlet.http.HttpServletResponse response)
{
if ( WOApplication.application().isPageRefreshOnBacktrackEnabled() )
{
disableClientCaching();
}
String key;
java.util.Enumeration e, f;
// set content type: might be overwritten by headers below
response.setContentType( "text/html" );
// set status
if ( status != -1 )
{
response.setStatus( status );
}
// set headers
f = _headers.allKeys().objectEnumerator();
while ( f.hasMoreElements() )
{
key = f.nextElement().toString();
e = ((NSArray)_headers.objectForKey( key )).objectEnumerator();
if ( e.hasMoreElements() )
{
// overwrite existing header
response.setHeader( key, e.nextElement().toString() );
}
while ( e.hasMoreElements() )
{
response.addHeader( key, e.nextElement().toString() );
}
}
// set cookies
e = _cookies.allValues().objectEnumerator();
while ( e.hasMoreElements() )
{
response.addCookie( (WOCookie) e.nextElement() );
}
try
{
// write content
response.getOutputStream().write(_contentData.bytes() );
if ( status > 299 )
{
response.sendError( status );
}
}
catch ( Exception exc )
{
throw new RuntimeException(
"Error writing response: " + exc );
}
}
/**
* Returns the current default encoding seting.
*/
public static String defaultEncoding ()
{
return defaultEncoding;
}
/**
* Sets the default encoding setting.
*/
public static void setDefaultEncoding (String encoding)
{
defaultEncoding = encoding;
}
}