package org.fastcatsearch.util;
import org.json.JSONException;
import org.json.JSONWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.Writer;
public class JSONResponseWriter implements ResponseWriter {
protected static Logger logger = LoggerFactory.getLogger(JSONResponseWriter.class);
protected Writer w;
protected CustomJSONWriter writer;
protected boolean beautify;
protected boolean isKeyLowercase;
/*
* “ 와 같은 특수문자를 \u201c 와 같이 유니코드로 변환하는지 여부.
* 디폴트로는 true
* 검색 client에서 검색결과를 매번 unicode를 unescape하는 것이 번거롭다면, JSONResponseWriter 생성시 noUnicode=true 옵션을 사용하여 유니코드 변환을 막는다.
* */
protected boolean escapeToUnicode;
public JSONResponseWriter(Writer w) {
this(w, false, false, false);
}
public JSONResponseWriter(Writer w, boolean beautify, boolean isKeyLowercase, boolean noUnicode) {
this.w = w;
writer = new CustomJSONWriter(w);
this.beautify = beautify;
this.isKeyLowercase = isKeyLowercase;
this.escapeToUnicode = !noUnicode;
}
public boolean isBeautify() {
return beautify;
}
@Override
public ResponseWriter object() throws ResultWriterException {
try {
writer.object();
return this;
} catch (JSONException e) {
throw new ResultWriterException(e);
}
}
@Override
public ResponseWriter endObject() throws ResultWriterException {
try {
writer.endObject();
return this;
} catch (JSONException e) {
throw new ResultWriterException(e);
}
}
@Override
public ResponseWriter array() throws ResultWriterException {
return array(null);
}
@Override
public ResponseWriter array(String arrayName) throws ResultWriterException {
try {
writer.array();
return this;
} catch (JSONException e) {
throw new ResultWriterException(e);
}
}
@Override
public ResponseWriter endArray() throws ResultWriterException {
try {
writer.endArray();
return this;
} catch (JSONException e) {
throw new ResultWriterException(e);
}
}
@Override
public ResponseWriter key(String key) throws ResultWriterException {
try {
if(isKeyLowercase) {
key = key.toLowerCase();
}
writer.key(key);
return this;
} catch (JSONException e) {
throw new ResultWriterException(e);
}
}
@Override
public ResponseWriter value(Object obj) throws ResultWriterException {
try {
if(obj == null){
writer.value("");
}else{
writer.value(obj, escapeToUnicode);
}
return this;
} catch (JSONException e) {
throw new ResultWriterException(e);
}
}
@Override
public void done() {
if(w != null){
try {
w.flush();
} catch (IOException e) {
logger.error("close error", e);
}
}
}
// public String toString() {
// if(beautify) {
// try {
// JSONObject obj = new JSONObject(writer.toString());
// return obj.toString(2);
// } catch (JSONException e) {
// }
// } else {
// return writer.toString();
// }
// return null;
// }
}