blob: a7c5f5f17b770d2eb1dd338443d3108333916a65 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2016 Raymond Augé and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Raymond Augé <raymond.auge@liferay.com> - Bug 436698
******************************************************************************/
package org.eclipse.equinox.http.servlet.internal.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* @author Raymond Augé
*/
public class HttpServletResponseWrapperImpl extends HttpServletResponseWrapper {
public HttpServletResponseWrapperImpl(HttpServletResponse response) {
super(response);
}
@Override
public void sendError(int status) {
this.status = status;
}
@Override
public void sendError(int status, String message) {
this.status = status;
this.message = message;
}
public String getMessage() {
return message;
}
@Override
public int getStatus() {
return status;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
if (outputStream == null) {
outputStream = new InternalOutputStream(super.getOutputStream());
}
return outputStream;
}
@Override
public PrintWriter getWriter() throws IOException {
if (writer == null) {
writer = new InternalWriter(super.getWriter());
}
return writer;
}
public boolean isCompleted() {
return completed;
}
public void setCompleted(boolean completed) {
this.completed = completed;
}
public static HttpServletResponseWrapperImpl findHttpRuntimeResponse(
HttpServletResponse response) {
while (response instanceof HttpServletResponseWrapper) {
if (response instanceof HttpServletResponseWrapperImpl) {
return (HttpServletResponseWrapperImpl)response;
}
response = (HttpServletResponse)((HttpServletResponseWrapper)response).getResponse();
}
return null;
}
private int status = -1;
private String message;
private boolean completed;
private InternalOutputStream outputStream;
private InternalWriter writer;
private class InternalOutputStream extends ServletOutputStream {
public InternalOutputStream(ServletOutputStream originalOutputStream) {
this.originalOutputStream = originalOutputStream;
}
@Override
public void close() throws IOException {
originalOutputStream.close();
}
@Override
public void flush() throws IOException {
originalOutputStream.flush();
}
@Override
public boolean isReady() {
return originalOutputStream.isReady();
}
@Override
public void setWriteListener(WriteListener writeListener) {
originalOutputStream.setWriteListener(writeListener);
}
@Override
public void write(int b) throws IOException {
if (isCompleted()) {
return;
}
originalOutputStream.write(b);
}
private final ServletOutputStream originalOutputStream;
}
private class InternalWriter extends PrintWriter {
public InternalWriter(PrintWriter originalWriter) {
super(originalWriter);
}
@Override
public PrintWriter format(Locale l, String format, Object... args) {
if (!isCompleted()) {
super.format(l, format, args);
}
return this;
}
@Override
public PrintWriter format(String format, Object... args) {
if (!isCompleted()) {
super.format(format, args);
}
return this;
}
@Override
public void println() {
if (isCompleted()) {
return;
}
super.println();
}
@Override
public void write(int c) {
if (isCompleted()) {
return;
}
super.write(c);
}
@Override
public void write(char[] buf, int off, int len) {
if (isCompleted()) {
return;
}
super.write(buf, off, len);
}
@Override
public void write(char[] buf) {
if (isCompleted()) {
return;
}
super.write(buf);
}
@Override
public void write(String s, int off, int len) {
if (isCompleted()) {
return;
}
super.write(s, off, len);
}
@Override
public void write(String s) {
if (isCompleted()) {
return;
}
super.write(s);
}
}
}