001    /**
002     * Copyright (c) 2000-2013 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.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            @Override
148            public String getHeader(String name) {
149                    List<Header> values = _headers.get(name);
150    
151                    if ((values == null) || values.isEmpty()) {
152                            return null;
153                    }
154    
155                    Header header = values.get(0);
156    
157                    return header.toString();
158            }
159    
160            public Map<String, List<Header>> getHeaders() {
161                    return _headers;
162            }
163    
164            @Override
165            public int getStatus() {
166                    return _status;
167            }
168    
169            @Override
170            public boolean isCommitted() {
171                    return _committed;
172            }
173    
174            @Override
175            public void sendError(int status) throws IOException {
176                    _status = status;
177    
178                    super.sendError(status);
179            }
180    
181            @Override
182            public void sendError(int status, String msg) throws IOException {
183                    _status = status;
184    
185                    super.sendError(status, msg);
186            }
187    
188            @Override
189            public void sendRedirect(String location) throws IOException {
190                    if (isCommitted()) {
191                            throw new IllegalStateException("Response is already committed");
192                    }
193    
194                    super.sendRedirect(location);
195    
196                    setStatus(SC_MOVED_PERMANENTLY);
197            }
198    
199            @Override
200            public void setContentLength(int contentLength) {
201            }
202    
203            @Override
204            public void setContentType(String contentType) {
205                    if (contentType != null) {
206                            _contentType = contentType;
207    
208                            super.setContentType(contentType);
209                    }
210            }
211    
212            @Override
213            public void setDateHeader(String name, long value) {
214                    List<Header> values = new ArrayList<Header>();
215    
216                    _headers.put(name, values);
217    
218                    Header header = new Header();
219    
220                    header.setDateValue(value);
221                    header.setType(Header.DATE_TYPE);
222    
223                    values.add(header);
224    
225                    super.setDateHeader(name, value);
226            }
227    
228            @Override
229            public void setHeader(String name, String value) {
230                    List<Header> values = new ArrayList<Header>();
231    
232                    _headers.put(name, values);
233    
234                    Header header = new Header();
235    
236                    header.setStringValue(value);
237                    header.setType(Header.STRING_TYPE);
238    
239                    values.add(header);
240    
241                    if (name.equals(HttpHeaders.CONTENT_TYPE)) {
242                            setContentType(value);
243                    }
244    
245                    super.setHeader(name, value);
246            }
247    
248            @Override
249            public void setIntHeader(String name, int value) {
250                    List<Header> values = new ArrayList<Header>();
251    
252                    _headers.put(name, values);
253    
254                    Header header = new Header();
255    
256                    header.setIntValue(value);
257                    header.setType(Header.INTEGER_TYPE);
258    
259                    values.add(header);
260    
261                    super.setIntHeader(name, value);
262            }
263    
264            @Override
265            public void setStatus(int status) {
266                    _status = status;
267    
268                    super.setStatus(status);
269            }
270    
271            private boolean _committed;
272            private String _contentType;
273            private Map<String, List<Header>> _headers =
274                    new HashMap<String, List<Header>>();
275            private int _status = SC_OK;
276    
277    }