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<ResultItem> 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<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();
|
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<NameValuePair> values = entityReader.getValueList(value);
|
|
writer.beginObject(name);
|
|
for (NameValuePair nameValuePair: values) {
|
writeData(writer, nameValuePair.getName(), nameValuePair.getValue(), needEncode);
|
}
|
|
writer.endObject();
|
}
|
}
|
|
}
|