001    /**
002     * Copyright (c) 2000-2012 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            @Override
037            public void addDateHeader(String name, long value) {
038                    List<Header> values = _headers.get(name);
039    
040                    if (values == null) {
041                            values = new ArrayList<Header>();
042    
043                            _headers.put(name, values);
044                    }
045    
046                    Header header = new Header();
047    
048                    header.setType(Header.DATE_TYPE);
049                    header.setDateValue(value);
050    
051                    values.add(header);
052    
053                    super.addDateHeader(name, value);
054            }
055    
056            @Override
057            public void addHeader(String name, String value) {
058                    List<Header> values = _headers.get(name);
059    
060                    if (values == null) {
061                            values = new ArrayList<Header>();
062    
063                            _headers.put(name, values);
064                    }
065    
066                    Header header = new Header();
067    
068                    header.setType(Header.STRING_TYPE);
069                    header.setStringValue(value);
070    
071                    values.add(header);
072    
073                    if (name.equals(HttpHeaders.CONTENT_TYPE)) {
074                            setContentType(value);
075                    }
076    
077                    super.addHeader(name, value);
078            }
079    
080            @Override
081            public void addIntHeader(String name, int value) {
082                    List<Header> values = _headers.get(name);
083    
084                    if (values == null) {
085                            values = new ArrayList<Header>();
086    
087                            _headers.put(name, values);
088                    }
089    
090                    Header header = new Header();
091    
092                    header.setType(Header.INTEGER_TYPE);
093                    header.setIntValue(value);
094    
095                    values.add(header);
096    
097                    super.addIntHeader(name, value);
098            }
099    
100            @Override
101            public void flushBuffer() {
102                    _committed = true;
103            }
104    
105            @Override
106            public String getContentType() {
107                    return _contentType;
108            }
109    
110            public String getHeader(String name) {
111                    List<Header> values = _headers.get(name);
112    
113                    if ((values == null) || values.isEmpty()) {
114                            return null;
115                    }
116    
117                    Header header = values.get(0);
118    
119                    return header.toString();
120            }
121    
122            public Map<String, List<Header>> getHeaders() {
123                    return _headers;
124            }
125    
126            public int getStatus() {
127                    return _status;
128            }
129    
130            @Override
131            public boolean isCommitted() {
132                    return _committed;
133            }
134    
135            @Override
136            public void sendError(int status) throws IOException {
137                    _status = status;
138    
139                    super.sendError(status);
140            }
141    
142            @Override
143            public void sendError(int status, String msg) throws IOException {
144                    _status = status;
145    
146                    super.sendError(status, msg);
147            }
148    
149            @Override
150            public void sendRedirect(String location) throws IOException {
151                    super.sendRedirect(location);
152    
153                    setStatus(SC_MOVED_PERMANENTLY);
154            }
155    
156            @Override
157            public void setContentLength(int contentLength) {
158            }
159    
160            @Override
161            public void setContentType(String contentType) {
162                    _contentType = contentType;
163    
164                    super.setContentType(contentType);
165            }
166    
167            @Override
168            public void setDateHeader(String name, long value) {
169                    List<Header> values = new ArrayList<Header>();
170    
171                    _headers.put(name, values);
172    
173                    Header header = new Header();
174    
175                    header.setType(Header.DATE_TYPE);
176                    header.setDateValue(value);
177    
178                    values.add(header);
179    
180                    super.setDateHeader(name, value);
181            }
182    
183            @Override
184            public void setHeader(String name, String value) {
185                    List<Header> values = new ArrayList<Header>();
186    
187                    _headers.put(name, values);
188    
189                    Header header = new Header();
190    
191                    header.setType(Header.STRING_TYPE);
192                    header.setStringValue(value);
193    
194                    values.add(header);
195    
196                    if (name.equals(HttpHeaders.CONTENT_TYPE)) {
197                            setContentType(value);
198                    }
199    
200                    super.setHeader(name, value);
201            }
202    
203            @Override
204            public void setIntHeader(String name, int value) {
205                    List<Header> values = new ArrayList<Header>();
206    
207                    _headers.put(name, values);
208    
209                    Header header = new Header();
210    
211                    header.setType(Header.INTEGER_TYPE);
212                    header.setIntValue(value);
213    
214                    values.add(header);
215    
216                    super.setIntHeader(name, value);
217            }
218    
219            @Override
220            public void setStatus(int status) {
221                    _status = status;
222    
223                    super.setStatus(status);
224            }
225    
226            private boolean _committed;
227            private String _contentType;
228            private Map<String, List<Header>> _headers =
229                    new HashMap<String, List<Header>>();
230            private int _status = SC_OK;
231    
232    }