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 itemList = result.getItemList(); writeResultItems(itemList); } finally { writer.endObject(); } return writer.toString(); } private void writeResultItems(List 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 values = entityReader.getValueList(value); writer.beginObject(name); for (NameValuePair nameValuePair: values) { writeData(nameValuePair.getName(), nameValuePair.getValue()); } writer.endObject(); } } }