package be.error.wsproxy.interceptors.logging;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
import org.springframework.ws.context.MessageContext;
import be.error.wsproxy.core.MessageSupport;
import be.error.wsproxy.core.WebserviceIdentifierExtractorSupport;
import be.error.wsproxy.interceptors.ServiceSpecificEndpointInterceptor;
/**
* Service specific interceptor that will use XPath to extract information from the request/response and log it.
* <p>
* When this filter is enabled for a given WebService request, it extracts the XML parts identified by XPath expressions
* ({@link WebServiceMessageXPathExpressionMetaData}) from request and response. This information is logged, in this
* implementation by log4j.
*
* @see #handleFault(MessageContext, Object)
* @see #handleRequest(MessageContext, Object)
* @see #handleResponse(MessageContext, Object)
*
* @see WebServiceMessageXPathExpressionMetaData
* @see WebServiceMessageXPathExtractor
*
* @author Koen Serneels
*/
public class LoggingXPathInterceptor implements ServiceSpecificEndpointInterceptor {
private static final Logger LOG = Logger.getLogger(LoggingXPathInterceptor.class);
private final WebServiceMessageXPathExtractor xpathExtractor = new WebServiceMessageXPathExtractor();
private final List<WebServiceMessageXPathExpressionMetaData> requestXPaths = new ArrayList<>();
private final List<WebServiceMessageXPathExpressionMetaData> responseXPaths = new ArrayList<>();
private boolean logSoapFaults = true;
@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
logFragments(xpathExtractor.extractXPaths(requestXPaths, messageContext.getRequest()), messageContext);
return true;
}
@Override
public boolean handleResponse(MessageContext messageContext, Object endpoint) throws Exception {
logFragments(xpathExtractor.extractXPaths(responseXPaths, messageContext.getResponse()), messageContext);
return true;
}
@Override
public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception {
if (logSoapFaults) {
LOG.error("SID:" + WebserviceIdentifierExtractorSupport.getWebServiceIdentifier(messageContext)
+ " Payload:"
+ MessageSupport.transformSourceToString(messageContext.getRequest().getPayloadSource()));
}
return true;
}
@Override
public void afterCompletion(MessageContext messageContext, Object endpoint, Exception ex) throws Exception {
// Do nothing
}
private void logFragments(Map<WebServiceMessageXPathExpressionMetaData, String> extractedFragments,
MessageContext messageContext) {
for (Entry<WebServiceMessageXPathExpressionMetaData, String> entry : extractedFragments.entrySet()) {
LOG.debug("SID:" + WebserviceIdentifierExtractorSupport.getWebServiceIdentifier(messageContext)
+ " XPATHID:" + entry.getKey().getXPathKey() + " VALUE:" + entry.getValue());
}
}
public void addResponseXPaths(WebServiceMessageXPathExpressionMetaData... responseXPaths) {
if (responseXPaths != null) {
this.responseXPaths.addAll(Arrays.asList(responseXPaths));
}
}
public void addRequestXPaths(WebServiceMessageXPathExpressionMetaData... requestXPaths) {
if (requestXPaths != null) {
this.requestXPaths.addAll(Arrays.asList(requestXPaths));
}
}
public void setLogSoapFaults(boolean logSoapFaults) {
this.logSoapFaults = logSoapFaults;
}
}