/*
* $Id$
*
* Copyright (C) 2003-2015 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.shell.proclet;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Formatter;
import java.util.Locale;
import org.jnode.util.ProxyStream;
import org.jnode.shell.io.NullOutputStream;
/**
* This class provides some infrastructure for PrintStream proxies.
*
* @author crawley@jnode.org
*/
public abstract class AbstractProxyPrintStream extends PrintStream implements
ProxyStream<PrintStream> {
/*
* Note: the implementation is mostly copied from PrintStream. Blame this on
* limitations of the afore-mentioned class's specification ...
*/
private static PrintStream nullStream;
private boolean error_occurred = false;
public AbstractProxyPrintStream() {
super(new NullOutputStream());
}
public boolean checkError() {
flush();
return error_occurred || effectiveOutput().checkError();
}
protected void setError() {
error_occurred = true;
}
protected void clearError() {
error_occurred = false;
}
protected abstract PrintStream effectiveOutput();
public void close() {
PrintStream eo = effectiveOutput();
eo.flush();
eo.close();
}
public void flush() {
effectiveOutput().flush();
}
protected synchronized void print(String str, boolean println) {
PrintStream eo = effectiveOutput();
writeChars(eo, str, 0, str.length());
if (println) {
eo.println();
}
flush();
}
protected synchronized void print(char[] chars, int pos, int len,
boolean println) {
PrintStream eo = effectiveOutput();
writeChars(eo, chars, pos, len);
if (println) {
eo.println();
}
flush();
}
protected void writeChars(PrintStream eo, char[] buf, int offset, int count) {
// This is inefficient, but it ensures that we use the encoding
// scheme of the effective stream
eo.print(new String(buf, offset, count));
}
protected void writeChars(PrintStream eo, String str, int offset, int count) {
// This is inefficient, but it ensures that we use the encoding
// scheme of the effective stream
eo.print(str.substring(offset, offset + count));
}
public void print(boolean bool) {
print(String.valueOf(bool), false);
}
public void print(int inum) {
print(String.valueOf(inum), false);
}
public void print(long lnum) {
print(String.valueOf(lnum), false);
}
public void print(float fnum) {
print(String.valueOf(fnum), false);
}
public void print(double dnum) {
print(String.valueOf(dnum), false);
}
public void print(Object obj) {
print(obj == null ? "null" : obj.toString(), false);
}
public void print(String str) {
print(str == null ? "null" : str, false);
}
public synchronized void print(char ch) {
print(new char[] {ch}, 0, 1, false);
}
public void print(char[] charArray) {
print(charArray, 0, charArray.length, false);
}
public void println() {
effectiveOutput().println();
}
public void println(boolean bool) {
print(String.valueOf(bool), true);
}
public void println(int inum) {
print(String.valueOf(inum), true);
}
public void println(long lnum) {
print(String.valueOf(lnum), true);
}
public void println(float fnum) {
print(String.valueOf(fnum), true);
}
public void println(double dnum) {
print(String.valueOf(dnum), true);
}
public void println(Object obj) {
print(obj == null ? "null" : obj.toString(), true);
}
public void println(String str) {
print(str == null ? "null" : str, true);
}
public synchronized void println(char ch) {
print(new char[] {ch}, 0, 1, true);
}
public void println(char[] charArray) {
print(charArray, 0, charArray.length, true);
}
public void write(int oneByte) {
effectiveOutput().write(oneByte & 0xff);
if (oneByte == '\n') {
flush();
}
}
public void write(byte[] buffer, int offset, int len) {
effectiveOutput().write(buffer, offset, len);
flush();
}
public PrintStream append(char c) {
print(c);
return this;
}
public PrintStream append(CharSequence cs) {
print(cs == null ? "null" : cs.toString());
return this;
}
public PrintStream append(CharSequence cs, int start, int end) {
print(cs == null ? "null" : cs.subSequence(start, end).toString());
return this;
}
public PrintStream printf(String format, Object... args) {
return format(format, args);
}
public PrintStream printf(Locale locale, String format, Object... args) {
return format(locale, format, args);
}
public PrintStream format(String format, Object... args) {
return format(Locale.getDefault(), format, args);
}
public PrintStream format(Locale locale, String format, Object... args) {
Formatter f = new Formatter(this, locale);
f.format(format, args);
return this;
}
/**
* Return a print stream that will "deep six" any output.
*/
protected static synchronized PrintStream getNullPrintStream() {
if (nullStream == null) {
nullStream = new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
}
}, false);
}
return nullStream;
}
}