001    package railo.runtime.net.http;
002    
003    import java.io.IOException;
004    import java.io.OutputStream;
005    import java.io.PrintWriter;
006    import java.io.Serializable;
007    import java.util.Locale;
008    
009    import javax.servlet.ServletOutputStream;
010    import javax.servlet.http.Cookie;
011    import javax.servlet.http.HttpServletResponse;
012    import javax.servlet.http.HttpServletResponseWrapper;
013    
014    import railo.commons.io.DevNullOutputStream;
015    import railo.commons.lang.Pair;
016    import railo.commons.net.URLEncoder;
017    import railo.runtime.op.Caster;
018    import railo.runtime.type.dt.DateTimeImpl;
019    
020    
021    
022    /**
023     * 
024     */
025    public final class HttpServletResponseWrap extends HttpServletResponseWrapper implements HttpServletResponse,Serializable {
026            
027            private Cookie[] cookies=new Cookie[0];
028            private Pair[] headers=new Pair[0];
029            private int status=200;
030            private String statusCode="OK";
031            private String charset="ISO-8859-1";
032            private int contentLength=-1;
033            private String contentType=null;
034            private Locale locale=Locale.getDefault();
035            private int bufferSize=-1;
036            private boolean commited;
037            //private byte[] outputDatad;
038            private OutputStream out;//=new DevNullOutputStream();
039            private boolean outInit=false;
040            private PrintWriter writer;
041            private ServletOutputStreamDummy outputStream;
042            
043    
044            private static ThreadLocal<Boolean> local=new ThreadLocal<Boolean>();
045    
046    
047            public static void set(boolean value) {
048                    local.set(Caster.toBoolean(value));
049            }
050            public static boolean get() {
051                    return Caster.toBooleanValue(local.get(),false);
052            }
053            public static void release() {
054                    local.set(Boolean.FALSE);
055            }
056    
057            /**
058             * Constructor of the class
059             */
060            public HttpServletResponseWrap(HttpServletResponse rsp) {
061                    this(rsp,DevNullOutputStream.DEV_NULL_OUTPUT_STREAM);
062            }
063    
064            public HttpServletResponseWrap(HttpServletResponse rsp,OutputStream out) {
065                    super(rsp);
066                    this.out=out;
067            }
068            
069            /**
070             * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie)
071             */
072            public void addCookie(Cookie cookie) {
073                    Cookie[] tmp = new Cookie[cookies.length+1];
074                    for(int i=0;i<cookies.length;i++) {
075                            tmp[i]=cookies[i];
076                    }
077                    tmp[cookies.length]=cookie;
078                    cookies=tmp;
079            }
080            
081            /**
082             * @see javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String)
083             */
084            public boolean containsHeader(String key) {
085                    return ReqRspUtil.get(headers, key)!=null;
086            }
087            
088            /**
089             * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String)
090             */
091            public String encodeURL(String value) {
092                    return URLEncoder.encode(value);
093            }
094            /**
095             * @see javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String)
096             */
097            public String encodeRedirectURL(String url) {
098                    return URLEncoder.encode(url);
099            }
100            /**
101             * @see javax.servlet.http.HttpServletResponse#encodeUrl(java.lang.String)
102             */
103            public String encodeUrl(String value) {
104                    return URLEncoder.encode(value);
105            }
106            /**
107             * @see javax.servlet.http.HttpServletResponse#encodeRedirectUrl(java.lang.String)
108             */
109            public String encodeRedirectUrl(String value) {
110                    return URLEncoder.encode(value);
111            }
112            
113            /* (non-Javadoc)
114             * @see javax.servlet.http.HttpServletResponse#sendError(int, java.lang.String)
115             */
116            public void sendError(int code, String codeText) throws IOException {
117                    // TODO impl
118            }
119            /* (non-Javadoc)
120             * @see javax.servlet.http.HttpServletResponse#sendError(int)
121             */
122            public void sendError(int code) throws IOException {
123                    // TODO impl
124            }
125            
126            /**
127             * @see javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String)
128             */
129            public void sendRedirect(String location) throws IOException {
130                    addHeader("location",location);
131            }
132            /**
133             * @see javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String, long)
134             */
135            public void setDateHeader(String key, long value) {
136                    setHeader(key, new DateTimeImpl(value,false).castToString());
137            }
138            
139            /**
140             * @see javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String, long)
141             */
142            public void addDateHeader(String key, long value) {
143                    addHeader(key, new DateTimeImpl(value,false).castToString());
144            }
145            
146            /**
147             * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, java.lang.String)
148             */
149            public void setHeader(String key, String value) {
150                    headers=ReqRspUtil.set(headers, key, value);
151            }
152            
153            /**
154             * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String, java.lang.String)
155             */
156            public void addHeader(String key, String value) {
157                    headers=ReqRspUtil.add(headers, key, value);
158            }
159            
160            /**
161             * @see javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String, int)
162             */
163            public void setIntHeader(String key, int value) {
164                    setHeader(key, String.valueOf(value));
165            }
166            
167            /**
168             * @see javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String, int)
169             */
170            public void addIntHeader(String key, int value) {
171                    addHeader(key, String.valueOf(value));
172            }
173            /**
174             * @see javax.servlet.http.HttpServletResponse#setStatus(int)
175             */
176            public void setStatus(int status) {
177                    this.status=status; 
178            }
179            /**
180             * @see javax.servlet.http.HttpServletResponse#setStatus(int, java.lang.String)
181             */
182            public void setStatus(int status, String statusCode) {
183                    setStatus(status);
184                    this.statusCode=statusCode;  
185            }
186            
187            /**
188             * @see javax.servlet.ServletResponse#getCharacterEncoding()
189             */
190            public String getCharacterEncoding() {
191                    return charset;
192            }
193            
194            public void setCharacterEncoding(String charset) {
195                    this.charset = charset;
196            }
197            
198            /* (non-Javadoc)
199             * @see javax.servlet.ServletResponse#getOutputStream()
200             */
201            public ServletOutputStream getOutputStream() throws IOException {
202                    //if(writer!=null) throw new IOException("output already initallised as Writer");
203                    if(outputStream!=null) return outputStream;
204                    return outputStream=new ServletOutputStreamDummy(out);
205            }
206            
207            public ServletOutputStream getExistingOutputStream()  {
208                    return outputStream;
209            }
210            
211            /* (non-Javadoc)
212             * @see javax.servlet.ServletResponse#getWriter()
213             */
214            public PrintWriter getWriter() throws IOException {
215                    //if(outputStream!=null) throw new IOException("output already initallised as OutputStream");
216                    if(writer!=null) return writer;
217                    return writer= new PrintWriter(getOutputStream());
218                    
219            }
220            
221            public PrintWriter getExistingWriter() {
222                    return writer;
223            }
224            
225            
226            
227            
228            /* (non-Javadoc)
229             * @see javax.servlet.ServletResponse#setContentLength(int)
230             */
231            public void setContentLength(int contentLength) {
232                    this.contentLength=contentLength;
233            }
234            /* (non-Javadoc)
235             * @see javax.servlet.ServletResponse#setContentType(java.lang.String)
236             */
237            public void setContentType(String contentType) {
238                    this.contentType=contentType;
239            }
240            /**
241             * @see javax.servlet.ServletResponse#setBufferSize(int)
242             */
243            public void setBufferSize(int size) {
244                    this.bufferSize=size;
245            }
246            /**
247             * @see javax.servlet.ServletResponse#getBufferSize()
248             */
249            public int getBufferSize() {
250                    return bufferSize;
251            }
252            /**
253             * @see javax.servlet.ServletResponse#flushBuffer()
254             */
255            public void flushBuffer() throws IOException {
256                    if(writer!=null)writer.flush();
257                    else if(outputStream!=null)outputStream.flush();
258                    commited = true;
259            }
260            /**
261             * @see javax.servlet.ServletResponse#resetBuffer()
262             */
263            public void resetBuffer() {
264                    commited = true;
265            }
266            /**
267             * @see javax.servlet.ServletResponse#isCommitted()
268             */
269            public boolean isCommitted() {
270                    return commited;
271            }
272            /**
273             * @see javax.servlet.ServletResponse#reset()
274             */
275            public void reset() {
276                    commited = true;
277            }
278            /**
279             * @see javax.servlet.ServletResponse#setLocale(java.util.Locale)
280             */
281            public void setLocale(Locale locale) {
282                    this.locale=locale;
283            }
284            /**
285             * @see javax.servlet.ServletResponse#getLocale()
286             */
287            public Locale getLocale() {
288                    return locale;
289            }
290    
291            /**
292             * @return the charset
293             */
294            public String getCharsetEncoding() {
295                    return charset;
296            }
297    
298            /**
299             * @return the commited
300             */
301            public boolean isCommited() {
302                    return commited;
303            }
304    
305            /**
306             * @return the contentLength
307             */
308            public int getContentLength() {
309                    return contentLength;
310            }
311    
312            /**
313             * @return the contentType
314             */
315            public String getContentType() {
316                    return contentType;
317            }
318    
319            /**
320             * @return the cookies
321             */
322            public Cookie[] getCookies() {
323                    return cookies;
324            }
325    
326            /**
327             * @return the headers
328             */
329            public Pair[] getHeaders() {
330                    return headers;
331            }
332    
333            /* *
334             * @return the outputData
335             * /
336            public byte[] getOutputData() {
337                    return outputData;
338            }
339    
340            public void setOutputData(byte[] outputData) {
341                    this.outputData=outputData;
342            }*/
343    
344            /**
345             * @return the status
346             */
347            public int getStatus() {
348                    return status;
349            }
350    
351            /**
352             * @return the statusCode
353             */
354            public String getStatusCode() {
355                    return statusCode;
356            }
357    
358            
359            
360    }