001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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.Cookie;
025    import javax.servlet.http.HttpServletResponse;
026    import javax.servlet.http.HttpServletResponseWrapper;
027    
028    /**
029     * @author Shuyang Zhou
030     */
031    public class HeaderCacheServletResponse extends HttpServletResponseWrapper {
032    
033            public HeaderCacheServletResponse(HttpServletResponse response) {
034                    super(response);
035            }
036    
037            @Override
038            public void addCookie(Cookie cookie) {
039                    List<Header> values = _headers.get("cookies");
040    
041                    if (values == null) {
042                            values = new ArrayList<Header>();
043    
044                            _headers.put("cookies", values);
045                    }
046    
047                    Header header = new Header();
048    
049                    header.setCookieValue(cookie);
050                    header.setType(Header.COOKIE_TYPE);
051    
052                    if (values.contains(header)) {
053                            return;
054                    }
055    
056                    values.add(header);
057    
058                    super.addCookie(cookie);
059            }
060    
061            @Override
062            public void addDateHeader(String name, long value) {
063                    List<Header> values = _headers.get(name);
064    
065                    if (values == null) {
066                            values = new ArrayList<Header>();
067    
068                            _headers.put(name, values);
069                    }
070    
071                    Header header = new Header();
072    
073                    header.setDateValue(value);
074                    header.setType(Header.DATE_TYPE);
075    
076                    if (values.contains(header)) {
077                            return;
078                    }
079    
080                    values.add(header);
081    
082                    super.addDateHeader(name, value);
083            }
084    
085            @Override
086            public void addHeader(String name, String value) {
087                    List<Header> values = _headers.get(name);
088    
089                    if (values == null) {
090                            values = new ArrayList<Header>();
091    
092                            _headers.put(name, values);
093                    }
094    
095                    Header header = new Header();
096    
097                    header.setStringValue(value);
098                    header.setType(Header.STRING_TYPE);
099    
100                    if (values.contains(header)) {
101                            return;
102                    }
103    
104                    values.add(header);
105    
106                    if (name.equals(HttpHeaders.CONTENT_TYPE)) {
107                            setContentType(value);
108                    }
109    
110                    super.addHeader(name, value);
111            }
112    
113            @Override
114            public void addIntHeader(String name, int value) {
115                    List<Header> values = _headers.get(name);
116    
117                    if (values == null) {
118                            values = new ArrayList<Header>();
119    
120                            _headers.put(name, values);
121                    }
122    
123                    Header header = new Header();
124    
125                    header.setIntValue(value);
126                    header.setType(Header.INTEGER_TYPE);
127    
128                    if (values.contains(header)) {
129                            return;
130                    }
131    
132                    values.add(header);
133    
134                    super.addIntHeader(name, value);
135            }
136    
137            @Override
138            public void flushBuffer() {
139                    _committed = true;
140            }
141    
142            @Override
143            public String getContentType() {
144                    return _contentType;
145            }
146    
147            public String getHeader(String name) {
148                    List<Header> values = _headers.get(name);
149    
150                    if ((values == null) || values.isEmpty()) {
151                            return null;
152                    }
153    
154                    Header header = values.get(0);
155    
156                    return header.toString();
157            }
158    
159            public Map<String, List<Header>> getHeaders() {
160                    return _headers;
161            }
162    
163            public int getStatus() {
164                    return _status;
165            }
166    
167            @Override
168            public boolean isCommitted() {
169                    return _committed;
170            }
171    
172            @Override
173            public void sendError(int status) throws IOException {
174                    _status = status;
175    
176                    super.sendError(status);
177            }
178    
179            @Override
180            public void sendError(int status, String msg) throws IOException {
181                    _status = status;
182    
183                    super.sendError(status, msg);
184            }
185    
186            @Override
187            public void sendRedirect(String location) throws IOException {
188                    super.sendRedirect(location);
189    
190                    setStatus(SC_MOVED_PERMANENTLY);
191            }
192    
193            @Override
194            public void setContentLength(int contentLength) {
195            }
196    
197            @Override
198            public void setContentType(String contentType) {
199                    if (contentType != null) {
200                            _contentType = contentType;
201    
202                            super.setContentType(contentType);
203                    }
204            }
205    
206            @Override
207            public void setDateHeader(String name, long value) {
208                    List<Header> values = new ArrayList<Header>();
209    
210                    _headers.put(name, values);
211    
212                    Header header = new Header();
213    
214                    header.setDateValue(value);
215                    header.setType(Header.DATE_TYPE);
216    
217                    values.add(header);
218    
219                    super.setDateHeader(name, value);
220            }
221    
222            @Override
223            public void setHeader(String name, String value) {
224                    List<Header> values = new ArrayList<Header>();
225    
226                    _headers.put(name, values);
227    
228                    Header header = new Header();
229    
230                    header.setStringValue(value);
231                    header.setType(Header.STRING_TYPE);
232    
233                    values.add(header);
234    
235                    if (name.equals(HttpHeaders.CONTENT_TYPE)) {
236                            setContentType(value);
237                    }
238    
239                    super.setHeader(name, value);
240            }
241    
242            @Override
243            public void setIntHeader(String name, int value) {
244                    List<Header> values = new ArrayList<Header>();
245    
246                    _headers.put(name, values);
247    
248                    Header header = new Header();
249    
250                    header.setIntValue(value);
251                    header.setType(Header.INTEGER_TYPE);
252    
253                    values.add(header);
254    
255                    super.setIntHeader(name, value);
256            }
257    
258            @Override
259            public void setStatus(int status) {
260                    _status = status;
261    
262                    super.setStatus(status);
263            }
264    
265            private boolean _committed;
266            private String _contentType;
267            private Map<String, List<Header>> _headers =
268                    new HashMap<String, List<Header>>();
269            private int _status = SC_OK;
270    
271    }