package cn.org.rapid_framework.distributed.threadlocal.cfx;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import cn.org.rapid_framework.distributed.threadlocal.DistributedThreadLocal;
/**
* 输出(Out)拦截器,用于将DistributedThreadLocal中的信息存放在 WebService SOAP 的Header中
*
* @author badqiu
*/
public class DistributedThreadLocalOutSOAPHeaderInterceptor extends AbstractSoapInterceptor {
public DistributedThreadLocalOutSOAPHeaderInterceptor() {
super(Phase.WRITE);
}
public void handleMessage(SoapMessage message) throws Fault {
DistributedThreadLocal.onBeforeRemoteCall();
List<Header> headers = message.getHeaders();
Map<String,String> threadlocalMap = DistributedThreadLocal.getMap();
for(Map.Entry<String, String> entry : threadlocalMap.entrySet()) {
headers.add(getHeader(entry.getKey(), entry.getValue()));
}
}
private Header getHeader(String key, String value) {
QName qName = new QName(key);
Document document = DOMUtils.createDocument();
Element element = document.createElement(key);
element.appendChild(document.createTextNode(value));
SoapHeader header = new SoapHeader(qName, element);
return (header);
}
}