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 PipingServletOutputStream(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            public PipingServletResponse(
089                    PageContext pageContext, boolean trimNewLines) {
090    
091                    super((HttpServletResponse)pageContext.getResponse());
092    
093                    if (trimNewLines && (pageContext instanceof PageContextWrapper)) {
094                            PageContextWrapper pageContextWrapper =
095                                    (PageContextWrapper)pageContext;
096    
097                            PageContext wrappedPageContext =
098                                    pageContextWrapper.getWrappedPageContext();
099    
100                            _printWriter = UnsyncPrintWriterPool.borrow(
101                                    new TrimNewLinesJspWriter(wrappedPageContext.getOut()));
102                    }
103                    else {
104                            _printWriter = UnsyncPrintWriterPool.borrow(pageContext.getOut());
105                    }
106            }
107    
108            @Override
109            public ServletOutputStream getOutputStream() {
110                    if (_servletOutputStream == null) {
111                            if (_log.isDebugEnabled()) {
112                                    _log.debug(
113                                            "Getting an output stream when a writer is available is " +
114                                                    "not recommended because it is slow");
115                            }
116    
117                            _servletOutputStream = new PipingServletOutputStream(
118                                    new WriterOutputStream(
119                                            _printWriter, getCharacterEncoding(), true));
120                    }
121    
122                    return _servletOutputStream;
123            }
124    
125            @Override
126            public PrintWriter getWriter() {
127                    if (_printWriter == null) {
128                            if (_log.isDebugEnabled()) {
129                                    _log.debug(
130                                            "Getting a writer when an output stream is available is " +
131                                                    "not recommended because it is slow");
132                            }
133    
134                            _printWriter = UnsyncPrintWriterPool.borrow(_servletOutputStream);
135                    }
136    
137                    return _printWriter;
138            }
139    
140            private static Log _log = LogFactoryUtil.getLog(
141                    PipingServletResponse.class);
142    
143            private PrintWriter _printWriter;
144            private ServletOutputStream _servletOutputStream;
145    
146    }