package com.fr.data;
import cn.hutool.core.lang.Console;
import cn.hutool.http.webservice.SoapClient;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ParameterProvider;
import org.apache.avro.generic.GenericData;
import javax.xml.soap.*;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class OaFLow extends SimpleTableData {
/**
* 定义程序数据集的列名与数据保存位置
*/
public static String ret = "";
@Override
public String[] initColumnNames() {
String[] columnNames = {"ZSN_ZHJD_OPINION", "ZSN_ZHJD_CREATEDATE", "ZSN_ZHJD_STATUS", "ZSN_ZHJD_NODE", "ZSN_ZHJD_DEPARTMENT", "ZSN_ZHJD_USERNAME"};
return columnNames;
}
/**
* 实现构建函数,在构建函数中准备数据
*/
@Override
public List<Object[]> loadData() {
String[] columnNames;
Object[][] rowData;
String flowId = ((ParameterProvider) (parameters.get().toArray())[0]).getValue().toString();
List<Object[]> list = new ArrayList<>();
try {
// 新建客户端
SoapClient client = SoapClient.create("http://IP/services/ConfirmFlowService")
// 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间
.setMethod("con:ConfirmFlowService", "http://schemas.xmlsoap.org/soap/envelope/")
// 设置参数,此处自动添加方法的前缀:web
.setParam("in0", flowId);
// 发送请求,参数true表示返回一个格式化后的XML内容
// 返回内容为XML字符串,可以配合XmlUtil解析这个响应
SOAPMessage msg = formatSoapString(client.sendForResponse().body());
SOAPBody body = msg.getSOAPBody();
Iterator<SOAPElement> iterator = body.getChildElements();
PrintBody(iterator, null);
JSONArray arr = JSONUtil.parseArray(JSONUtil.parse(JSONUtil.parse(ret).getByPath("confirmFlow")).getByPath(flowId));
for(int i=0;i<arr.size();i++){
list.add(new Object[6]);
list.get(i)[0] = JSONUtil.parseObj(arr.get(i)).get("ZSN_ZHJD_OPINION");
list.get(i)[1] = JSONUtil.parseObj(arr.get(i)).get("ZSN_ZHJD_CREATEDATE");
list.get(i)[2] = JSONUtil.parseObj(arr.get(i)).get("ZSN_ZHJD_STATUS");
list.get(i)[3] = JSONUtil.parseObj(arr.get(i)).get("ZSN_ZHJD_NODE");
list.get(i)[4] = JSONUtil.parseObj(arr.get(i)).get("ZSN_ZHJD_DEPARTMENT");
list.get(i)[5] = JSONUtil.parseObj(arr.get(i)).get("ZSN_ZHJD_USERNAME");
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
return list;
}
//实现ArrayTableData的其他四个方法,因为AbstractTableData已经实现了hasRow方法
/**
* 把soap字符串格式化为SOAPMessage
*
* @param soapString
* @return
* @see [类、类#方法、类#成员]
*/
public static SOAPMessage formatSoapString(String soapString) {
MessageFactory msgFactory;
try {
msgFactory = MessageFactory.newInstance();
SOAPMessage reqMsg = msgFactory.createMessage(new MimeHeaders(),
new ByteArrayInputStream(soapString.getBytes("UTF-8")));
reqMsg.saveChanges();
return reqMsg;
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
return null;
}
}
private static void PrintBody(Iterator<SOAPElement> iterator, String side) {
while (iterator.hasNext()) {
Object o=iterator.next();
if(o!=null) {
SOAPElement element=null;
try{
element = (SOAPElement) o;
System.out.println("Node Name:" + element.getNodeName());
System.out.println("Value:" + element.getValue());
if(element.getNodeName().equals("ns1:out")){
ret = element.getValue() + "";
}
}catch(Exception e){}
if ( element !=null ) {
PrintBody(element.getChildElements(), side + "-----");
}
}
}
}
public static void main(String[] args){
new OaFLow().loadData();
}
}