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