/* 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 jakarta.servlet.http.HttpServletResponse; 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(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; } }