001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.kernel.servlet;
016    
017    import java.io.IOException;
018    
019    import java.util.ArrayList;
020    import java.util.HashMap;
021    import java.util.List;
022    import java.util.Map;
023    
024    import javax.servlet.http.HttpServletResponse;
025    import javax.servlet.http.HttpServletResponseWrapper;
026    
027    /**
028     * @author Shuyang Zhou
029     */
030    public class HeaderCacheServletResponse extends HttpServletResponseWrapper {
031    
032            public HeaderCacheServletResponse(HttpServletResponse response) {
033                    super(response);
034            }
035    
036            public void addDateHeader(String name, long value) {
037                    List<Header> values = _headers.get(name);
038    
039                    if (values == null) {
040                            values = new ArrayList<Header>();
041    
042                            _headers.put(name, values);
043                    }
044    
045                    Header header = new Header();
046    
047                    header.setType(Header.DATE_TYPE);
048                    header.setDateValue(value);
049    
050                    values.add(header);
051    
052                    super.addDateHeader(name, value);
053            }
054    
055            public void addHeader(String name, String value) {
056                    List<Header> values = _headers.get(name);
057    
058                    if (values == null) {
059                            values = new ArrayList<Header>();
060    
061                            _headers.put(name, values);
062                    }
063    
064                    Header header = new Header();
065    
066                    header.setType(Header.STRING_TYPE);
067                    header.setStringValue(value);
068    
069                    values.add(header);
070    
071                    if (name.equals(HttpHeaders.CONTENT_TYPE)) {
072                            setContentType(value);
073                    }
074    
075                    super.addHeader(name, value);
076            }
077    
078            public void addIntHeader(String name, int value) {
079                    List<Header> values = _headers.get(name);
080    
081                    if (values == null) {
082                            values = new ArrayList<Header>();
083    
084                            _headers.put(name, values);
085                    }
086    
087                    Header header = new Header();
088    
089                    header.setType(Header.INTEGER_TYPE);
090                    header.setIntValue(value);
091    
092                    values.add(header);
093    
094                    super.addIntHeader(name, value);
095            }
096    
097            public String getContentType() {
098                    return _contentType;
099            }
100    
101            public String getHeader(String name) {
102                    List<Header> values = _headers.get(name);
103    
104                    if ((values == null) || values.isEmpty()) {
105                            return null;
106                    }
107    
108                    Header header = values.get(0);
109    
110                    return header.toString();
111            }
112    
113            public Map<String, List<Header>> getHeaders() {
114                    return _headers;
115            }
116    
117            public int getStatus() {
118                    return _status;
119            }
120    
121            public void sendError(int status) throws IOException {
122                    _status = status;
123    
124                    super.sendError(status);
125            }
126    
127            public void sendError(int status, String msg) throws IOException {
128                    _status = status;
129    
130                    super.sendError(status, msg);
131            }
132    
133            public void sendRedirect(String location) throws IOException {
134                    super.sendRedirect(location);
135    
136                    setStatus(SC_MOVED_TEMPORARILY);
137            }
138    
139            public void setContentLength(int contentLength) {
140            }
141    
142            public void setContentType(String contentType) {
143                    _contentType = contentType;
144    
145                    super.setContentType(contentType);
146            }
147    
148            public void setDateHeader(String name, long value) {
149                    List<Header> values = new ArrayList<Header>();
150    
151                    _headers.put(name, values);
152    
153                    Header header = new Header();
154    
155                    header.setType(Header.DATE_TYPE);
156                    header.setDateValue(value);
157    
158                    values.add(header);
159    
160                    super.setDateHeader(name, value);
161            }
162    
163            public void setHeader(String name, String value) {
164                    List<Header> values = new ArrayList<Header>();
165    
166                    _headers.put(name, values);
167    
168                    Header header = new Header();
169    
170                    header.setType(Header.STRING_TYPE);
171                    header.setStringValue(value);
172    
173                    values.add(header);
174    
175                    if (name.equals(HttpHeaders.CONTENT_TYPE)) {
176                            setContentType(value);
177                    }
178    
179                    super.setHeader(name, value);
180            }
181    
182            public void setIntHeader(String name, int value) {
183                    List<Header> values = new ArrayList<Header>();
184    
185                    _headers.put(name, values);
186    
187                    Header header = new Header();
188    
189                    header.setType(Header.INTEGER_TYPE);
190                    header.setIntValue(value);
191    
192                    values.add(header);
193    
194                    super.setIntHeader(name, value);
195            }
196    
197            public void setStatus(int status) {
198                    _status = status;
199    
200                    super.setStatus(status);
201            }
202    
203            private String _contentType;
204            private Map<String, List<Header>> _headers =
205                    new HashMap<String, List<Header>>();
206            private int _status = SC_OK;
207    
208    }