package foundation.icall.callout;
|
|
import java.io.File;
|
import java.io.InputStream;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import foundation.dao.DataPackage;
|
import foundation.dao.DataSource;
|
import foundation.dao.JSONPackage;
|
import foundation.dao.JSONPackageBucket;
|
import foundation.dao.bizlogic.IJSONResponse;
|
import foundation.io.FileCenter;
|
import foundation.io.FileField;
|
import foundation.io.FileMeta;
|
import foundation.io.FileRepository;
|
import foundation.io.object.FileRecord;
|
import foundation.io.template.ResponseTemplate;
|
import foundation.json.IJSONProvider;
|
import foundation.json.IJSONWriter;
|
import foundation.json.JArrayReader;
|
import foundation.json.JObjectReader;
|
import foundation.json.JSONReader;
|
import foundation.json.JType;
|
import foundation.util.Util;
|
import okhttp3.MediaType;
|
import okhttp3.Response;
|
import okhttp3.ResponseBody;
|
|
public class JSONResponse implements IJSONResponse, IJSONProvider {
|
|
protected static Logger logger;
|
private JSONReader reader;
|
private DataPackage dataPackage;
|
private List<String> errors;
|
private String content;
|
private MediaType contentType;
|
private FileMeta fileMeta;
|
private int resultCode;
|
private Map<String, String> disposition;
|
private String instanceId;
|
|
static {
|
logger = LogManager.getLogger(JSONResponse.class);
|
}
|
|
public JSONResponse(Response response) {
|
errors = new ArrayList<String>();
|
|
if (response == null) {
|
errors.add("调用没有返回");
|
return;
|
}
|
System.out.println(response.code());
|
resultCode = response.code();
|
|
if (!response.isSuccessful()) {
|
errors.add("错误码: " + response.code());
|
}
|
|
try {
|
ResponseBody body = response.body();
|
contentType = body.contentType();
|
|
String dispositionStr = response.header("Content-disposition");
|
parseDisposition(dispositionStr);
|
|
if (contentType != null && !contentType.type().equalsIgnoreCase("text") && !contentType.type().equalsIgnoreCase("application")) {
|
String fileName = disposition.get("filename") + "." + contentType.subtype();
|
File path = FileRepository.getICallTempPath();
|
File file = new File(path, fileName);
|
|
InputStream inputStream = body.byteStream();
|
fileMeta = FileCenter.writeFile(file, inputStream);
|
}
|
else {
|
content = body.string();
|
}
|
|
logger.info("content:{}", content);
|
|
JType type = JSONReader.readType(content);
|
|
if (JType.Object == type) {
|
reader = new JObjectReader(content);
|
}
|
else if (JType.Array == type) {
|
reader = new JArrayReader(content);
|
}
|
else {
|
logger.error("invalid json for JSONResponse");
|
reader = null;
|
}
|
}
|
catch (Exception e) {
|
errors.add(e.getMessage());
|
e.printStackTrace();
|
}
|
}
|
|
private void parseDisposition(String dispositionStr) {
|
if (Util.isEmpty(dispositionStr)) {
|
return ;
|
}
|
|
this.disposition = new HashMap<String, String>();
|
String[] segments = dispositionStr.split(";");
|
int pos; String key, value;
|
|
for (String segment : segments) {
|
segment = segment.trim();
|
pos = segment.indexOf('=');
|
|
if (pos > -1) {
|
key = segment.substring(0, pos);
|
value = segment.substring(pos+1);
|
|
Pattern pattern = Pattern.compile("\"(.+?)\"");
|
Matcher matcher = pattern.matcher(value);
|
if (matcher.find()) {
|
value = matcher.group(1);
|
}
|
}
|
else {
|
key = segment;
|
value = segment;
|
}
|
disposition.put(key, value);
|
}
|
}
|
|
public JSONResponse(String response, int responseCode) {
|
new JSONResponse(response, responseCode, null);
|
}
|
|
public void setInstanceId(String instanceId) {
|
this.instanceId = instanceId;
|
}
|
|
public JSONResponse(String response, int responseCode, List<String> errorList) {
|
errors = new ArrayList<String>();
|
|
if (errorList != null) {
|
errors.addAll(errorList);
|
}
|
|
resultCode = responseCode;
|
|
if (resultCode != 200) {
|
errors.add("错误码: " + responseCode);
|
}
|
|
try {
|
content = response;
|
|
JType type = JSONReader.readType(content);
|
|
if (JType.Object == type) {
|
reader = new JObjectReader(content);
|
}
|
else if (JType.Array == type) {
|
reader = new JArrayReader(content);
|
}
|
else {
|
logger.error("invalid json for JSONResponse");
|
reader = null;
|
}
|
}
|
catch (Exception e) {
|
errors.add(e.getMessage());
|
e.printStackTrace();
|
}
|
}
|
|
public void format(ResponseTemplate responseTemplate, DataPackage dataPackage, String stepOriginalId) throws Exception {
|
ResponseFormatType formatType = ResponseFormatType.parse(responseTemplate.getFormatType());
|
|
if (formatType == ResponseFormatType.ToJson) {
|
formatDataPackage(responseTemplate.getCode(), dataPackage, stepOriginalId);
|
}
|
else if (formatType == ResponseFormatType.ToDB) {
|
saveToDB(responseTemplate.getCode(), stepOriginalId);
|
}
|
else {
|
formatFile(responseTemplate.getFilePath(), responseTemplate.getFileField(), dataPackage);
|
}
|
}
|
|
private void formatDataPackage(String formatPackageId, DataPackage dataPackage, String stepOriginalId) throws Exception {
|
JSONPackage jsonPackage = JSONPackageBucket.getJSONPackage(formatPackageId);
|
String packageName = jsonPackage.getName();
|
|
if (dataPackage == null) {
|
dataPackage = DataPackage.getInstance(packageName);
|
}
|
this.dataPackage = dataPackage;
|
this.dataPackage.loadDataFromJSON(stepOriginalId, reader, jsonPackage);
|
}
|
|
|
private void saveToDB(String formatPackageId, String dataId) throws Exception {
|
JSONPackage jsonPackage = JSONPackageBucket.getJSONPackage(formatPackageId);
|
String packageName = jsonPackage.getName();
|
|
dataPackage = DataPackage.getInstance(packageName);
|
dataPackage.loadDataFromJSON(dataId, reader, jsonPackage);
|
|
dataPackage.saveOneDataToDB(DataSource.Result);
|
}
|
|
private void formatFile(String filePath, FileField fileField, DataPackage dataPackage) throws Exception {
|
FileRecord fileRecord = FileCenter.getFileRecord(fileMeta.getFile());
|
FileCenter.saveFileIndex(dataPackage, fileRecord);
|
FileCenter.updateSenderDataPackage(fileField, dataPackage, fileRecord);
|
}
|
|
public String getString(String name) {
|
if (reader == null) {
|
return null;
|
}
|
|
return reader.getRawString(name);
|
}
|
|
public JSONReader getReader() {
|
return reader;
|
}
|
|
public JArrayReader parseJArrayReader() {
|
if (reader == null) {
|
return null;
|
}
|
|
return (JArrayReader) reader;
|
}
|
|
public boolean hasErrors() {
|
return !errors.isEmpty();
|
}
|
|
public int getResultCode() {
|
return resultCode;
|
}
|
|
public DataPackage getDataPackage() {
|
return dataPackage;
|
}
|
|
@Override
|
public String toString() {
|
return content;
|
}
|
|
@Override
|
public void writeJSON(IJSONWriter writer) {
|
writer.beginObject();
|
writer.beginArray("errors");
|
|
for (String error : errors) {
|
writer.write(error);
|
}
|
|
writer.endArray();
|
|
// writer.write("content", content);
|
writer.write("resultCode", resultCode);
|
writer.endObject();
|
}
|
}
|