/* 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; } }