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 notEmpty; static { logger = LogManager.getLogger(EnvelopWriter.class); } public EnvelopWriter(HttpServletResponse response) throws IOException { this.response = response; notEmpty = new Stack(); } 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 attachments = letterWriter.getItemList(); writeResultItems(attachments); } //3. write item list else { writer.beginObject("data"); List 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 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 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); } }