import
java.io.BufferedInputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.util.List;
import
javax.xml.stream.XMLInputFactory;
import
javax.xml.stream.XMLStreamConstants;
import
javax.xml.stream.XMLStreamException;
import
javax.xml.stream.XMLStreamReader;
import
org.apache.cxf.Bus;
import
org.apache.cxf.binding.soap.SoapMessage;
import
org.apache.cxf.binding.soap.SoapVersion;
import
org.apache.cxf.binding.soap.SoapVersionFactory;
import
org.apache.cxf.bus.CXFBusFactory;
import
org.apache.cxf.endpoint.Server;
import
org.apache.cxf.endpoint.ServerRegistry;
import
org.apache.cxf.interceptor.InterceptorChain;
import
org.apache.cxf.interceptor.StaxInInterceptor;
import
org.apache.cxf.message.Message;
import
org.apache.cxf.phase.AbstractPhaseInterceptor;
import
org.apache.cxf.phase.Phase;
import
org.apache.cxf.staxutils.DepthXMLStreamReader;
import
org.apache.cxf.staxutils.StaxUtils;
import
org.apache.cxf.transport.MessageObserver;
public
class
MediatorInInterceptor
extends
AbstractPhaseInterceptor<SoapMessage> {
public
MediatorInInterceptor() {
super
();
setPhase(Phase.POST_STREAM);
addBefore(StaxInInterceptor.
class
.getName());
}
public
void
handleMessage(SoapMessage message) {
String schemaNamespace =
""
;
InterceptorChain chain = message.getInterceptorChain();
try
{
InputStream is = message.getContent(InputStream.
class
);
BufferedInputStream pis =
new
BufferedInputStream(is);
pis.mark(pis.available());
message.setContent(InputStream.
class
, pis);
String encoding = (String)message.get(Message.ENCODING);
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(pis, encoding);
DepthXMLStreamReader xmlReader =
new
DepthXMLStreamReader(reader);
if
(xmlReader.nextTag() == XMLStreamConstants.START_ELEMENT) {
String ns = xmlReader.getNamespaceURI();
SoapVersion soapVersion = SoapVersionFactory.getInstance().getSoapVersion(ns);
StaxUtils.toNextTag(xmlReader, soapVersion.getBody());
xmlReader.nextTag();
}
schemaNamespace = xmlReader.getName().getNamespaceURI();
pis.reset();
}
catch
(IOException e) {
e.printStackTrace();
}
catch
(XMLStreamException e) {
e.printStackTrace();
}
Bus bus = CXFBusFactory.getDefaultBus();
ServerRegistry serverRegistry = bus.getExtension(ServerRegistry.
class
);
List<Server> servers = serverRegistry.getServers();
Server targetServer =
null
;
for
(Server server : servers) {
targetServer = server;
String address = server.getEndpoint().getEndpointInfo().getAddress();
if
(schemaNamespace.indexOf(
"2007/03/21"
) != -
1
) {
if
(address.indexOf(
"version2"
) != -
1
) {
break
;
}
}
else
if
(address.indexOf(
"version1"
) != -
1
) {
break
;
}
}
MessageObserver mo = targetServer.getMessageObserver();
mo.onMessage(message);
chain.abort();
}
}