| /* Copyright 2004 The Apache Software Foundation | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package scomp.namespace.checkin; | |
| import org.apache.xmlbeans.XmlCursor; | |
| import org.apache.xmlbeans.XmlOptions; | |
| import org.junit.Before; | |
| import org.junit.Test; | |
| import org.xmlsoap.schemas.soap.envelope.EnvelopeDocument; | |
| import tools.xml.XmlComparator; | |
| import javax.xml.namespace.QName; | |
| import static org.junit.Assert.assertEquals; | |
| import static org.junit.Assert.assertTrue; | |
| public class PreserveNamespaces | |
| { | |
| public static XmlOptions options; | |
| public static final String EOL = System.getProperty("line.separator"); | |
| @Before | |
| public void setUp() { | |
| options = new XmlOptions().setSavePrettyPrint().setSaveOuter(); | |
| } | |
| //tests for preserving/copying namespace declarations when doing an XmlObject.set() | |
| @Test | |
| public void testDroppedXsdNSDecl() throws Exception { | |
| // Test for XSD namespace declaration dropped | |
| EnvelopeDocument env1 = EnvelopeDocument.Factory.parse("<soap:Envelope \n" + | |
| "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" + | |
| "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" \n" + | |
| "xmlns:tns=\"http://Walkthrough/XmlWebServices/\" \n" + | |
| "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + | |
| " <soap:Body>\n" + | |
| " <tns:ConvertTemperature>\n" + | |
| " <dFahrenheit xsi:type=\"xsd:double\">88</dFahrenheit>\n" + | |
| " </tns:ConvertTemperature>\n" + | |
| " </soap:Body>\n" + | |
| "</soap:Envelope>"); | |
| EnvelopeDocument env2 = EnvelopeDocument.Factory.newInstance(); | |
| env2.addNewEnvelope().setBody(env1.getEnvelope().getBody()); | |
| // compare the 2 body elements using the Xml Comparator. This uses a cursor to walk thro the docs and compare elements and attributes | |
| tools.xml.XmlComparator.Diagnostic diag = new tools.xml.XmlComparator.Diagnostic(); | |
| assertTrue(XmlComparator.lenientlyCompareTwoXmlStrings(env1.getEnvelope().getBody().xmlText(), env2.getEnvelope().getBody().xmlText(), diag)); | |
| // navigate to the dFahrenhiet element and check for the XSD namespace | |
| XmlCursor env2Cursor = env2.newCursor(); | |
| assertTrue(env2Cursor.toFirstChild()); // <Envelope> | |
| assertTrue(env2Cursor.toFirstChild()); // <Body> | |
| assertTrue(env2Cursor.toFirstChild()); // <ConvertTemperature> | |
| if (env2Cursor.toFirstChild()) // <dFahrenheit> | |
| { | |
| assertEquals("Element name mismatch!", env2Cursor.getName(), new QName("", "dFahrenheit")); | |
| assertEquals("Element val mismatch!", "88", env2Cursor.getTextValue()); | |
| assertEquals("XSD Namespace has been dropped", "http://www.w3.org/2001/XMLSchema", env2Cursor.namespaceForPrefix("xsd")); | |
| } | |
| } | |
| @Test | |
| public void testsModifiedXsdNSPrefix() throws Exception { | |
| // XSD namespace used in QName values and elements | |
| EnvelopeDocument env1 = EnvelopeDocument.Factory.parse("<soap:Envelope \n" + | |
| "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" + | |
| "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" \n" + | |
| "xmlns:tns=\"http://Walkthrough/XmlWebServices/\" \n" + | |
| "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + | |
| " <soap:Body>\n" + | |
| " <xsd:element name=\"myname\" type=\"xsd:string\"/>\n" + | |
| " </soap:Body>\n" + | |
| "</soap:Envelope>"); | |
| EnvelopeDocument env2 = EnvelopeDocument.Factory.newInstance(); | |
| env2.addNewEnvelope().setBody(env1.getEnvelope().getBody()); | |
| // compare the 2 body elements using the Xml Comparator. This uses a cursor to walk thro the docs and compare elements and attributes | |
| tools.xml.XmlComparator.Diagnostic diag = new tools.xml.XmlComparator.Diagnostic(); | |
| assertTrue("new envelope has missing XSD namespace declaration", XmlComparator.lenientlyCompareTwoXmlStrings(env1.getEnvelope().getBody().xmlText(), env2.getEnvelope().getBody().xmlText(), diag)); | |
| // navigate to the 'element' element and check for the XSD namespace | |
| XmlCursor env2Cursor = env2.newCursor(); | |
| assertTrue(env2Cursor.toFirstChild()); // <Envelope> | |
| assertTrue(env2Cursor.toFirstChild()); // <Body> | |
| if (env2Cursor.toFirstChild()) // <element> | |
| { | |
| assertEquals("Element name mismatch!", env2Cursor.getName(), new QName("http://www.w3.org/2001/XMLSchema", "element")); | |
| assertEquals("XSD Namespace has been dropped", "http://www.w3.org/2001/XMLSchema", env2Cursor.namespaceForPrefix("xsd")); | |
| } | |
| } | |
| @Test | |
| public void testsFaultCodeNSUpdate() throws Exception { | |
| EnvelopeDocument env1 = EnvelopeDocument.Factory.parse("<soap:Envelope \n" + | |
| "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + | |
| " <soap:Body>\n" + | |
| " <soap:Fault>\n" + | |
| " <faultcode>soap:Server</faultcode>\n" + | |
| " <faultstring>my error message</faultstring>\n" + | |
| " </soap:Fault>\n" + | |
| " </soap:Body>\n" + | |
| "</soap:Envelope>"); | |
| // Test for NS of the faultcode element | |
| EnvelopeDocument env2 = EnvelopeDocument.Factory.newInstance(); | |
| env2.addNewEnvelope().setBody(env1.getEnvelope().getBody()); | |
| // compare the 2 body elements using the Xml Comparator. This uses a cursor to walk thro the docs and compare elements and attributes | |
| tools.xml.XmlComparator.Diagnostic diag = new tools.xml.XmlComparator.Diagnostic(); | |
| assertTrue("new envelope has missing XSD namespace declaration", XmlComparator.lenientlyCompareTwoXmlStrings(env1.getEnvelope().getBody().xmlText(), env2.getEnvelope().getBody().xmlText(), diag)); | |
| // navigate to the soap element and check for the 'soap' namespace | |
| XmlCursor env2Cursor = env2.newCursor(); | |
| assertTrue(env2Cursor.toFirstChild()); // <Envelope> | |
| assertTrue(env2Cursor.toFirstChild()); // <Body> | |
| assertTrue(env2Cursor.toFirstChild()); // <Fault> | |
| if (env2Cursor.toFirstChild()) // <faultcode> | |
| { | |
| assertEquals("Element name mismatch!", env2Cursor.getName(), new QName("", "faultcode")); | |
| assertEquals("soap Namespace has been dropped", "http://schemas.xmlsoap.org/soap/envelope/", env2Cursor.namespaceForPrefix("soap")); | |
| } | |
| } | |
| } |