001    /**
002     * Copyright (c) 2000-present 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            /**
094             * @deprecated As of 7.0.0
095             */
096            @Deprecated
097            @Override
098            public String encodeRedirectUrl(String url) {
099                    return null;
100            }
101    
102            @Override
103            public String encodeRedirectURL(String url) {
104                    return null;
105            }
106    
107            /**
108             * @deprecated As of 7.0.0
109             */
110            @Deprecated
111            @Override
112            public String encodeUrl(String url) {
113                    return _portletResponse.encodeURL(url);
114            }
115    
116            @Override
117            public String encodeURL(String url) {
118                    return _portletResponse.encodeURL(url);
119            }
120    
121            @Override
122            public void flushBuffer() throws IOException {
123                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
124                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
125    
126                            MimeResponse mimeResponse = _getMimeResponse();
127    
128                            mimeResponse.flushBuffer();
129                    }
130            }
131    
132            @Override
133            public int getBufferSize() {
134                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
135                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
136    
137                            MimeResponse mimeResponse = _getMimeResponse();
138    
139                            return mimeResponse.getBufferSize();
140                    }
141                    else {
142                            return 0;
143                    }
144            }
145    
146            @Override
147            public String getCharacterEncoding() {
148                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
149                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
150    
151                            MimeResponse mimeResponse = _getMimeResponse();
152    
153                            return mimeResponse.getCharacterEncoding();
154                    }
155                    else {
156                            return null;
157                    }
158            }
159    
160            @Override
161            public String getContentType() {
162                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
163                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
164    
165                            MimeResponse mimeResponse = _getMimeResponse();
166    
167                            return mimeResponse.getContentType();
168                    }
169                    else {
170                            return null;
171                    }
172            }
173    
174            @Override
175            public Locale getLocale() {
176                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
177                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
178    
179                            MimeResponse mimeResponse = _getMimeResponse();
180    
181                            return mimeResponse.getLocale();
182                    }
183                    else {
184                            return null;
185                    }
186            }
187    
188            @Override
189            public ServletOutputStream getOutputStream() throws IOException {
190                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
191                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
192    
193                            MimeResponse mimeResponse = _getMimeResponse();
194    
195                            OutputStream portletOutputStream =
196                                    mimeResponse.getPortletOutputStream();
197    
198                            ServletOutputStream servletOutputStream =
199                                    new ServletOutputStreamAdapter(portletOutputStream);
200    
201                            return servletOutputStream;
202                    }
203                    else {
204                            return new NullServletOutputStream();
205                    }
206            }
207    
208            @Override
209            public PrintWriter getWriter() throws IOException {
210                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
211                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
212    
213                            MimeResponse mimeResponse = _getMimeResponse();
214    
215                            return mimeResponse.getWriter();
216                    }
217                    else {
218                            return UnsyncPrintWriterPool.borrow(
219                                    new NullServletOutputStream(), getCharacterEncoding());
220                    }
221            }
222    
223            @Override
224            public boolean isCommitted() {
225                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
226                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
227    
228                            MimeResponse mimeResponse = _getMimeResponse();
229    
230                            return mimeResponse.isCommitted();
231                    }
232                    else if (!_include) {
233                            return false;
234                    }
235                    else {
236                            return true;
237                    }
238            }
239    
240            @Override
241            public void reset() {
242                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
243                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
244    
245                            MimeResponse mimeResponse = _getMimeResponse();
246    
247                            mimeResponse.reset();
248                    }
249            }
250    
251            @Override
252            public void resetBuffer() {
253                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
254                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
255    
256                            MimeResponse mimeResponse = _getMimeResponse();
257    
258                            mimeResponse.resetBuffer();
259                    }
260            }
261    
262            @Override
263            public void sendError(int status) {
264            }
265    
266            @Override
267            public void sendError(int status, String message) {
268            }
269    
270            @Override
271            public void sendRedirect(String location) throws IOException {
272                    if (!_include) {
273                            if (_lifecycle.equals(PortletRequest.ACTION_PHASE)) {
274                                    ActionResponse actionResponse = _getActionResponse();
275    
276                                    actionResponse.sendRedirect(location);
277                            }
278                    }
279            }
280    
281            @Override
282            public void setBufferSize(int bufferSize) {
283                    if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
284                            _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
285    
286                            MimeResponse mimeResponse = _getMimeResponse();
287    
288                            mimeResponse.setBufferSize(bufferSize);
289                    }
290            }
291    
292            @Override
293            public void setCharacterEncoding(String characterEncoding) {
294                    if (!_include) {
295                            if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
296                                    ResourceResponse resourceResponse = _getResourceResponse();
297    
298                                    resourceResponse.setCharacterEncoding(characterEncoding);
299                            }
300                    }
301            }
302    
303            @Override
304            public void setContentLength(int contentLength) {
305                    if (!_include) {
306                            if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
307                                    ResourceResponse resourceResponse = _getResourceResponse();
308    
309                                    resourceResponse.setContentLength(contentLength);
310                            }
311                    }
312            }
313    
314            @Override
315            public void setContentType(String contentType) {
316                    if (!_include) {
317                            if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
318                                    _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
319    
320                                    MimeResponse mimeResponse = _getMimeResponse();
321    
322                                    mimeResponse.setContentType(contentType);
323                            }
324                    }
325            }
326    
327            @Override
328            public void setDateHeader(String name, long date) {
329                    setHeader(name, String.valueOf(date));
330            }
331    
332            @Override
333            public void setHeader(String name, String value) {
334                    if (!_include) {
335                            if (_lifecycle.equals(PortletRequest.RENDER_PHASE) ||
336                                    _lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
337    
338                                    MimeResponse mimeResponse = _getMimeResponse();
339    
340                                    mimeResponse.setProperty(name, value);
341                            }
342                    }
343            }
344    
345            @Override
346            public void setIntHeader(String name, int value) {
347                    setHeader(name, String.valueOf(value));
348            }
349    
350            @Override
351            public void setLocale(Locale locale) {
352                    if (!_include) {
353                            if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
354                                    ResourceResponse resourceResponse = _getResourceResponse();
355    
356                                    resourceResponse.setLocale(locale);
357                            }
358                    }
359            }
360    
361            @Override
362            public void setStatus(int status) {
363                    if (!_include) {
364                            if (_lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
365                                    ResourceResponse resourceResponse = _getResourceResponse();
366    
367                                    resourceResponse.setProperty(
368                                            ResourceResponse.HTTP_STATUS_CODE, String.valueOf(status));
369                            }
370                    }
371            }
372    
373            /**
374             * @deprecated As of 7.0.0
375             */
376            @Deprecated
377            @Override
378            public void setStatus(int status, String message) {
379                    setStatus(status);
380            }
381    
382            private ActionResponse _getActionResponse() {
383                    return (ActionResponse)_portletResponse;
384            }
385    
386            private MimeResponse _getMimeResponse() {
387                    return (MimeResponse)_portletResponse;
388            }
389    
390            private ResourceResponse _getResourceResponse() {
391                    return (ResourceResponse)_portletResponse;
392            }
393    
394            private final boolean _include;
395            private final String _lifecycle;
396            private final PortletResponse _portletResponse;
397    
398    }