package foundation.handler.envelop;
|
|
import java.io.IOException;
|
import java.io.OutputStream;
|
import java.io.PrintWriter;
|
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 java.util.Stack;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
import org.json.JSONObject;
|
|
import com.google.gson.JsonObject;
|
|
import foundation.handler.ExistsError;
|
import foundation.handler.MessageList;
|
import foundation.handler.ResultItem;
|
import foundation.handler.ResultPool;
|
import foundation.handler.Validation;
|
import foundation.json.IJSONProvider;
|
import foundation.json.JSONWriter;
|
|
public class EnvelopWriter {
|
|
public final static String Code_URL = "url";
|
|
protected static Logger logger;
|
private HttpServletResponse response;
|
protected JSONWriter writer; // 响应字符流
|
protected OutputStream outputStream; // 响应字节流
|
private Stack<Boolean> notEmpty;
|
|
static {
|
logger = LogManager.getLogger(EnvelopWriter.class);
|
}
|
|
public EnvelopWriter(HttpServletResponse response) throws IOException {
|
this.response = response;
|
notEmpty = new Stack<Boolean>();
|
}
|
|
public void replay(ResultPool result) throws Exception {
|
if (response.isCommitted()) {
|
return;
|
}
|
|
createJsonWriter();
|
|
writer.beginObject();
|
try {
|
//1. write success
|
writer.write(IEnvelop.ResultCode_Success, result.isSuccess());
|
|
//2. write validation
|
writeValidation(writer, result.getValidation());
|
|
//3. write message list
|
writeMessageList(writer, result.getMessageList());
|
|
//4. write message list
|
writeExistsErrors(writer, result.getExistsErrors());
|
|
//2. write letter
|
ILetterWriter letterWriter = result.getLetterWriter();
|
|
if (letterWriter != null) {
|
try {
|
letterWriter.write(writer);
|
} catch(Exception e) {
|
System.out.println(e.getMessage());
|
}
|
|
List<ResultItem> attachments = letterWriter.getItemList();
|
writeResultItems(attachments);
|
}
|
//3. write item list
|
else {
|
writer.beginObject("data");
|
List<ResultItem> itemList = result.getItemList();
|
writeResultItems(itemList);
|
writer.endObject();
|
}
|
}
|
finally {
|
writer.endObject();
|
}
|
}
|
|
private void writeValidation(JSONWriter writer, Validation validation) {
|
if (validation == null) {
|
writer.writeNull("validation");
|
return;
|
}
|
|
validation.writeJSON(writer);
|
}
|
|
private void writeMessageList(JSONWriter writer, MessageList messageList) {
|
if (messageList == null) {
|
writer.writeNull("messages");
|
return;
|
}
|
|
messageList.writeJSON(writer);
|
}
|
|
private void writeExistsErrors(JSONWriter writer, List<ExistsError> existsErrors) {
|
if (existsErrors == null) {
|
writer.writeNull("exists_errors");
|
return;
|
}
|
|
writer.beginArray("exists_errors");
|
|
for (ExistsError error: existsErrors) {
|
writer.beginObject();
|
writer.write("error_type", error.getErrorType());
|
writer.write("title", error.getTitle());
|
writer.write("errors", error.getErrorSet());
|
writer.endObject();
|
}
|
|
writer.endArray();
|
}
|
|
private void writeResultItems(List<ResultItem> itemList) throws Exception {
|
for (ResultItem item: itemList) {
|
String name = item.getName();
|
Object value = item.getValue();
|
writeData(name, value);
|
}
|
}
|
|
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);
|
}
|
else if (value instanceof IRawJson) {
|
JSONObject jsonObject = new JSONObject(value);
|
this.writer.writeJSON(name, jsonObject.toString());
|
}
|
else if (value instanceof JSONObject || value instanceof JsonObject) {
|
this.writer.writeJSON(name, value.toString());
|
}
|
//6. 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);
|
|
if (jsonProvider == null) {
|
writer.writeNull();
|
return;
|
}
|
}
|
|
//2. data
|
jsonProvider.writeJSON(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();
|
|
//何飞侠修改20210728
|
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 Long) {
|
writer.write(name, (Long) 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.writeJSON(writer);
|
}
|
}
|
|
public void flush() {
|
if (writer != null) {
|
try {
|
writer.flush();
|
writer.close();
|
}
|
catch (Exception e) {
|
logger.error(e);
|
}
|
}
|
|
if (outputStream != null) {
|
try {
|
outputStream.flush();
|
outputStream.close();
|
}
|
catch (Exception e) {
|
logger.error(e);
|
}
|
}
|
}
|
|
private void createJsonWriter() throws IOException {// 获取指向浏览器的字符输出流
|
response.setCharacterEncoding("UTF-8");
|
|
PrintWriter printerWriter = response.getWriter();
|
writer = new JSONWriter(printerWriter);
|
|
notEmpty.clear();
|
notEmpty.add(false);
|
}
|
|
|
}
|