TestNamespaceCopying.java
package stax2.wstream;
import java.io.*;
import java.util.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.*;
import javax.xml.transform.dom.DOMResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
 * Tests that namespaces are written to the output stream in namespace
 * repairing mode. See [WSTX-193] for details.
 *
 * @author Christopher Paul Simmons
 */
public class TestNamespaceCopying
    extends BaseWriterTest
{
    XMLInputFactory _inputFactory;
    XMLOutputFactory _outputFactory;
    XMLEventFactory _eventFactory;
  @Override
  protected void setUp() throws Exception {
      _outputFactory = getOutputFactory();
      setRepairing(_outputFactory, true);
      _eventFactory = getEventFactory();
      _inputFactory = getInputFactory();
  }
  public void testStreamXMLNSDeclaration() throws Exception {
    final StringWriter stringWriter = new StringWriter();
    XMLEventWriter xmlWriter = _outputFactory.createXMLEventWriter(stringWriter);
    xmlWriter.add(_eventFactory.createStartDocument("UFT-8"));
    xmlWriter.add(_eventFactory.createStartElement("foo", "fooNS", "root", Collections.EMPTY_LIST.iterator(), Arrays.asList(_eventFactory.createNamespace("bar", "barNS")).iterator()));
    xmlWriter.add(_eventFactory.createNamespace("baz", "bazNS"));
    xmlWriter.add(_eventFactory.createCharacters("bar:qname"));
    xmlWriter.add(_eventFactory.createEndElement("foo", "fooNS", "root"));
    xmlWriter.add(_eventFactory.createEndDocument());
    // The document is just to inspect the result.
    final Document document = buildDocument(stringWriter.toString());
    Element documentElement = document.getDocumentElement();
    assertEquals("fooNS", getNamespaceForPrefix(documentElement, "foo"));
    // This line fails in 3.2.7
    assertEquals("barNS", getNamespaceForPrefix(documentElement, "bar"));
    assertEquals("bazNS", getNamespaceForPrefix(documentElement, "baz"));
  }
  private String getNamespaceForPrefix(final Element element, final String prefix) {
    return element.getAttributeNS("http://www.w3.org/2000/xmlns/", prefix);
  }
  private Document buildDocument(final String string) throws XMLStreamException, ParserConfigurationException {
    // Less painful to do this using XMLUnit if you use it.
    XMLEventReader reader = _inputFactory.createXMLEventReader(new StringReader(string));
    final DocumentBuilderFactory documentBuilder = DocumentBuilderFactory.newInstance();
    documentBuilder.setNamespaceAware(true);
    final Document document = documentBuilder.newDocumentBuilder().newDocument();
    XMLEventWriter writer = _outputFactory.createXMLEventWriter(new DOMResult(document));
    writer.add(reader);
    return document;
  }
}