package com.revolsys.record.io.format.json; import java.io.IOException; import java.io.Writer; import com.revolsys.io.FileUtil; public class JsonStringEncodingWriter extends Writer { private Writer out; public JsonStringEncodingWriter(final Writer out) { this.out = out; } @Override public void close() { FileUtil.closeSilent(this.out); this.out = null; } @Override public void flush() { try { final Writer out = this.out; if (out != null) { out.flush(); } } catch (final IOException e) { } } @Override public void write(final char[] chars) throws IOException { final int length = chars.length; write(chars, 0, length); } @Override public void write(final char[] chars, int startIndex, final int length) throws IOException { final Writer out = this.out; int count = 0; final int endIndex = startIndex + length; for (int i = 0; i < endIndex; i++) { final char c = chars[i]; switch (c) { case '\b': out.write(chars, startIndex, count); out.write('\\'); out.write('b'); startIndex = i + 1; count = 0; break; case '\t': out.write(chars, startIndex, count); out.write('\\'); out.write('t'); startIndex = i + 1; count = 0; break; case '\n': out.write(chars, startIndex, count); out.write('\\'); out.write('n'); startIndex = i + 1; count = 0; break; case '\f': out.write(chars, startIndex, count); out.write('\\'); out.write('f'); startIndex = i + 1; count = 0; break; case '\r': out.write(chars, startIndex, count); out.write('\\'); out.write('r'); startIndex = i + 1; count = 0; break; case '"': out.write(chars, startIndex, count); out.write('\\'); out.write('"'); startIndex = i + 1; count = 0; break; case '\\': out.write(chars, startIndex, count); out.write('\\'); out.write('\\'); startIndex = i + 1; count = 0; break; default: if (count == 1024) { out.write(chars, startIndex, count); startIndex = i; count = 0; } count++; break; } } out.write(chars, startIndex, count); } @Override public void write(final int c) throws IOException { final Writer out = this.out; switch (c) { case '\b': out.write('\\'); out.write('b'); break; case '\t': out.write('\\'); out.write('t'); break; case '\n': out.write('\\'); out.write('n'); break; case '\f': out.write('\\'); out.write('f'); break; case '\r': out.write('\\'); out.write('r'); break; case '"': out.write('\\'); out.write('"'); break; case '\\': out.write('\\'); out.write('\\'); break; default: out.write(c); break; } } @Override public void write(final String string) throws IOException { final int length = string.length(); write(string, 0, length); } @Override public void write(final String string, int startIndex, final int length) throws IOException { final Writer out = this.out; int count = 0; final int endIndex = startIndex + length; for (int i = 0; i < endIndex; i++) { final char c = string.charAt(i); switch (c) { case '\b': out.write(string, startIndex, count); out.write('\\'); out.write('b'); startIndex = i + 1; count = 0; break; case '\t': out.write(string, startIndex, count); out.write('\\'); out.write('t'); startIndex = i + 1; count = 0; break; case '\n': out.write(string, startIndex, count); out.write('\\'); out.write('n'); startIndex = i + 1; count = 0; break; case '\f': out.write(string, startIndex, count); out.write('\\'); out.write('f'); startIndex = i + 1; count = 0; break; case '\r': out.write(string, startIndex, count); out.write('\\'); out.write('r'); startIndex = i + 1; count = 0; break; case '"': out.write(string, startIndex, count); out.write('\\'); out.write('"'); startIndex = i + 1; count = 0; break; case '\\': out.write(string, startIndex, count); out.write('\\'); out.write('\\'); startIndex = i + 1; count = 0; break; default: if (count == 1024) { out.write(string, startIndex, count); startIndex = i; count = 0; } count++; break; } } out.write(string, startIndex, count); } }