package be.error.wsproxy.interceptors.logging;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import org.apache.log4j.Logger;
import org.springframework.util.xml.TransformerUtils;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.server.EndpointInterceptor;
import org.springframework.ws.soap.saaj.SaajSoapMessage;
import org.springframework.xml.transform.StringResult;
import org.springframework.xml.transform.TransformerHelper;
import be.error.wsproxy.core.WebserviceIdentifierExtractorSupport;
public class LoggingInterceptor implements EndpointInterceptor, ClientInterceptor {
private static final Logger LOG = Logger.getLogger(LoggingInterceptor.class);
private final TransformerHelper transformerHelper = new TransformerHelper();
private final Transformer transformer;
{
try {
transformer = transformerHelper.createTransformer();
TransformerUtils.enableIndenting(transformer);
} catch (TransformerConfigurationException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
LOG.debug("SID:" + WebserviceIdentifierExtractorSupport.getWebServiceIdentifier(messageContext)
+ " OUTBOUND SIDE Request:" + transform(messageContext.getRequest()));
return true;
}
@Override
public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
LOG.debug("SID:" + WebserviceIdentifierExtractorSupport.getWebServiceIdentifier(messageContext)
+ " OUTBOUND SIDE Response:" + transform(messageContext.getResponse()));
return true;
}
@Override
public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
LOG.debug("SID:" + WebserviceIdentifierExtractorSupport.getWebServiceIdentifier(messageContext)
+ " OUTBOUND SIDE Fault:" + transform(messageContext.getResponse()));
return true;
}
@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
LOG.debug("SID:" + WebserviceIdentifierExtractorSupport.getWebServiceIdentifier(messageContext)
+ " INBOUND SIDE Request:" + transform(messageContext.getRequest()));
return true;
}
@Override
public boolean handleResponse(MessageContext messageContext, Object endpoint) throws Exception {
LOG.debug("SID:" + WebserviceIdentifierExtractorSupport.getWebServiceIdentifier(messageContext)
+ " INBOUND SIDE Response:" + transform(messageContext.getResponse()));
return true;
}
@Override
public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception {
LOG.debug("SID:" + WebserviceIdentifierExtractorSupport.getWebServiceIdentifier(messageContext)
+ " INBOUND SIDE Fault:" + transform(messageContext.getResponse()));
return true;
}
@Override
public void afterCompletion(MessageContext messageContext, Object endpoint, Exception ex) throws Exception {
// Do nothing
}
@Override
public void afterCompletion(final MessageContext messageContext, final Exception ex) throws WebServiceClientException {
//Do nothing
}
private String transform(WebServiceMessage message) {
SaajSoapMessage saajSoapMessage = ((SaajSoapMessage) message);
StringResult stringResult = new StringResult();
try {
transformer.transform(new DOMSource(saajSoapMessage.getDocument()), stringResult);
} catch (TransformerException e) {
throw new RuntimeException(e);
}
return stringResult.toString();
}
}