jtulach@65: package api; jtulach@65: jtulach@65: import java.io.IOException; jtulach@65: jtulach@65: /** Fixing the problem caused by mixing subclassing and delegation in jtulach@65: * the java.io.BufferedWriter jtulach@65: * jtulach@65: * @author Jaroslav Tulach jtulach@65: */ jtulach@68: // BEGIN: writer.final.2.0 jtulach@67: public final class Writer implements Appendable { jtulach@65: private final Impl impl; jtulach@66: private final ImplSeq seq; jtulach@65: jtulach@66: private Writer(Impl impl, ImplSeq seq) { jtulach@65: this.impl = impl; jtulach@66: this.seq = seq; jtulach@65: } jtulach@65: public final void write(int c) throws IOException { jtulach@66: if (impl != null) { jtulach@66: char[] arr = {(char) c}; jtulach@66: impl.write(arr, 0, 1); jtulach@66: } else { jtulach@66: seq.write(new CharSeq(c)); jtulach@66: } jtulach@65: } jtulach@65: jtulach@65: public final void write(char cbuf[]) throws IOException { jtulach@66: if (impl != null) { jtulach@66: impl.write(cbuf, 0, cbuf.length); jtulach@66: } else { jtulach@66: seq.write(new CharSeq(cbuf, 0, cbuf.length)); jtulach@66: } jtulach@65: } jtulach@154: public final void write(char cbuf[], int off, int len) jtulach@154: throws IOException { jtulach@66: if (impl != null) { jtulach@66: impl.write(cbuf, off, len); jtulach@66: } else { jtulach@66: seq.write(new CharSeq(cbuf, off, len)); jtulach@66: } jtulach@65: } jtulach@65: public final void write(String str) throws IOException { jtulach@66: if (impl != null) { jtulach@66: impl.write(str, 0, str.length()); jtulach@66: } else { jtulach@66: seq.write(str); jtulach@66: } jtulach@65: } jtulach@154: public final void write(String str, int off, int len) jtulach@154: throws IOException { jtulach@66: if (impl != null) { jtulach@66: impl.write(str, off, len); jtulach@66: } else { jtulach@66: seq.write(str.subSequence(off, off + len)); jtulach@66: } jtulach@65: } jtulach@65: jtulach@66: public final void flush() throws IOException { jtulach@66: if (impl != null) { jtulach@66: impl.flush(); jtulach@66: } else { jtulach@66: seq.flush(); jtulach@66: } jtulach@66: } jtulach@66: public final void close() throws IOException { jtulach@66: if (impl != null) { jtulach@66: impl.close(); jtulach@66: } else { jtulach@66: seq.flush(); jtulach@66: } jtulach@66: } jtulach@66: jtulach@67: jtulach@67: jtulach@67: public final Writer append(CharSequence csq) throws IOException { jtulach@67: if (impl != null) { jtulach@67: String s = csq == null ? "null" : csq.toString(); jtulach@67: impl.write(s, 0, s.length()); jtulach@67: } else { jtulach@67: seq.write(csq); jtulach@67: } jtulach@67: return this; jtulach@67: } jtulach@67: jtulach@154: public final Writer append(CharSequence csq, int start, int end) jtulach@154: throws IOException { jtulach@67: return append(csq.subSequence(start, end)); jtulach@67: } jtulach@67: jtulach@67: public final Writer append(char c) throws IOException { jtulach@67: write(c); jtulach@67: return this; jtulach@67: } jtulach@67: jtulach@66: public static Writer create(Impl impl) { jtulach@66: return new Writer(impl, null); jtulach@66: } jtulach@66: jtulach@210: public static Writer create(ImplSeq seq) { jtulach@210: return new Writer(null, seq); jtulach@66: } jtulach@66: jtulach@66: public static Writer create(final java.io.Writer w) { jtulach@67: return new Writer(null, new ImplSeq() { jtulach@67: public void write(CharSequence seq) throws IOException { jtulach@67: w.append(seq); jtulach@66: } jtulach@66: jtulach@66: public void close() throws IOException { jtulach@66: w.close(); jtulach@66: } jtulach@66: jtulach@66: public void flush() throws IOException { jtulach@66: w.flush(); jtulach@66: } jtulach@67: }); jtulach@66: } jtulach@66: jtulach@66: public static Writer createBuffered(final Writer out) { jtulach@67: return create(new SimpleBuffer(out)); jtulach@66: } jtulach@65: jtulach@65: jtulach@65: public static interface Impl { jtulach@66: public void close() throws IOException; jtulach@66: public void flush() throws IOException; jtulach@66: public void write(String str, int off, int len) throws IOException; jtulach@66: public void write(char[] arr, int off, int len) throws IOException; jtulach@66: } jtulach@66: public static interface ImplSeq { jtulach@66: public void close() throws IOException; jtulach@66: public void flush() throws IOException; jtulach@65: public void write(CharSequence seq) throws IOException; jtulach@65: } jtulach@65: } jtulach@68: // END: writer.final.2.0