001: /*
002: * argun 1.0
003: * Web 2.0 delivery framework
004: * Copyright (C) 2007 Hammurapi Group
005: *
006: * This program is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2 of the License, or (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: *
020: * URL: http://www.hammurapi.biz
021: * e-Mail: support@hammurapi.biz
022: */
023:
024: package biz.hammurapi.web.menu;
025:
026: import java.io.ByteArrayInputStream;
027: import java.io.ByteArrayOutputStream;
028: import java.io.IOException;
029: import java.io.InputStreamReader;
030: import java.io.PrintWriter;
031: import java.io.Reader;
032: import java.io.StringReader;
033: import java.io.StringWriter;
034:
035: import javax.servlet.ServletOutputStream;
036: import javax.servlet.http.HttpServletResponse;
037: import javax.servlet.http.HttpServletResponseWrapper;
038:
039: import org.apache.log4j.Logger;
040:
041: /**
042: * This response wrapper class extends the support class HttpServletResponseWrapper,
043: * which implements all the methods in the HttpServletResponse interface, as
044: * delegations to the wrapped response.
045: * You only need to override the methods that you need to change.
046: * You can get access to the wrapped response using the method getResponse()
047: */
048: public class ResponseWrapper extends HttpServletResponseWrapper {
049: static Logger logger = Logger.getLogger(ResponseWrapper.class);
050: private StringWriter sWriter;
051: private PrintWriter pWriter;
052: private ByteArrayOutputStream baos;
053: private ServletOutputStream sos;
054: int contentLength;
055: private String errorString;
056: private boolean responseObtained = false;
057:
058: public String getResponseString() throws IOException {
059: if (errorString != null) {
060: return errorString;
061: }
062:
063: if (responseObtained) {
064: throw new IllegalStateException("Response already obtained");
065: }
066:
067: responseObtained = true;
068:
069: if (baos != null) {
070: baos.close();
071: Reader r = new InputStreamReader(new ByteArrayInputStream(
072: baos.toByteArray()));
073: StringWriter s = new StringWriter();
074: char[] cbuf = new char[4096];
075: int i;
076: while ((i = r.read(cbuf)) != -1)
077: s.write(cbuf, 0, i);
078: s.close();
079: return s.toString();
080: }
081:
082: if (sWriter != null) {
083: return sWriter.toString();
084: }
085:
086: return "<B>Resource not found!</B>";
087: }
088:
089: public Reader getResponseReader() throws IOException {
090: if (errorString != null) {
091: return new StringReader(errorString);
092: }
093:
094: if (responseObtained) {
095: throw new IllegalStateException("Response already obtained");
096: }
097:
098: responseObtained = true;
099:
100: if (baos != null) {
101: baos.close();
102: return new InputStreamReader(new ByteArrayInputStream(baos
103: .toByteArray()));
104: }
105:
106: if (sWriter != null) {
107: return new StringReader(sWriter.toString());
108: }
109:
110: return new StringReader("<B>Resource not found!</B>");
111: }
112:
113: HttpServletResponse response;
114:
115: public ResponseWrapper(HttpServletResponse response) {
116: super (response);
117: this .response = response;
118: }
119:
120: public void setContentLength(int len) {
121: logger.debug("setContentLength(" + len + ") - ignored");
122: }
123:
124: public void setContentType(String type) {
125: logger.debug("setContentType(" + type + ") - ignored");
126: }
127:
128: public void addDateHeader(String name, long date) {
129: logger.debug("addDateHeader(" + name + ", " + date + ")");
130: response.addDateHeader(name, date);
131: }
132:
133: public void addHeader(String name, String value) {
134: logger.debug("addHeader(" + name + ", " + value + ")");
135: response.addHeader(name, value);
136: }
137:
138: public void addIntHeader(String name, int value) {
139: logger.debug("addIntHeader(" + name + ", " + value + ")");
140: response.addIntHeader(name, value);
141: }
142:
143: public void setDateHeader(String name, long date) {
144: logger.debug("setDateHeader(" + name + ", " + date + ")");
145: response.setDateHeader(name, date);
146: }
147:
148: public void setHeader(String name, String value) {
149: logger.debug("setHeader(" + name + ", " + value + ")");
150: if ("Content-Length".equalsIgnoreCase(name)) {
151: logger.debug(" Ignored");
152: } else {
153: response.setHeader(name, value);
154: }
155: }
156:
157: public void setIntHeader(String name, int value) {
158: logger.debug("setIntHeader(" + name + ", " + value + ")");
159: response.setIntHeader(name, value);
160: }
161:
162: public void sendError(int sc) throws IOException {
163: errorString = "Error: " + sc;
164: logger.error(errorString);
165: response.sendError(sc);
166: }
167:
168: public void sendError(int sc, String msg) throws IOException {
169: errorString = "Error: " + sc + " (" + msg + ")";
170: logger.error(errorString);
171: response.sendError(sc, msg);
172: }
173:
174: public ServletOutputStream getOutputStream() throws IOException {
175: if (sWriter != null) {
176: throw new IllegalStateException(
177: "getWriter() already called");
178: }
179:
180: if (baos == null) {
181: baos = new ByteArrayOutputStream();
182: sos = new ServletOutputStream() {
183: public void write(int b) throws IOException {
184: baos.write(b);
185: }
186: };
187: logger.debug("ServletOutputStream obtained");
188: }
189:
190: return sos;
191: }
192:
193: public PrintWriter getWriter() throws IOException {
194: if (baos != null) {
195: throw new IllegalStateException(
196: "getOutputStream() already called");
197: }
198:
199: if (sWriter == null) {
200: sWriter = new StringWriter();
201: pWriter = new PrintWriter(sWriter);
202: logger.debug("PrintWriter obtained");
203: }
204: return pWriter;
205: }
206: }
|