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.portlet;
016    
017    import com.liferay.portal.kernel.servlet.ServletOutputStreamAdapter;
018    import com.liferay.portal.kernel.util.UnsyncPrintWriterPool;
019    import com.liferay.util.servlet.NullServletOutputStream;
020    
021    import java.io.IOException;
022    import java.io.OutputStream;
023    import java.io.PrintWriter;
024    
025    import java.util.Locale;
026    
027    import javax.portlet.ActionResponse;
028    import javax.portlet.MimeResponse;
029    import javax.portlet.PortletRequest;
030    import javax.portlet.PortletResponse;
031    import javax.portlet.ResourceResponse;
032    
033    import javax.servlet.ServletOutputStream;
034    import javax.servlet.http.Cookie;
035    import javax.servlet.http.HttpServletResponse;
036    import javax.servlet.http.HttpServletResponseWrapper;
037    
038    /**
039     * @author Brian Wing Shun Chan
040     */
041    public class PortletServletResponse extends HttpServletResponseWrapper {
042    
043            public PortletServletResponse(
044                    HttpServletResponse response, PortletResponse portletResponse,
045                    boolean include) {
046    
047                    super(response);
048    
049                    _portletResponse = portletResponse;
050                    _include = include;
051    
052                    PortletResponseImpl portletResponseImpl =
053                            PortletResponseImpl.getPortletResponseImpl(portletResponse);
054    
055                    _lifecycle = portletResponseImpl.getLifecycle();
056            }
057    
058            @Override
059            public void addCookie(Cookie cookie) {
060                    if (!_include) {
061                            _portletResponse.addProperty(cookie);
062                    }
063            }
064    
065            @Override
066            public void addDateHeader(String name, long value) {
067                    addHeader(name, String.valueOf(value));
068            }
069    
070            @Override
071            public void addHeader(String name, String value) {
072                    if (!_include) {
073                            if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
074                                    _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
075    
076                                    MimeResponse mimeResponse = _getMimeResponse();
077    
078                                    mimeResponse.setProperty(name, value);
079                            }
080                    }
081            }
082    
083            @Override
084            public void addIntHeader(String name, int value) {
085                    addHeader(name, String.valueOf(value));
086            }
087    
088            @Override
089            public boolean containsHeader(String name) {
090                    return false;
091            }
092    
093            @Override
094            public String encodeRedirectUrl(String url) {
095                    return null;
096            }
097    
098            @Override
099            public String encodeRedirectURL(String url) {
100                    return null;
101            }
102    
103            @Override
104            public String encodeUrl(String url) {
105                    return _portletResponse.encodeURL(url);
106            }
107    
108            @Override
109            public String encodeURL(String url) {
110                    return _portletResponse.encodeURL(url);
111            }
112    
113            @Override
114            public void flushBuffer() throws IOException {
115                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
116                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
117    
118                            MimeResponse mimeResponse = _getMimeResponse();
119    
120                            mimeResponse.flushBuffer();
121                    }
122            }
123    
124            @Override
125            public int getBufferSize() {
126                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
127                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
128    
129                            MimeResponse mimeResponse = _getMimeResponse();
130    
131                            return mimeResponse.getBufferSize();
132                    }
133                    else {
134                            return 0;
135                    }
136            }
137    
138            @Override
139            public String getCharacterEncoding() {
140                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
141                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
142    
143                            MimeResponse mimeResponse = _getMimeResponse();
144    
145                            return mimeResponse.getCharacterEncoding();
146                    }
147                    else {
148                            return null;
149                    }
150            }
151    
152            @Override
153            public String getContentType() {
154                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
155                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
156    
157                            MimeResponse mimeResponse = _getMimeResponse();
158    
159                            return mimeResponse.getContentType();
160                    }
161                    else {
162                            return null;
163                    }
164            }
165    
166            @Override
167            public Locale getLocale() {
168                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
169                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
170    
171                            MimeResponse mimeResponse = _getMimeResponse();
172    
173                            return mimeResponse.getLocale();
174                    }
175                    else {
176                            return null;
177                    }
178            }
179    
180            @Override
181            public ServletOutputStream getOutputStream() throws IOException {
182                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
183                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
184    
185                            MimeResponse mimeResponse = _getMimeResponse();
186    
187                            OutputStream portletOutputStream =
188                                    mimeResponse.getPortletOutputStream();
189    
190                            ServletOutputStream servletOutputStream =
191                                    new ServletOutputStreamAdapter(portletOutputStream);
192    
193                            return servletOutputStream;
194                    }
195                    else {
196                            return new NullServletOutputStream();
197                    }
198            }
199    
200            @Override
201            public PrintWriter getWriter() throws IOException {
202                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
203                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
204    
205                            MimeResponse mimeResponse = _getMimeResponse();
206    
207                            return mimeResponse.getWriter();
208                    }
209                    else {
210                            return UnsyncPrintWriterPool.borrow(
211                                    new NullServletOutputStream(), getCharacterEncoding());
212                    }
213            }
214    
215            @Override
216            public boolean isCommitted() {
217                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
218                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
219    
220                            MimeResponse mimeResponse = _getMimeResponse();
221    
222                            return mimeResponse.isCommitted();
223                    }
224                    else if (!_include) {
225                            return false;
226                    }
227                    else {
228                            return true;
229                    }
230            }
231    
232            @Override
233            public void reset() {
234                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
235                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
236    
237                            MimeResponse mimeResponse = _getMimeResponse();
238    
239                            mimeResponse.reset();
240                    }
241            }
242    
243            @Override
244            public void resetBuffer() {
245                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
246                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
247    
248                            MimeResponse mimeResponse = _getMimeResponse();
249    
250                            mimeResponse.resetBuffer();
251                    }
252            }
253    
254            @Override
255            public void sendError(int status) {
256            }
257    
258            @Override
259            public void sendError(int status, String message) {
260            }
261    
262            @Override
263            public void sendRedirect(String location) throws IOException {
264                    if (!_include) {
265                            if (_lifecycle.equals(PortletRequest.ACTION_PHASE)) {
266                                    ActionResponse actionResponse = _getActionResponse();
267    
268                                    actionResponse.sendRedirect(location);
269                            }
270                    }
271            }
272    
273            @Override
274            public void setBufferSize(int bufferSize) {
275                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
276                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
277    
278                            MimeResponse mimeResponse = _getMimeResponse();
279    
280                            mimeResponse.setBufferSize(bufferSize);
281                    }
282            }
283    
284            @Override
285            public void setCharacterEncoding(String characterEncoding) {
286                    if (!_include) {
287                            if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
288                                    ResourceResponse resourceResponse = _getResourceResponse();
289    
290                                    resourceResponse.setCharacterEncoding(characterEncoding);
291                            }
292                    }
293            }
294    
295            @Override
296            public void setContentLength(int contentLength) {
297                    if (!_include) {
298                            if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
299                                    ResourceResponse resourceResponse = _getResourceResponse();
300    
301                                    resourceResponse.setContentLength(contentLength);
302                            }
303                    }
304            }
305    
306            @Override
307            public void setContentType(String contentType) {
308                    if (!_include) {
309                            if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
310                                    _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
311    
312                                    MimeResponse mimeResponse = _getMimeResponse();
313    
314                                    mimeResponse.setContentType(contentType);
315                            }
316                    }
317            }
318    
319            @Override
320            public void setDateHeader(String name, long date) {
321                    setHeader(name, String.valueOf(date));
322            }
323    
324            @Override
325            public void setHeader(String name, String value) {
326                    if (!_include) {
327                            if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
328                                    _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
329    
330                                    MimeResponse mimeResponse = _getMimeResponse();
331    
332                                    mimeResponse.setProperty(name, value);
333                            }
334                    }
335            }
336    
337            @Override
338            public void setIntHeader(String name, int value) {
339                    setHeader(name, String.valueOf(value));
340            }
341    
342            @Override
343            public void setLocale(Locale locale) {
344                    if (!_include) {
345                            if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
346                                    ResourceResponse resourceResponse = _getResourceResponse();
347    
348                                    resourceResponse.setLocale(locale);
349                            }
350                    }
351            }
352    
353            @Override
354            public void setStatus(int status) {
355                    if (!_include) {
356                            if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
357                                    ResourceResponse resourceResponse = _getResourceResponse();
358    
359                                    resourceResponse.setProperty(
360                                            ResourceResponse.HTTP_STATUS_CODE, String.valueOf(status));
361                            }
362                    }
363            }
364    
365            @Override
366            public void setStatus(int status, String message) {
367                    setStatus(status);
368            }
369    
370            private ActionResponse _getActionResponse() {
371                    return (ActionResponse)_portletResponse;
372            }
373    
374            private MimeResponse _getMimeResponse() {
375                    return (MimeResponse)_portletResponse;
376            }
377    
378            private ResourceResponse _getResourceResponse() {
379                    return (ResourceResponse)_portletResponse;
380            }
381    
382            private boolean _include;
383            private String _lifecycle;
384            private PortletResponse _portletResponse;
385    
386    }