001
014
015 package com.liferay.portal.kernel.servlet;
016
017 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;
018 import com.liferay.portal.kernel.util.UnsyncPrintWriterPool;
019
020 import java.io.PrintWriter;
021
022 import java.nio.ByteBuffer;
023
024 import javax.servlet.ServletOutputStream;
025 import javax.servlet.http.HttpServletResponse;
026
027
030 public class ByteBufferServletResponse extends HeaderCacheServletResponse {
031
032 public ByteBufferServletResponse(HttpServletResponse response) {
033 super(response);
034 }
035
036 @Override
037 public int getBufferSize() {
038 if (_byteBuffer != null) {
039 return _byteBuffer.remaining();
040 }
041 else if (_unsyncByteArrayOutputStream != null) {
042 return _unsyncByteArrayOutputStream.size();
043 }
044 else {
045 return 0;
046 }
047 }
048
049 public ByteBuffer getByteBuffer() {
050 if (_byteBuffer != null) {
051 return _byteBuffer;
052 }
053 else if (_unsyncByteArrayOutputStream != null) {
054 return _unsyncByteArrayOutputStream.unsafeGetByteBuffer();
055 }
056 else {
057 return ByteBuffer.wrap(new byte[0]);
058 }
059 }
060
061 @Override
062 public ServletOutputStream getOutputStream() {
063 if (_printWriter != null) {
064 throw new IllegalStateException(
065 "Cannot obtain OutputStream because Writer is already in use");
066 }
067
068 if (_servletOutputStream == null) {
069 _unsyncByteArrayOutputStream = new UnsyncByteArrayOutputStream();
070 _servletOutputStream = new PipingServletOutputStream(
071 _unsyncByteArrayOutputStream);
072 }
073
074 return _servletOutputStream;
075 }
076
077 @Override
078 public PrintWriter getWriter() {
079 if (_printWriter != null) {
080 return _printWriter;
081 }
082
083 if (_servletOutputStream != null) {
084 throw new IllegalStateException(
085 "Cannot obtain Writer because OutputStream is already in use");
086 }
087
088 _unsyncByteArrayOutputStream = new UnsyncByteArrayOutputStream();
089 _servletOutputStream = new PipingServletOutputStream(
090 _unsyncByteArrayOutputStream);
091 _printWriter = UnsyncPrintWriterPool.borrow(
092 _unsyncByteArrayOutputStream);
093
094 return _printWriter;
095 }
096
097 public void setByteBuffer(ByteBuffer byteBuffer) {
098 _byteBuffer = byteBuffer;
099 }
100
101 private ByteBuffer _byteBuffer;
102 private PrintWriter _printWriter;
103 private ServletOutputStream _servletOutputStream;
104 private UnsyncByteArrayOutputStream _unsyncByteArrayOutputStream;
105
106 }