package chat.server.call;
|
|
import java.math.BigDecimal;
|
import java.util.Collection;
|
import java.util.Date;
|
import java.util.Iterator;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Set;
|
|
import org.apache.log4j.Logger;
|
|
import chat.server.im.ResultPool;
|
import frame.object.dao.Page;
|
import frame.object.data.Entity;
|
import frame.object.data.EntitySet;
|
import frame.object.data.EntityTree;
|
import frame.object.reader.EntityReaderContainer;
|
import frame.object.reader.IEntityReader;
|
import frame.object.reader.NameValuePair;
|
|
|
public class CachedJSONWriter {
|
|
public final static String Code_URL = "url";
|
|
protected static Logger logger;
|
protected static EntityReaderContainer objectReaderContainer;
|
protected StringBuilderJSONWriter writer; // 响应字符流
|
|
static {
|
logger = Logger.getLogger(CachedJSONWriter.class);
|
objectReaderContainer = EntityReaderContainer.getInstance();
|
}
|
|
public CachedJSONWriter() {
|
writer = new StringBuilderJSONWriter();
|
}
|
|
public String create(ResultPool result) throws Exception {
|
writer.beginObject();
|
try {
|
//1. code
|
ResultCode code = result.getCode();
|
writer.write("code", code.getValue());
|
writer.write("message", code.getMsg());
|
|
//2. result
|
List<ResultItem> itemList = result.getItemList();
|
writeResultItems(itemList);
|
}
|
finally {
|
writer.endObject();
|
}
|
|
return writer.toString();
|
}
|
|
private void writeResultItems(List<ResultItem> itemList) throws Exception {
|
for (ResultItem item: itemList) {
|
String name = item.getName();
|
|
if (name == null) {
|
name = createValueName(item.getValue());
|
item.setName(name);
|
}
|
}
|
|
for (ResultItem item: itemList) {
|
String name = item.getName();
|
Object value = item.getValue();
|
|
if (name == null) {
|
continue;
|
}
|
|
writeData(name, value);
|
}
|
}
|
|
private String createValueName(Object value) {
|
if (value instanceof Entity) {
|
return IEnvelop.ResultCode_Entity;
|
}
|
else if (value instanceof EntityTree) {
|
return IEnvelop.ResultCode_EntityTree;
|
}
|
else if (value instanceof EntitySet) {
|
return IEnvelop.ResultCode_EntitySet;
|
}
|
else if (value instanceof Page) {
|
return IEnvelop.ResultCode_Page;
|
}
|
else if (value instanceof Collection) {
|
return IEnvelop.ResultCode_EntitySet;
|
}
|
else {
|
return "data";
|
}
|
}
|
|
private void writeData(String name, Object value) throws Exception {
|
if (value == null) {
|
writer.writeNull(name);
|
return;
|
}
|
|
//1. entity、entitySet、entityTree、page ...
|
if (value instanceof IJsonProvider) {
|
writeJsonProvider(name, (IJsonProvider) value);
|
}
|
//2. collection
|
else if (value instanceof Collection) {
|
writeCollection(name, (Collection<?>) value);
|
}
|
//3. iterator
|
else if (value instanceof Iterable<?>) {
|
writeIterable(name, (Iterable<?>) value);
|
}
|
//4. map
|
else if (value instanceof Map<?, ?>) {
|
writeMap(name, (Map<?, ?>)value);
|
}
|
//5. string、integer、double、decimal、boolean、date、object ...
|
else {
|
writeObject(name, value);
|
}
|
}
|
|
private void writeMap(String name, Map<?, ?> value) throws Exception {
|
//1. name
|
if (name != null) {
|
writer.writeName(name);
|
}
|
|
//2. null data
|
if (value == null) {
|
writer.writeNull();
|
return;
|
}
|
|
//3. collection data
|
writer.beginObject();
|
Set<?> keySet = value.keySet();
|
for (Object key : keySet) {
|
Object obj = value.get(key);
|
|
writeData(key.toString(), obj);
|
}
|
|
writer.endObject();
|
|
}
|
|
private void writeJsonProvider(String name, IJsonProvider jsonProvider) {
|
//1. name
|
if (name != null) {
|
writer.writeName(name);
|
}
|
|
//2. null entity
|
if (jsonProvider == null) {
|
writer.writeNull();
|
return;
|
}
|
|
//3. entity data
|
jsonProvider.writeJSONObject(writer);
|
}
|
|
private void writeCollection(String name, Collection<?> collection) throws Exception {
|
//1. name
|
if (name != null) {
|
writer.writeName(name);
|
}
|
|
//2. null data
|
if (collection == null) {
|
writer.writeNull();
|
return;
|
}
|
|
//3. collection data
|
writer.beginArray();
|
|
for (Object obj : collection) {
|
writeData(null, obj);
|
}
|
|
writer.endArray();
|
}
|
|
private void writeIterable(String name, Iterable<?> iterable) throws Exception {
|
//1. name
|
if (name != null) {
|
writer.writeName(name);
|
}
|
|
//2. null data
|
if (iterable == null) {
|
writer.writeNull();
|
return;
|
}
|
|
//3. collection data
|
writer.beginArray();
|
|
Iterator<?> iterator = iterable.iterator();
|
|
while(iterator.hasNext()) {
|
Object obj = iterator.next();
|
writeData(null, obj);
|
}
|
|
writer.endArray();
|
}
|
|
private void writeObject(String name, Object value) throws Exception {
|
//1. null data
|
if (value == null) {
|
writer.writeNull(name);
|
return;
|
}
|
|
if (value instanceof String) {
|
writer.write(name, (String) value);
|
}
|
else if (value instanceof Integer) {
|
writer.write(name, (Integer) value);
|
}
|
else if (value instanceof Double) {
|
writer.write(name, (Double) value);
|
}
|
else if (value instanceof BigDecimal) {
|
writer.write(name, (BigDecimal) value);
|
}
|
else if (value instanceof Date) {
|
writer.write(name, (Date) value);
|
}
|
else if (value instanceof Boolean) {
|
writer.write(name, (Boolean) value);
|
}
|
else if (value instanceof Enum) {
|
writer.write(name, value.toString());
|
}
|
else if (value instanceof IJsonProvider) {
|
writer.writeName(name);
|
IJsonProvider jsonAvailable = (IJsonProvider) value;
|
jsonAvailable.writeJSONObject(writer);
|
}
|
else {
|
IEntityReader entityReader = objectReaderContainer.getEntityReader(value.getClass());
|
|
if (value instanceof String[]) {
|
System.out.println(value);
|
}
|
List<NameValuePair> values = entityReader.getValueList(value);
|
|
writer.beginObject(name);
|
|
for (NameValuePair nameValuePair: values) {
|
writeData(nameValuePair.getName(), nameValuePair.getValue());
|
}
|
|
writer.endObject();
|
}
|
}
|
|
}
|