1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.support.soap;
14
15 import java.util.ArrayList;
16 import java.util.List;
17
18 import javax.xml.namespace.QName;
19
20 import org.apache.log4j.Logger;
21 import org.apache.xmlbeans.SchemaType;
22 import org.apache.xmlbeans.SchemaTypeLoader;
23 import org.apache.xmlbeans.XmlError;
24 import org.apache.xmlbeans.XmlException;
25 import org.apache.xmlbeans.XmlObject;
26 import org.apache.xmlbeans.XmlOptions;
27 import org.apache.xmlbeans.XmlValidationError;
28
29 public abstract class AbstractSoapVersion implements SoapVersion
30 {
31 private final static Logger log = Logger.getLogger(AbstractSoapVersion.class);
32
33 public void validateSoapEnvelope(String soapMessage, List<XmlError> errors)
34 {
35 List<XmlError> errorList = new ArrayList<XmlError>();
36
37 try
38 {
39 XmlOptions xmlOptions = new XmlOptions();
40 xmlOptions.setLoadLineNumbers();
41 xmlOptions.setValidateTreatLaxAsSkip();
42 xmlOptions.setLoadLineNumbers(XmlOptions.LOAD_LINE_NUMBERS_END_ELEMENT);
43 XmlObject xmlObject = getSoapEnvelopeSchemaLoader().parse( soapMessage, getEnvelopeType(), xmlOptions);
44 xmlOptions.setErrorListener(errorList);
45 xmlObject.validate(xmlOptions);
46 }
47 catch ( XmlException e )
48 {
49 errorList.addAll( e.getErrors() );
50 errors.add( XmlError.forMessage( e.getMessage() ));
51 }
52 catch (Exception e)
53 {
54 errors.add( XmlError.forMessage( e.getMessage() ));
55 }
56 finally
57 {
58 for( XmlError error : errorList )
59 {
60 if( error instanceof XmlValidationError && shouldIgnore( (XmlValidationError) error ))
61 {
62 log.warn( "Ignoring validation error: " + error.toString() );
63 continue;
64 }
65
66 errors.add( error );
67 }
68 }
69 }
70
71 protected abstract SchemaTypeLoader getSoapEnvelopeSchemaLoader();
72
73 public boolean shouldIgnore(XmlValidationError error)
74 {
75 QName offendingQName = error.getOffendingQName();
76 if( offendingQName != null )
77 {
78 if( offendingQName.equals( new QName( getEnvelopeNamespace(), "encodingStyle")))
79 {
80 return true;
81 }
82 else if( offendingQName.equals( new QName( getEnvelopeNamespace(), "mustUnderstand")))
83 {
84 return true;
85 }
86 }
87
88 return false;
89 }
90
91 public abstract SchemaType getFaultType();
92
93 public abstract SchemaType getEnvelopeType();
94 }