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 HttpEnvelopWriter { public final static String Code_URL = "url"; protected static Logger logger; protected static HttpEnvelopWriter instance; protected static EntityReaderContainer objectReaderContainer; static { logger = Logger.getLogger(HttpEnvelopWriter.class); objectReaderContainer = EntityReaderContainer.getInstance(); } public static synchronized HttpEnvelopWriter getInstance() { if (instance == null) { instance = new HttpEnvelopWriter(); } return instance; } private HttpEnvelopWriter() { } public StringBuilder writeToString(ResultPool result) { StringBuilderJSONWriter writer = new StringBuilderJSONWriter(); writer.beginObject(); try { if (result.isNeedReturnCode()) { //1. code ResultCode code = result.getCode(); writer.write("code", code.getValue()); writer.write("message", code.getMsg()); //2. result writer.beginObject(result.getRootName()); } List itemList = result.getItemList(); writeResultItems(writer, itemList); writer.endObject(); } catch (Exception e) { } finally { if (result.isNeedReturnCode()) { writer.endObject(); } } return writer.getContent(); } private void writeResultItems(IJSONWriter writer, 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(); boolean needEncode = item.isNeedEncode(); if (name == null) { continue; } writeData(writer, name, value, needEncode); } } 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(IJSONWriter writer, String name, Object value, boolean needEncode) throws Exception { if (value == null) { writer.writeNull(name); return; } //1. entity、entitySet、entityTree、page ... if (value instanceof IJsonProvider) { writeJsonProvider(writer, name, (IJsonProvider) value); } //2. collection else if (value instanceof Collection) { writeCollection(writer, name, (Collection) value, needEncode); } //3. iterator else if (value instanceof Iterable) { writeIterable(writer, name, (Iterable) value, needEncode); } //4. map else if (value instanceof Map) { writeMap(writer, name, (Map)value, needEncode); } //5. string、integer、double、decimal、boolean、date、object ... else { writeObject(writer, name, value, needEncode); } } private void writeMap(IJSONWriter writer, String name, Map value, boolean needEncode) 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(writer, key.toString(), obj, needEncode); } writer.endObject(); } private void writeJsonProvider(IJSONWriter writer, 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(IJSONWriter writer, String name, Collection collection, boolean needEncode) 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(writer, null, obj, needEncode); } writer.endArray(); } private void writeIterable(IJSONWriter writer, String name, Iterable iterable, boolean needEncode) 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(writer, null, obj, needEncode); } writer.endArray(); } private void writeObject(IJSONWriter writer, String name, Object value, boolean needEncode) throws Exception { //1. null data if (value == null) { writer.writeNull(name); return; } if (value instanceof String) { writer.write(name, (String) value, needEncode); } 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(), false); } else if (value instanceof Long) { writer.write(name, value.toString(), false); } 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(writer, nameValuePair.getName(), nameValuePair.getValue(), needEncode); } writer.endObject(); } } }