001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.kernel.servlet;
016    
017    import com.liferay.portal.kernel.io.OutputStreamWriter;
018    import com.liferay.portal.kernel.io.WriterOutputStream;
019    import com.liferay.portal.kernel.io.unsync.UnsyncPrintWriter;
020    import com.liferay.portal.kernel.log.Log;
021    import com.liferay.portal.kernel.log.LogFactoryUtil;
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 PipingServletOutputStream(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 = new UnsyncPrintWriter(writer, true);
081            }
082    
083            public PipingServletResponse(PageContext pageContext) {
084                    this(
085                            (HttpServletResponse)pageContext.getResponse(),
086                            pageContext.getOut());
087            }
088    
089            public PipingServletResponse(
090                    PageContext pageContext, boolean trimNewLines) {
091    
092                    super((HttpServletResponse)pageContext.getResponse());
093    
094                    if (trimNewLines && (pageContext instanceof PageContextWrapper)) {
095                            PageContextWrapper pageContextWrapper =
096                                    (PageContextWrapper)pageContext;
097    
098                            PageContext wrappedPageContext =
099                                    pageContextWrapper.getWrappedPageContext();
100    
101                            _printWriter = new UnsyncPrintWriter(
102                                    new TrimNewLinesJspWriter(wrappedPageContext.getOut()),
103                                    true);
104                    }
105                    else {
106                            _printWriter = new UnsyncPrintWriter(pageContext.getOut(), true);
107                    }
108            }
109    
110            public ServletOutputStream getOutputStream() {
111                    if (_servletOutputStream == null) {
112                            if (_log.isWarnEnabled()) {
113                                    _log.warn(
114                                            "Getting an output stream when a writer is available is " +
115                                                    "not recommended because it is slow");
116                            }
117    
118                            _servletOutputStream = new PipingServletOutputStream(
119                                    new WriterOutputStream(
120                                            _printWriter, getCharacterEncoding(), true));
121                    }
122    
123                    return  _servletOutputStream;
124            }
125    
126            public PrintWriter getWriter() {
127                    if (_printWriter == null) {
128                            if (_log.isWarnEnabled()) {
129                                    _log.warn(
130                                            "Getting a writer when an output stream is available is " +
131                                                    "not recommended because it is slow");
132                            }
133    
134                            _printWriter = new UnsyncPrintWriter(
135                                    new OutputStreamWriter(_servletOutputStream));
136                    }
137    
138                    return _printWriter;
139            }
140    
141            private static Log _log = LogFactoryUtil.getLog(
142                    PipingServletResponse.class);
143    
144            private PrintWriter _printWriter;
145            private ServletOutputStream _servletOutputStream;
146    
147    }