Package com.sun.xml.stream.buffer.stax

Source Code of com.sun.xml.stream.buffer.stax.OverrideNamespaceTest

package com.sun.xml.stream.buffer.stax;

import com.sun.xml.stream.buffer.XMLStreamBuffer;
import com.sun.xml.stream.buffer.MutableXMLStreamBuffer;
import com.sun.xml.stream.buffer.XMLStreamBufferResult;

import java.io.StringReader;
import java.io.FileInputStream;
import java.util.*;
import java.net.URL;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.parsers.SAXParserFactory;

import junit.framework.*;
import org.xml.sax.XMLReader;

/**
*
* @author Paul.Sandoz@Sun.Com
* @author Jitendra.Kotamraju@Sun.Com
*/
public class OverrideNamespaceTest extends TestCase {
   
    public OverrideNamespaceTest(String testName) {
        super(testName);
    }

    public void testOverrideNamespace() throws Exception {
        String[] startElement = {"definitions", "types", "binding"};
        String[] startElement_namespaces = {"http://wsdl", "http://types", "http://wsdl"};
        String[] endElement = {"types", "binding", "definitions"};
        String[] endElement_namespaces = {"http://types", "http://wsdl", "http://wsdl"};
       
        String str = "<tns:definitions xmlns:tns='http://wsdl'><tns:types xmlns:tns='http://types'/><tns:binding/></tns:definitions>";
        XMLStreamReader rdr = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(str));
        XMLStreamBuffer xsb = XMLStreamBuffer.createNewBufferFromXMLStreamReader(rdr);
        XMLStreamReader xsbrdr = xsb.readAsXMLStreamReader();
        int i = 0;
        int j = 0;
        while(xsbrdr.hasNext()) {
            int event = xsbrdr.next();
            if (event == XMLStreamReader.START_ELEMENT) {
                assertEquals("Start of Element " + xsbrdr.getName() + " has wrong namespace",
                        startElement_namespaces[i], xsbrdr.getNamespaceURI("tns"));
                assertEquals(startElement[i++], xsbrdr.getLocalName());
            } else if (event == XMLStreamReader.END_ELEMENT) {
                assertEquals("End of Element " + xsbrdr.getName() + " has wrong namespace",
                        endElement_namespaces[j], xsbrdr.getNamespaceURI("tns"));
                assertEquals(endElement[j++], xsbrdr.getLocalName());
            }
        }
    }

    public void testOverrideNamespace1() throws Exception {
        Map<String, String> ns = new LinkedHashMap<String, String>();
        ns.put("definitions", "http://wsdl");
        ns.put("types", "http://types");
        ns.put("binding", "http://wsdl");
        ns.put("operation", "http://operation");
        ns.put("port", "http://wsdl");

        String str = "<tns:definitions xmlns:tns='http://wsdl'><tns:types xmlns:tns='http://types'/><tns:binding><tns:operation xmlns:tns='http://operation'/></tns:binding><tns:port/></tns:definitions>";

        XMLStreamReader rdr = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(str));
        XMLStreamBuffer xsb = XMLStreamBuffer.createNewBufferFromXMLStreamReader(rdr);
        XMLStreamReader xsbrdr = xsb.readAsXMLStreamReader();
        Iterator<String> nsItr = ns.keySet().iterator();
        while(xsbrdr.hasNext()) {
            int event = xsbrdr.next();
            if (event == XMLStreamReader.START_ELEMENT) {
            assertEquals("Wrong Start of Element", nsItr.next(), xsbrdr.getLocalName());
                assertEquals("Start of Element " + xsbrdr.getName() + " has wrong namespace",
                        ns.get(xsbrdr.getLocalName()), xsbrdr.getNamespaceURI("tns"));
            } else if (event == XMLStreamReader.END_ELEMENT) {
                assertEquals("End of Element " + xsbrdr.getName() + " has wrong namespace",
                        ns.get(xsbrdr.getLocalName()), xsbrdr.getNamespaceURI("tns"));
            }
        }
    }

    public void testNamespaceScope1() throws Exception {
        String str = "<html:html xmlns:html='http://www.w3.org/1999/xhtml'>" +
                "<html:head><html:title>Frobnostication</html:title></html:head>" +
                "<html:body>" +
                "<html:p><html:a href='http://frob.example.com'>here.</html:a></html:p>" +
                "</html:body>" +
                "</html:html>";

        useReaderForTesting(str, "html");
    }

    public void testNamespaceScope2() throws Exception {
        String str =
            "<book xmlns='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'>"+
            "<title>Cheaper by the Dozen</title>"+
            "<isbn:number>1568491379</isbn:number>"+
            "<notes>"+
              "<!-- make HTML the default namespace for some commentary -->"+
              "<p xmlns='http://www.w3.org/1999/xhtml'>"+
                  "This is a <i>funny</i> book!"+
              "</p>"+
            "</notes>"+
            "</book>";

        useReaderForTesting(str, "", "isbn");
    }

    public void testNamespaceScope3() throws Exception {
        String str =
            "<Beers>"+
              "<!-- the default namespace inside tables is that of HTML -->"+
              "<table xmlns='http://www.w3.org/1999/xhtml'>"+
               "<th><td>Name</td><td>Origin</td><td>Description</td></th>"+
               "<tr>"+
                 "<!-- no default namespace inside table cells -->"+
                 "<td><brandName xmlns=''>Huntsman</brandName></td>"+
                 "<td><origin xmlns=''>Bath, UK</origin></td>"+
                 "<td>"+
                   "<details xmlns=''><class>Bitter</class><hop>Fuggles</hop>"+
                     "<pro>Wonderful hop, light alcohol, good summer beer</pro>"+
                     "<con>Fragile; excessive variance pub to pub</con>"+
                     "</details>"+
                    "</td>"+
                  "</tr>"+
                "</table>"+
              "</Beers>";

        useReaderForTesting(str, "");
    }

    public void testNamespaceScope4() throws Exception {
        String str =
            "<Beers>"+
              "<table xmlns:A='A' xmlns:B='B' xmlns='http://www.w3.org/1999/xhtml'>"+
               "<th xmlns:A='A1' xmlns:P='P' xmlns:Q='Q'></th>"+
               "<tr>"+
                 "<td><brandName xmlns:P='P1' xmlns:R='R'>Huntsman</brandName></td>"+
                 "<td><origin xmlns:R='R1'>Bath, UK</origin></td>"+
                 "<td/>"+
               "</tr>"+
               "<th xmlns:B='B1' xmlns:P='P2' xmlns:Q='Q1'></th>"+
              "</table>"+
            "</Beers>";

        useReaderForTesting(str, "", "A", "B", "P", "Q", "R");
    }

    public void testInscopeNamespaces() throws Exception {
        String str =
            "<S:Envelope xmlns:S='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ns4='A'>" +
              "<S:Body xmlns:ns4='http://schemas.xmlsoap.org/soap/envelope/'>" +
                "<S:Fault>" +
                  "<faultcode>ns4:Server</faultcode>" +
                  "<faultstring>com.sun.istack.XMLStreamException2</faultstring>" +
                "</S:Fault>" +
              "</S:Body>" +
            "</S:Envelope>";

        XMLStreamReader rdr = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(str));
        rdr.nextTag();
        rdr.nextTag();
        rdr.nextTag();
       
        MutableXMLStreamBuffer xsb = new MutableXMLStreamBuffer();
        StreamReaderBufferCreator c = new StreamReaderBufferCreator(xsb);

        // preserving inscope namespaces from envelope, and body.
        String[] envNs = new String[] { "S", "http://schemas.xmlsoap.org/soap/envelope/", "ns4", "A" };
        c.storeElement("http://schemas.xmlsoap.org/soap/envelope/", "Envelope", "S", envNs);
        String[] bodyNs = new String[] { "ns4", "http://schemas.xmlsoap.org/soap/envelope/" };
        c.storeElement("http://schemas.xmlsoap.org/soap/envelope/", "Body", "S", bodyNs);
        // Loop all the way for multi payload case
        while(rdr.getEventType() != XMLStreamConstants.END_DOCUMENT){
            String name = rdr.getLocalName();
            if (name.equals("Body")) {
                break;
            }
            c.create(rdr);
        }

        XMLStreamReader rdr1 = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(str));
        XMLStreamReader xsbrdr = xsb.readAsXMLStreamReader();

        compareReaders(rdr1, xsbrdr, "S", "ns4");
    }

    public void testWSDLNamespaces() throws Exception {
        URL wsdl = this.getClass().getClassLoader().getResource("data/header.wsdl");
        System.out.println("WSDL="+wsdl);
        XMLStreamBufferResult xsbr = new XMLStreamBufferResult();
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(true);
        XMLReader xmlReader = spf.newSAXParser().getXMLReader();
        TransformerHandler transformerHandler = ((SAXTransformerFactory) TransformerFactory.newInstance()).newTransformerHandler();
        transformerHandler.setResult(xsbr);
        xmlReader.setContentHandler(transformerHandler);
        xmlReader.parse(wsdl.toExternalForm());

        XMLStreamBuffer xsb = xsbr.getXMLStreamBuffer();

        XMLStreamReader rdr = XMLInputFactory.newInstance().createXMLStreamReader(wsdl.openStream());
        XMLStreamReader xsbrdr = xsb.readAsXMLStreamReader();
        compareReaderQNames(rdr, xsbrdr, "wsdl", "soap", "xsd");
    }

    // FAILS on JDK 1.6.0_04(possibly on all JDK6) but passes on JDK5
    public void testWSDLNamespaces2() throws Exception {
        URL wsdl = this.getClass().getClassLoader().getResource("data/header.wsdl");
        System.out.println("WSDL="+wsdl);
        StreamSource source = new StreamSource(wsdl.openStream());
        XMLStreamBufferResult xsbr = new XMLStreamBufferResult();
        TransformerFactory.newInstance().newTransformer().transform(source, xsbr);
        XMLStreamBuffer xsb = xsbr.getXMLStreamBuffer();

        XMLStreamReader rdr = XMLInputFactory.newInstance().createXMLStreamReader(wsdl.openStream());
        XMLStreamReader xsbrdr = xsb.readAsXMLStreamReader();
        compareReaderQNames(rdr, xsbrdr, "wsdl", "soap", "xsd");
    }


    private void useReaderForTesting(String str, String ... prefixes) throws Exception {

        XMLStreamReader rdr = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(str));
        XMLStreamBuffer xsb = XMLStreamBuffer.createNewBufferFromXMLStreamReader(rdr);
        XMLStreamReader xsbrdr = xsb.readAsXMLStreamReader();
        rdr = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(str));

        compareReaders(rdr, xsbrdr, prefixes);
    }

    private void compareReaderQNames(XMLStreamReader rdr, XMLStreamReader xsbrdr, String... prefixes) throws XMLStreamException {
        while(true) {
            while(rdr.hasNext()) {
                int event = rdr.next();
                if (event == XMLStreamReader.START_ELEMENT || event == XMLStreamReader.END_ELEMENT) {
                    break;
                }
            }
            while(xsbrdr.hasNext()) {
                int event = xsbrdr.next();
                if (event == XMLStreamReader.START_ELEMENT || event == XMLStreamReader.END_ELEMENT) {
                    break;
                }
            }
            if (!rdr.hasNext()) {
                assertTrue(!xsbrdr.hasNext());
                break;
            }
            assertEquals(rdr.getName(), xsbrdr.getName());
            for(String prefix : prefixes) {
                assertEquals(fixNull(rdr.getNamespaceURI(prefix)), fixNull(xsbrdr.getNamespaceURI(prefix)));
            }
        }
    }

    private void compareReaders(XMLStreamReader rdr, XMLStreamReader xsbrdr, String... prefixes) throws XMLStreamException {
        while(rdr.hasNext()) {
            assertTrue(xsbrdr.hasNext());
            int expected = rdr.next();
            int actual = xsbrdr.next();
            assertEquals(expected, actual);
            if (expected == XMLStreamReader.START_ELEMENT || expected == XMLStreamReader.END_ELEMENT) {
                assertEquals(rdr.getName(), xsbrdr.getName());
                for(String prefix : prefixes) {
                    //System.out.println("|"+rdr.getNamespaceURI(prefix)+"|"+xsbrdr.getNamespaceURI(prefix)+"|");
                    assertEquals(fixNull(rdr.getNamespaceURI(prefix)), fixNull(xsbrdr.getNamespaceURI(prefix)));
                }
            }
        }
    }

    private static String fixNull(String s) {
        if (s == null) return "";
        else return s;
    }
}
TOP

Related Classes of com.sun.xml.stream.buffer.stax.OverrideNamespaceTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.