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