package net.minidev.json.writer;
import java.io.IOException;
import net.minidev.json.JSONStyle;
import net.minidev.json.JSONValue;
public class CompessorMapper extends JsonReaderI<CompessorMapper> {
private Appendable out;
private JSONStyle compression;
private Boolean _isObj;
private boolean needSep = false;
private boolean isOpen = false;
private boolean isClosed = false;
private boolean isArray() {
return _isObj == Boolean.FALSE;
}
private boolean isObject() {
return _isObj == Boolean.TRUE;
}
private boolean isCompressor(Object obj) {
return obj instanceof CompessorMapper;
}
public CompessorMapper(JsonReader base, Appendable out, JSONStyle compression) {
this(base, out, compression, null);
}
public CompessorMapper(JsonReader base, Appendable out, JSONStyle compression, Boolean isObj) {
super(base);
this.out = out;
this.compression = compression;
this._isObj = isObj;
}
@Override
public JsonReaderI<?> startObject(String key) throws IOException {
open(this);
startKey(key);
CompessorMapper r = new CompessorMapper(base, out, compression, true);
open(r);
return r;
}
@Override
public JsonReaderI<?> startArray(String key) throws IOException {
open(this);
startKey(key);
CompessorMapper r = new CompessorMapper(base, out, compression, false);
open(r);
return r;
}
private void startKey(String key) throws IOException {
addComma();
if (isArray())
return;
if (!compression.mustProtectKey(key))
out.append(key);
else {
out.append('"');
JSONValue.escape(key, out, compression);
out.append('"');
}
out.append(':');
}
@Override
public void setValue(Object current, String key, Object value) throws IOException {
if (isCompressor(value)) {
addComma();
return;
}
startKey(key);
writeValue(value);
}
@Override
public void addValue(Object current, Object value) throws IOException {
addComma();
writeValue(value);
}
private void addComma() throws IOException {
if (needSep) {
out.append(',');
} else {
needSep = true;
}
}
private void writeValue(Object value) throws IOException {
if (value instanceof String) {
compression.writeString(out, (String) value);
} else {
if (isCompressor(value)) {
close(value);
} else {
JSONValue.writeJSONString(value, out, compression);
}
}
}
@Override
public Object createObject() {
this._isObj = true;
try {
open(this);
} catch (Exception e) {
}
return this;
}
@Override
public Object createArray() {
this._isObj = false;
try {
open(this);
} catch (Exception e) {
}
return this;
}
public CompessorMapper convert(Object current) {
try {
close(current);
return this;
} catch (Exception e) {
return this;
}
}
private void close(Object obj) throws IOException {
if (!isCompressor(obj))
return;
if (((CompessorMapper) obj).isClosed)
return;
((CompessorMapper) obj).isClosed = true;
if (((CompessorMapper) obj).isObject()) {
out.append('}');
needSep = true;
} else if (((CompessorMapper) obj).isArray()) {
out.append(']');
needSep = true;
}
}
private void open(Object obj) throws IOException {
if (!isCompressor(obj))
return;
if (((CompessorMapper) obj).isOpen)
return;
((CompessorMapper) obj).isOpen = true;
if (((CompessorMapper) obj).isObject()) {
out.append('{');
needSep = false;
} else if (((CompessorMapper) obj).isArray()) {
out.append('[');
needSep = false;
}
}
}