package com.revolsys.util;
import java.io.UnsupportedEncodingException;
public class Base64EncodingWriter extends java.io.PrintWriter {
private byte[] buffer;
private final int bufferLength;
final String charset = "UTF-8";
private int position;
public Base64EncodingWriter(final java.io.Writer out) {
super(out);
this.bufferLength = 3;
this.buffer = new byte[this.bufferLength];
this.position = 0;
}
@Override
public void close() {
flush();
super.close();
this.buffer = null;
}
@Override
public void flush() {
if (this.position > 0) {
writeBuffer();
this.position = 0;
}
}
public void print(final byte[] bytes) {
for (final byte b : bytes) {
write(b);
}
}
public void write(final byte b) {
this.buffer[this.position++] = b;
if (this.position >= this.bufferLength) {
writeBuffer();
this.position = 0;
}
}
@Override
public void write(final char[] characters, final int off, final int len) {
try {
final byte[] bytes = String.valueOf(characters).getBytes(this.charset);
for (int i = 0; i < len; i++) {
write(bytes[off + i]);
}
} catch (final UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
@Override
public void write(final int character) {
try {
final byte[] bytes = String.valueOf(character).getBytes(this.charset);
print(bytes);
} catch (final UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
private void writeBuffer() {
final int inBuff = this.buffer[0] << 24 >>> 8 | this.buffer[1] << 24 >>> 16
| this.buffer[2] << 24 >>> 24;
write(Base64Constants.URL_SAFE_ALPHABET[inBuff >>> 18]);
write(Base64Constants.URL_SAFE_ALPHABET[inBuff >>> 12 & 0x3f]);
write(Base64Constants.URL_SAFE_ALPHABET[inBuff >>> 6 & 0x3f]);
write(Base64Constants.URL_SAFE_ALPHABET[inBuff & 0x3f]);
}
}