2222import java .io .ByteArrayInputStream ;
2323import java .io .IOException ;
2424import java .io .InputStream ;
25+ import java .net .URL ;
2526
27+ import javax .xml .XMLConstants ;
2628import javax .xml .namespace .QName ;
29+ import javax .xml .parsers .DocumentBuilder ;
30+ import javax .xml .parsers .DocumentBuilderFactory ;
31+ import javax .xml .stream .XMLInputFactory ;
2732import javax .xml .stream .XMLStreamReader ;
33+ import javax .xml .transform .dom .DOMSource ;
34+ import javax .xml .validation .Schema ;
35+ import javax .xml .validation .SchemaFactory ;
2836
37+ import org .w3c .dom .Document ;
38+
39+ import com .ctc .wstx .msv .W3CSchemaFactory ;
40+
41+ import org .apache .cxf .endpoint .Endpoint ;
2942import org .apache .cxf .interceptor .Fault ;
43+ import org .apache .cxf .message .Exchange ;
44+ import org .apache .cxf .message .ExchangeImpl ;
3045import org .apache .cxf .message .Message ;
3146import org .apache .cxf .message .MessageImpl ;
47+ import org .apache .cxf .service .Service ;
48+ import org .apache .cxf .service .ServiceImpl ;
49+ import org .apache .cxf .service .model .MessageInfo ;
50+ import org .apache .cxf .service .model .MessagePartInfo ;
51+ import org .apache .cxf .service .model .ServiceInfo ;
3252import org .apache .cxf .staxutils .StaxUtils ;
53+ import org .codehaus .stax2 .XMLStreamReader2 ;
54+ import org .codehaus .stax2 .validation .XMLValidationSchema ;
3355
3456import org .junit .Test ;
3557
58+ import static org .junit .Assert .assertEquals ;
3659import static org .junit .Assert .assertFalse ;
3760import static org .junit .Assert .assertTrue ;
61+ import static org .junit .Assert .fail ;
62+ import static org .mockito .Mockito .mock ;
63+ import static org .mockito .Mockito .when ;
3864
3965/**
4066 *
4167 */
4268public class XMLStreamDataReaderTest {
4369 private static final byte [] DUMMY_DATA = "<ns:dummy xmlns:ns='http://www.apache.org/cxf'/>" .getBytes ();
4470 private static final byte [] DUMMY_DATA_NULL_BYTE =
45- "<ns:dummy xmlns:ns='http://www.apache.org/cxf�'/>" .getBytes ();
71+ "<ns:dummy xmlns:ns='http://www.apache.org/cxf�'/>" .getBytes ();
72+
73+ // Parse some XML with a null byte and check we don't return internal Woodstox package names in the error message
74+ @ Test
75+ public void testParseNullByte () throws Exception {
76+ XMLStreamDataReader reader = new XMLStreamDataReader ();
77+ Message msg = new MessageImpl ();
78+
79+ TestInputStream in1 = new TestInputStream (DUMMY_DATA_NULL_BYTE );
80+
81+ msg .setContent (InputStream .class , in1 );
82+
83+ reader .setProperty (Message .class .getName (), msg );
84+
85+ Object obj = reader .read (new QName ("http://www.apache.org/cxf" , "dummy" ),
86+ StaxUtils .createXMLStreamReader (in1 ), XMLStreamReader .class );
87+
88+ assertTrue (obj instanceof XMLStreamReader );
89+
90+ try {
91+ reader .read ((XMLStreamReader ) obj );
92+ } catch (Fault f ) {
93+ assertFalse (f .getMessage ().contains ("com.ctc.wstx" ));
94+ }
95+
96+ ((XMLStreamReader )obj ).close ();
97+ }
4698
4799 @ Test
48100 public void testCloseOriginalInputStream () throws Exception {
@@ -66,30 +118,76 @@ public void testCloseOriginalInputStream() throws Exception {
66118 assertTrue (in1 .isClosed ());
67119 }
68120
69- // Parse some XML with a null byte and check we don't return internal Woodstox package names in the error message
70121 @ Test
71- public void testParseNullByte () throws Exception {
122+ public void testValid () throws Exception {
123+ testValidate ("resources/schema.xsd" , "resources/test-valid.xml" , false );
124+ }
125+
126+ @ Test
127+ public void testInValid () throws Exception {
128+ testValidate ("resources/schema.xsd" , "resources/test-invalid.xml" , true );
129+ }
130+
131+
132+ private void testValidate (String schemaPath , String xmlPath , boolean exceptionExpected ) throws Exception {
133+
134+ //create schema
135+ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory .newInstance ();
136+ documentBuilderFactory .setNamespaceAware (true );
137+ DocumentBuilder documentBuilder = documentBuilderFactory .newDocumentBuilder ();
138+ URL schemaURI = getClass ().getResource (schemaPath );
139+ Document wsdl = documentBuilder .parse (schemaURI .openStream ());
140+ String wsdlSystemId = schemaURI .toExternalForm ();
141+ DOMSource source = new DOMSource (wsdl );
142+ source .setSystemId (wsdlSystemId );
143+ source .setSystemId (wsdlSystemId );
144+
145+ XMLValidationSchema schemaw3c =
146+ W3CSchemaFactory .newInstance (XMLValidationSchema .SCHEMA_ID_W3C_SCHEMA ).createSchema (schemaURI );
147+ SchemaFactory schemaFactory = SchemaFactory .newInstance (XMLConstants .W3C_XML_SCHEMA_NS_URI );
148+ Schema schema = schemaFactory .newSchema (schemaURI );
149+
72150 XMLStreamDataReader reader = new XMLStreamDataReader ();
151+ reader .setSchema (schema );
152+
153+
154+ InputStream testIS = getClass ().getResourceAsStream (xmlPath );
73155 Message msg = new MessageImpl ();
156+ Exchange exchange = new ExchangeImpl ();
74157
75- TestInputStream in1 = new TestInputStream ( DUMMY_DATA_NULL_BYTE );
158+ ServiceInfo serviceInfo = new ServiceInfo ( );
76159
77- msg .setContent (InputStream .class , in1 );
160+ Endpoint endpoint = mock (Endpoint .class );
161+ when (endpoint .get (XMLValidationSchema .class .getName ())).thenReturn (schemaw3c );
78162
79- reader . setProperty ( Message . class . getName (), msg );
163+ Service svc = new ServiceImpl ( serviceInfo );
80164
81- Object obj = reader . read ( new QName ( "http://www.apache.org/cxf" , "dummy" ),
82- StaxUtils . createXMLStreamReader ( in1 ), XMLStreamReader .class );
165+ exchange . put ( Service . class , svc );
166+ exchange . put ( Endpoint .class , endpoint );
83167
84- assertTrue (obj instanceof XMLStreamReader );
168+ msg .setExchange (exchange );
169+ msg .setContent (InputStream .class , testIS );
170+ reader .setProperty (Message .class .getName (), msg );
85171
172+ XMLInputFactory xmlFactory = XMLInputFactory .newInstance ();
173+ XMLStreamReader2 xmlStreamReader = (XMLStreamReader2 ) xmlFactory .createXMLStreamReader (testIS , "utf-8" );
174+
175+ MessageInfo messageInfo = new MessageInfo (null ,
176+ MessageInfo .Type .INPUT ,
177+ new QName ("http://www.test.org/services" ,
178+ "NullTestOperationRequest" ));
179+ MessagePartInfo messagePartInfo = new MessagePartInfo (new QName (
180+ "http://www.test.org/services" , "NullTestOperationRequest" ), messageInfo );
181+ messagePartInfo .setElement (true );
182+ boolean exceptionCaught = false ;
86183 try {
87- reader .read ((XMLStreamReader ) obj );
88- } catch (Fault f ) {
89- assertFalse (f .getMessage ().contains ("com.ctc.wstx" ));
184+ reader .read (messagePartInfo , xmlStreamReader );
185+ } catch (Fault fault ) {
186+ exceptionCaught = true ;
187+ } catch (Exception exc ) {
188+ fail (exc .getMessage ());
90189 }
91-
92- ((XMLStreamReader )obj ).close ();
190+ assertEquals (exceptionExpected , exceptionCaught );
93191 }
94192
95193 private static class TestInputStream extends ByteArrayInputStream {
0 commit comments