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.taglib.servlet;
016    
017    import com.liferay.portal.kernel.io.WriterOutputStream;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.servlet.ServletOutputStreamAdapter;
021    import com.liferay.portal.kernel.util.UnsyncPrintWriterPool;
022    
023    import java.io.OutputStream;
024    import java.io.PrintWriter;
025    import java.io.Writer;
026    
027    import javax.servlet.ServletOutputStream;
028    import javax.servlet.http.HttpServletResponse;
029    import javax.servlet.http.HttpServletResponseWrapper;
030    import javax.servlet.jsp.PageContext;
031    
032    /**
033     * @author Shuyang Zhou
034     */
035    public class PipingServletResponse extends HttpServletResponseWrapper {
036    
037            public PipingServletResponse(
038                    HttpServletResponse response, OutputStream outputStream) {
039    
040                    super(response);
041    
042                    if (outputStream == null) {
043                            throw new NullPointerException("Output stream is null");
044                    }
045    
046                    _servletOutputStream = new ServletOutputStreamAdapter(outputStream);
047            }
048    
049            public PipingServletResponse(
050                    HttpServletResponse response, PrintWriter printWriter) {
051    
052                    super(response);
053    
054                    if (printWriter == null) {
055                            throw new NullPointerException("Print writer is null");
056                    }
057    
058                    _printWriter = printWriter;
059            }
060    
061            public PipingServletResponse(
062                    HttpServletResponse response, ServletOutputStream servletOutputStream) {
063    
064                    super(response);
065    
066                    if (servletOutputStream == null) {
067                            throw new NullPointerException("Servlet output stream is null");
068                    }
069    
070                    _servletOutputStream = servletOutputStream;
071            }
072    
073            public PipingServletResponse(HttpServletResponse response, Writer writer) {
074                    super(response);
075    
076                    if (writer == null) {
077                            throw new NullPointerException("Writer is null");
078                    }
079    
080                    _printWriter = UnsyncPrintWriterPool.borrow(writer);
081            }
082    
083            public PipingServletResponse(PageContext pageContext) {
084                    this(
085                            (HttpServletResponse)pageContext.getResponse(),
086                            pageContext.getOut());
087            }
088    
089            @Override
090            public ServletOutputStream getOutputStream() {
091                    if (_servletOutputStream == null) {
092                            if (_log.isDebugEnabled()) {
093                                    _log.debug(
094                                            "Getting an output stream when a writer is available is " +
095                                                    "not recommended because it is slow");
096                            }
097    
098                            _servletOutputStream = new ServletOutputStreamAdapter(
099                                    new WriterOutputStream(
100                                            _printWriter, getCharacterEncoding(), getBufferSize(),
101                                            true));
102                    }
103    
104                    return _servletOutputStream;
105            }
106    
107            @Override
108            public PrintWriter getWriter() {
109                    if (_printWriter == null) {
110                            if (_log.isDebugEnabled()) {
111                                    _log.debug(
112                                            "Getting a writer when an output stream is available is " +
113                                                    "not recommended because it is slow");
114                            }
115    
116                            _printWriter = UnsyncPrintWriterPool.borrow(
117                                    _servletOutputStream, getCharacterEncoding());
118                    }
119    
120                    return _printWriter;
121            }
122    
123            private static final Log _log = LogFactoryUtil.getLog(
124                    PipingServletResponse.class);
125    
126            private PrintWriter _printWriter;
127            private ServletOutputStream _servletOutputStream;
128    
129    }