package com.mapgis.cloud.object.AppCloud;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.soap.*;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.PrintStream;
import java.io.StringReader;
import java.net.URL;
import java.util.Map;
import java.util.Properties;
/**
* Created by 鱼人二代 on 2017/2/20
*/
public class CloudDogServer {
private String service_url = "";
private String service_namespace = "";
private String service_protocol = "";
private String service_msg_protocol = "";
private static CloudDogServer _cloudDogServer = null;
/**
* 初始化
* @return
*/
public static CloudDogServer getInstance(String service_namespace,String service_protocol,String service_url)
{
if(_cloudDogServer == null)
{
_cloudDogServer = new CloudDogServer(service_namespace, service_protocol, service_url);
}
return _cloudDogServer;
}
private CloudDogServer(String service_namespace,String service_protocol,String service_url){
//云狗服务请求地址
this.service_url = service_url;
//ns参数:表示WSDL文件的命名空间名。也就是<wsdl:definitions>元素的targetNamespace属性值
this.service_namespace = service_namespace;
//SOAP服务协议
this.service_protocol = service_protocol;
//SOAP消息协议
this.service_msg_protocol = !service_protocol.contains("12") ? SOAPConstants.SOAP_1_1_PROTOCOL : SOAPConstants.SOAP_1_2_PROTOCOL;
}
/**
* 客户端请求SOAP服务
* @return
*/
public String ImportRegisterPrice(String class_name,String action_name,Map<String,String> parameters,String result_node_name) {
String ret_node_value = "";
try {
String ns = this.service_namespace;
//1、创建服务(Service)
Service service = Service.create(new URL(this.service_url), new QName(ns, class_name));
//2、创建Dispatch
Dispatch<SOAPMessage> dispatch = service.createDispatch(new QName(ns, this.service_protocol), SOAPMessage.class, Service.Mode.MESSAGE);
//3、创建SOAPMessage
SOAPMessage msg = MessageFactory.newInstance(this.service_msg_protocol).createMessage();
SOAPEnvelope envelope = msg.getSOAPPart().getEnvelope();
SOAPBody body = envelope.getBody();
//4、创建QName来指定消息中传递数据
QName ename = new QName(ns, action_name, "axis");//<nn:add xmlns="xx"/>
SOAPBodyElement ele = body.addBodyElement(ename);
//传递参数
int len = parameters.size();
if (len > 0) {
for (String obj : parameters.keySet()) {
ele.addChildElement(obj, "axis").setValue(parameters.get(obj));
}
}
//5、通过Dispatch传递消息,会返回响应消息
SOAPMessage response = dispatch.invoke(msg);
//6、响应消息处理,将响应的消息转换为dom对象
try {
Document doc = response.getSOAPPart().getEnvelope().getBody().extractContentAsDocument();
ret_node_value = doc.getElementsByTagName(result_node_name).item(0).getTextContent();
} catch (Exception e) {
ret_node_value = GetSOAPMessageXml(response, result_node_name);
}
} catch (Exception e) {
}
return ret_node_value;
}
/**
* 将SOAPMessage数据流写入System.out,再获取SOAPMessage信息
* @param response
* @return
*/
private String GetSOAPMessageXml(SOAPMessage response,String result_node_name) {
String xmlStr = "";
try {
ByteArrayOutputStream baoStream = new ByteArrayOutputStream(1024);
PrintStream cacheStream = new PrintStream(baoStream);
PrintStream oldStream = System.out;
System.setOut(cacheStream);
response.writeTo(System.out);
System.out.println();
xmlStr = baoStream.toString();
System.setOut(oldStream);
if(!xmlStr.isEmpty())
{
StringReader sr = new StringReader(xmlStr);
InputSource is = new InputSource(sr);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(is);
xmlStr = doc.getElementsByTagName(result_node_name).item(0).getTextContent();
}
} catch (Exception e) {
}
return xmlStr;
}
}