+package org.argeo.slc.ws.client;\r
+\r
+import java.io.IOException;\r
+\r
+import javax.xml.transform.Source;\r
+\r
+import junit.framework.TestCase;\r
+\r
+import org.springframework.ws.client.WebServiceClientException;\r
+import org.springframework.ws.client.WebServiceIOException;\r
+import org.springframework.ws.client.support.interceptor.ClientInterceptor;\r
+import org.springframework.ws.context.MessageContext;\r
+import org.springframework.xml.validation.XmlValidator;\r
+import org.xml.sax.SAXParseException;\r
+\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+\r
+public class ValidatingClientInterceptor implements ClientInterceptor {\r
+ private final static Log log = LogFactory\r
+ .getLog(ValidatingClientInterceptor.class);\r
+\r
+ private Boolean validateRequest = true;\r
+ private Boolean validateResponse = false;\r
+ private XmlValidator validator = null;\r
+\r
+ public boolean handleFault(MessageContext messageContext)\r
+ throws WebServiceClientException {\r
+ return true;\r
+ }\r
+\r
+ public boolean handleRequest(MessageContext messageContext)\r
+ throws WebServiceClientException {\r
+ if (validateRequest) {\r
+ if (messageContext.getRequest() == null)\r
+ return true;\r
+\r
+ Source source = messageContext.getRequest().getPayloadSource();\r
+ try {\r
+ return validate(source);\r
+ } catch (IOException e) {\r
+ throw new WebServiceIOException("Cannot validate request", e);\r
+ }\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ public boolean handleResponse(MessageContext messageContext)\r
+ throws WebServiceClientException {\r
+ if (validateResponse) {\r
+ if (messageContext.getResponse() == null)\r
+ return true;\r
+ \r
+ Source source = messageContext.getResponse().getPayloadSource();\r
+ try {\r
+ return validate(source);\r
+ } catch (IOException e) {\r
+ throw new WebServiceIOException("Cannot validate response", e);\r
+ }\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ protected boolean validate(Source source) throws IOException {\r
+ SAXParseException[] exceptions = validator.validate(source);\r
+ if (exceptions.length != 0) {\r
+ for (SAXParseException ex : exceptions) {\r
+ log.error(ex.getMessage());\r
+ }\r
+ return false;\r
+ } else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ public void setValidateRequest(Boolean validateRequest) {\r
+ this.validateRequest = validateRequest;\r
+ }\r
+\r
+ public void setValidateResponse(Boolean validateResponse) {\r
+ this.validateResponse = validateResponse;\r
+ }\r
+\r
+ public void setValidator(XmlValidator validator) {\r
+ this.validator = validator;\r
+ }\r
+\r
+}\r