package cn.org.rapid_framework.distributed.threadlocal.cfx; import java.util.HashMap; import java.util.Map; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.Phase; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import cn.org.rapid_framework.distributed.threadlocal.DistributedThreadLocal; /** * 输入(In)拦截器,用于从 WebService SOAP 的Header中取回DistributedThreadLocal中的信息,并存放在DistributedThreadLocal中 * * @author badqiu */ public class DistributedThreadLocalInSOAPHeaderInterceptor extends AbstractSoapInterceptor { private SAAJInInterceptor saajIn = new SAAJInInterceptor(); public DistributedThreadLocalInSOAPHeaderInterceptor() { super(Phase.PRE_PROTOCOL); getAfter().add(SAAJInInterceptor.class.getName()); } public void handleMessage(SoapMessage message) throws Fault { SOAPMessage doc = message.getContent(SOAPMessage.class); if (doc == null) { saajIn.handleMessage(message); doc = message.getContent(SOAPMessage.class); } Map<String,String> headers = toHeadersMap(doc); DistributedThreadLocal.putAll(headers); DistributedThreadLocal.onReceivedDistributedThreadLocal(); } private Map toHeadersMap(SOAPMessage doc) { SOAPHeader header = getSOAPHeader(doc); if (header == null) { return new HashMap(0); } Map<String,String> headersMap = new HashMap(); NodeList nodes = header.getChildNodes(); for(int i=0; i<nodes.getLength(); i++) { Node item = nodes.item(i); if(item.hasChildNodes()) { headersMap.put(item.getLocalName(), item.getFirstChild().getNodeValue()); } } return headersMap; } private SOAPHeader getSOAPHeader(SOAPMessage doc) { SOAPHeader header; try { header = doc.getSOAPHeader(); } catch (SOAPException e) { throw new RuntimeException(e); } return header; } }