/* * Copyright 2005 Joe Walker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.directwebremoting.util; import java.io.IOException; import java.io.Writer; import javax.servlet.ServletOutputStream; /** * This is not the evil hack you are looking for. * @author Joe Walker [joe at getahead dot ltd dot uk] */ public final class WriterOutputStream extends ServletOutputStream { /** * ctor using platform default encoding * @param writer The stream that we proxy to */ public WriterOutputStream(Writer writer) { this.writer = writer; } /** * ctor that allows us to specify how strings are created * @param writer The stream that we proxy to * @param encoding The string encoding of data that we write to the stream */ public WriterOutputStream(Writer writer, String encoding) { this.writer = writer; this.encoding = encoding; } /* (non-Javadoc) * @see javax.servlet.ServletOutputStream#print(java.lang.String) */ @Override public void print(String s) throws IOException { writer.write(s); } /* (non-Javadoc) * @see java.io.OutputStream#write(byte[]) */ @Override public void write(byte[] ba) throws IOException { if (encoding == null) { writer.write(new String(ba)); } else { writer.write(new String(ba, encoding)); } } /* (non-Javadoc) * @see java.io.OutputStream#write(byte[], int, int) */ @Override public void write(byte[] ba, int off, int len) throws IOException { if (encoding == null) { writer.write(new String(ba, off, len)); } else { writer.write(new String(ba, off, len, encoding)); } } /* (non-Javadoc) * @see java.io.OutputStream#write(int) */ @Override public synchronized void write(int bite) throws IOException { buffer[0] = (byte) bite; write(buffer); } /* (non-Javadoc) * @see java.io.OutputStream#close() */ @Override public void close() throws IOException { if (writer != null) { writer.close(); writer = null; encoding = null; } } /* (non-Javadoc) * @see java.io.OutputStream#flush() */ @Override public void flush() throws IOException { writer.flush(); } /** * The destination of all our printing */ private Writer writer; /** * What string encoding should we use */ private String encoding = null; /** * Buffer for write(int) */ private byte[] buffer = new byte[1]; }