diff --git a/build.xml b/build.xml
index b48d8853d1..b74fe78f38 100644
--- a/build.xml
+++ b/build.xml
@@ -844,7 +844,8 @@ Authors:
- -->
+ -->
+
diff --git a/tests/dom/serialize/TestNS.java b/tests/dom/serialize/TestNS.java
index 930102b62b..c6c9968e32 100644
--- a/tests/dom/serialize/TestNS.java
+++ b/tests/dom/serialize/TestNS.java
@@ -17,402 +17,112 @@
package dom.serialize;
-import java.io.FileOutputStream;
+import java.io.ByteArrayOutputStream;
+import junit.framework.TestCase;
import org.apache.xerces.dom.DOMImplementationImpl;
import org.apache.xerces.dom.DOMOutputImpl;
-import org.apache.xerces.parsers.DOMParser;
+import org.apache.xerces.dom.DocumentImpl;
import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
/**
* This class is testing namespace algorithm during serialization.
- * The class takes as a parameter xml document, parses it using the DOM parser.
- * By default it will perform modifications to the tree, and then serialize
- * the document using LSSerializer.
+ * Creates an in-memory DOM document, modifies the tree, and serializes
+ * using LSSerializer, verifying that the output contains expected
+ * namespace declarations.
*
* @author Elena Litani, IBM
* @version $Id$
*/
-public class TestNS {
- public static void main( String[] argv) {
- try {
-
- System.out.println("DOM Serializer test for namespace algorithm.");
- DOMParser parser = new DOMParser();
- LSOutput dOut = new DOMOutputImpl();
-
- if (argv.length == 0) {
- printUsage();
- System.exit(1);
- }
- int repetition = 0;
- boolean namespaces = true;
- boolean validation = false;
- boolean schemaValidation = false;
- boolean deferred = true;
- boolean modify = true;
- boolean stdout = false;
- boolean createEntity = true;
- for (int i = 0; i < argv.length; i++) {
- String arg = argv[i];
- if (arg.startsWith("-")) {
- String option = arg.substring(1);
- if (option.equals("x")) {
- if (++i == argv.length) {
- System.err.println("error: Missing argument to -x option.");
- continue;
- }
- String number = argv[i];
- try {
- int value = Integer.parseInt(number);
- if (value < 1) {
- System.err.println("error: Repetition must be at least 1.");
- continue;
- }
- repetition = value;
- } catch (NumberFormatException e) {
- System.err.println("error: invalid number ("+number+").");
- }
- continue;
- }
-
- if (option.equalsIgnoreCase("d")) {
- deferred = option.equals("d");
- continue;
- }
-
- if (option.equalsIgnoreCase("e")) {
- createEntity = option.equals("e");
- continue;
- }
- if (option.equalsIgnoreCase("n")) {
- namespaces = option.equals("n");
- continue;
- }
- if (option.equalsIgnoreCase("v")) {
- validation = option.equals("v");
- continue;
- }
- if (option.equalsIgnoreCase("s")) {
- schemaValidation = option.equals("s");
- continue;
- }
- if (option.equalsIgnoreCase("m")) {
- modify = option.equals("m");
- continue;
- }
- if (option.equalsIgnoreCase("o")) {
- stdout = option.equals("o");
- continue;
- }
- }
- parser.setFeature( "http://xml.org/sax/features/validation", validation );
- parser.setFeature( "http://apache.org/xml/features/dom/defer-node-expansion", deferred);
- //parser.setFeature("http://xml.org/sax/features/external-general-entities", true);
- parser.setFeature( "http://xml.org/sax/features/namespaces",namespaces);
- parser.setFeature("http://apache.org/xml/features/dom/include-ignorable-whitespace", true);
- parser.setFeature("http://apache.org/xml/features/dom/create-entity-ref-nodes", createEntity);
- parser.parse( argv[i] );
-
- Document core = parser.getDocument();
- DocumentType doctype = core.getDoctype();
- if (doctype !=null) {
-
- NamedNodeMap entities = doctype.getEntities();
- if (entities!=null) {
- Node entity = entities.getNamedItem("book");
- if (entity != null) {
- System.out.println("ENTITY book="+entity.getNodeValue());
- Node child = entity.getFirstChild();
- while (child != null) {
- System.out.println("==>child: '"+child.getNodeName()+"' " + child.getNodeValue());
- child = child.getNextSibling();
- }
-
- }
- }
- }
-
- if (modify) {
-
- System.out.println("Modifying document...");
- if (namespaces) {
-
- NodeList ls2 = core.getElementsByTagName("empty");
- Node testElem = ls2.item(0);
- // testing empty element
- if (testElem !=null) {
- NamedNodeMap testAttr = testElem.getAttributes();
- testAttr.removeNamedItemNS("http://www.w3.org/2000/xmlns/", "xmlns");
- }
- }
- Element root = core.getDocumentElement();
- // find first element child
- Node element = root.getFirstChild();
- while (element!=null && element.getNodeType() != Node.ELEMENT_NODE) {
- element = element.getNextSibling();
- }
- if (element == null) {
- System.err.println("Test failed: no element node was found.");
- System.exit(1);
- } else {
- System.out.println("Modifying information for the element: "+element.getNodeName());
- }
-
-
- element.appendChild(core.createComment("attributes: make sure that NS* prefix is created"));
- element.appendChild(core.createTextNode("\n"));
- Element e1 = core.createElementNS(null, "root");
- element.appendChild(e1);
- e1.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xx", "foo");
- e1.setAttributeNS("http://rsa2", "xx:attr", "value");
- element.appendChild(e1);
- element.appendChild(core.createTextNode("\n\n"));
-
-
- // add element in same scope
- element.appendChild(core.createComment("add element in the same scope"));
- element.appendChild(core.createTextNode("\n"));
- element.appendChild(core.createElementNS("urn:schemas-xmlsoap-org:soap.v1","s:child1"));
- element.appendChild(core.createTextNode("\n\n"));
-
-
- // add element with s bound to different namespace
- element.appendChild(core.createComment("add element with s bound to different namespace"));
- element.appendChild(core.createTextNode("\n"));
- element.appendChild(core.createElementNS("http://child2","s:child2"));
- element.appendChild(core.createTextNode("\n\n"));
-
- // add element with no prefix bound to different scope than default prefix
- element.appendChild(core.createComment("add element with no prefix bound to different scope than default prefix"));
- element.appendChild(core.createTextNode("\n"));
- element.appendChild(core.createElementNS("http://child3/default","child3"));
- element.appendChild(core.createTextNode("\n\n"));
-
-
- element.appendChild(core.createComment("add element no prefix no namespace"));
- element.appendChild(core.createTextNode("\n"));
- element.appendChild(core.createElementNS(null,"child4"));
- element.appendChild(core.createTextNode("\n\n"));
-
- element.appendChild(core.createComment("make sure only one 'xmlns:m1'declaration appears not several"));
- element.appendChild(core.createTextNode("\n"));
- e1 = core.createElementNS("http://rsa", "m1:root");
- element.appendChild(e1);
- Element e2 = core.createElementNS("http://rsa", "m1:e1");
- e2.setAttributeNS("http://rsa", "m1:a1", "v");
- e2.setAttributeNS("http://rsa2", "m2:a2", "v");
- e1.appendChild(e2);
- element.appendChild(core.createTextNode("\n\n"));
-
-
- Text text;
- // add xmlns attribute
- element.appendChild(core.createComment("create element: prefix bound to http://child7,"
- +" local declaration of xmlns:prefix = http://child8"));
- element.appendChild(core.createTextNode("\n"));
- Element elm = core.createElementNS("http://child7","prefix:child7");
- Attr attr = core.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:prefix");
- attr.setValue("http://child8");
- elm.setAttributeNode(attr);
- element.appendChild(elm);
- element.appendChild(core.createTextNode("\n\n"));
-
-
- // add element with empty string as uri
- element.appendChild(core.createComment("add child5, uri=null, xmlns:p=emptyStr (invalid)"));
- element.appendChild(core.createTextNode("\n"));
- elm = core.createElementNS(null,"child5");
- attr = core.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:p");
- attr.setValue(null);
- elm.setAttributeNode(attr);
- element.appendChild(elm);
- element.appendChild(core.createTextNode("\n\n"));
-
-
-
- // add 2 xmlns attribute
- element.appendChild(core.createComment("create element: with 2 xmlns"));
- element.appendChild(core.createTextNode("\n"));
- elm = core.createElementNS("http://child6","child6");
- attr = core.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns");
- attr.setValue("http://default");
- elm.setAttributeNode(attr);
-
- attr = core.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns");
- attr.setValue("http://default2");
- elm.setAttributeNode(attr);
- element.appendChild(elm);
- element.appendChild(core.createTextNode("\n\n"));
-
-
- // work on attributes algorithm
- element.appendChild(core.createComment("\n1) attr3 (with no prefix) and bound to http://attr3 (that is not declared)."+
- "\n2) attr1 attribute with null namespace"+
- "\n3) attr2 with declared s - no change\n"));
- element.appendChild(core.createTextNode("\n"));
- elm = core.createElementNS("urn:schemas-xmlsoap-org:soap.v1","s:testAttributes");
-
- attr = core.createAttributeNS(null, "attr1");
- elm.setAttributeNode(attr);
-
- attr = core.createAttributeNS("urn:schemas-xmlsoap-org:soap.v1", "s:attr2");
- elm.setAttributeNode(attr);
-
- attr = core.createAttributeNS("http://attr3", "attr3");
- elm.setAttributeNode(attr);
- element.appendChild(elm);
- element.appendChild(core.createTextNode("\n\n"));
-
- /*
- element.appendChild(core.createComment("NON-WELLFORMED! xml:space attribute, \ndoml1 valid/invalid namespace declarations, \ndoml2 invalid declarations xmlns:foo=\"\""));
- element.appendChild(core.createTextNode("\n"));
- elm = core.createElementNS(null,"spaces");
- attr = core.createAttributeNS("http://www.w3.org/XML/1998/namespace", "boo:space");
- elm.setAttributeNode(attr);
- attr = core.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:foo");
- elm.setAttributeNode(attr);
-
- attr = core.createAttribute("s:level1Node");
- elm.setAttributeNode(attr);
-
- attr = core.createAttribute("xmlns:");
- elm.setAttributeNode(attr);
- attr = core.createAttribute("xmlns:k");
- elm.setAttributeNode(attr);
- attr = core.createAttribute("xmlns:k:d");
- elm.setAttributeNode(attr);
-
- element.appendChild(elm);
- element.appendChild(core.createTextNode("\n\n"));
- */
-
-
- // more attributes tests
-
- element.appendChild(core.createComment("\n1) attr_B with no prefix and http://attr_B"+
- "\n2) attr_A had no prefix and http://attr_A. There is local default decl bound to the same namespace"));
- element.appendChild(core.createTextNode("\n"));
- elm = core.createElementNS("urn:schemas-xmlsoap-org:soap.v1","s:testAttributes2");
- attr = core.createAttributeNS("http://attr_A", "attr_A");
- elm.setAttributeNode(attr);
- attr = core.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns");
- attr.setValue("http://attr_A");
- elm.setAttributeNode(attr);
-
-
- attr = core.createAttributeNS("http://attr_B", "attr_B");
- elm.setAttributeNode(attr);
- element.appendChild(elm);
-
- element.appendChild(core.createTextNode("\n"));
-
-
- }
-
- //((CoreDocumentImpl)core).normalizeDocument();
-
-
- /*
- OutputFormat format = new OutputFormat((Document)core);
- format.setLineSeparator(LineSeparator.Windows);
- format.setIndenting(true);
- format.setLineWidth(0);
- format.setPreserveSpace(true);
- */
-
-
- // create DOM Serializer
- LSSerializer writer = ((DOMImplementationLS)DOMImplementationImpl.getDOMImplementation()).createLSSerializer();
-
-
- // Serializer that ouputs tree in not pretty print format
- if (stdout) {
-
- //XMLSerializer serializer = new XMLSerializer(System.out, format);
- //serializer.asDOMSerializer();
- //serializer.serialize((Document)core);
- //writer.setFeature("entities",true);
- //writer.writeNode(System.out, core);
- dOut.setByteStream(System.out);
- writer.write(core,dOut);
- } else {
-
- System.out.println("Serializing output to output.xml...");
- //XMLSerializer toFile = new XMLSerializer (new FileWriter("output.xml"), format);
- //toFile.asDOMSerializer();
- //toFile.serialize((Document)core);
- dOut.setByteStream(new FileOutputStream("output.xml"));
- writer.write(core,dOut);
- }
-
- /** Test SAX Serializer
- System.out.println("Testing SAX Serializer...");
- XMLSerializer saxSerializer;
- if (stdout) {
- saxSerializer = new XMLSerializer (System.out, format);
- } else {
- saxSerializer = new XMLSerializer (new FileWriter("sax_output.xml"), format);
- }
-
- format.setEncoding("US-ASCII");
- saxSerializer.startDocument();
- //saxSerializer.processingInstruction("foo", "bar");
- saxSerializer.startDTD("foo", "bar", "baz");
- saxSerializer.startElement("myNamespace", "a", "foo:a", null);
- saxSerializer.startElement("myNamespace", "b", "foo:b", null);
- saxSerializer.startCDATA();
- char data[] = {'a', ']', ']', '>', '\u0089', 'n'};
-
- saxSerializer.characters(data, 0, 6);
- saxSerializer.endCDATA();
- saxSerializer.comment("A & B");
- saxSerializer.startElement("myNamespace", "c", "foo:c", null);
- saxSerializer.endElement("myNamespace", "c", "foo:c");
- saxSerializer.endElement("myNamespace", "b", "foo:b");
-
- saxSerializer.endElement("myNamespace", "a", "foo:a");
- saxSerializer.endDocument();
- System.out.println("Serializing output to sax_output.xml...");
- */
-
- }
-
-
- } catch (Exception ex) {
- ex.printStackTrace();
- }
-
+public class TestNS extends TestCase {
+
+ public void testNamespaceSerialization() throws Exception {
+ DocumentImpl doc = new DocumentImpl();
+ Element root = doc.createElementNS("http://ns", "root");
+ doc.appendChild(root);
+
+ Element e1 = doc.createElementNS(null, "root");
+ root.appendChild(e1);
+ e1.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xx", "foo");
+ e1.setAttributeNS("http://rsa2", "xx:attr", "value");
+
+ root.appendChild(doc.createElementNS("urn:schemas-xmlsoap-org:soap.v1", "s:child1"));
+
+ root.appendChild(doc.createElementNS("http://child2", "s:child2"));
+
+ root.appendChild(doc.createElementNS("http://child3/default", "child3"));
+
+ root.appendChild(doc.createElementNS(null, "child4"));
+
+ e1 = doc.createElementNS("http://rsa", "m1:root");
+ root.appendChild(e1);
+ Element e2 = doc.createElementNS("http://rsa", "m1:e1");
+ e2.setAttributeNS("http://rsa", "m1:a1", "v");
+ e2.setAttributeNS("http://rsa2", "m2:a2", "v");
+ e1.appendChild(e2);
+
+ Element elm = doc.createElementNS("http://child7", "prefix:child7");
+ Attr attr = doc.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:prefix");
+ attr.setValue("http://child8");
+ elm.setAttributeNode(attr);
+ root.appendChild(elm);
+
+ elm = doc.createElementNS(null, "child5");
+ attr = doc.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:p");
+ attr.setValue(null);
+ elm.setAttributeNode(attr);
+ root.appendChild(elm);
+
+ elm = doc.createElementNS("http://child6", "child6");
+ attr = doc.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns");
+ attr.setValue("http://default");
+ elm.setAttributeNode(attr);
+ attr = doc.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns");
+ attr.setValue("http://default2");
+ elm.setAttributeNode(attr);
+ root.appendChild(elm);
+
+ elm = doc.createElementNS("urn:schemas-xmlsoap-org:soap.v1", "s:testAttributes");
+ attr = doc.createAttributeNS(null, "attr1");
+ elm.setAttributeNode(attr);
+ attr = doc.createAttributeNS("urn:schemas-xmlsoap-org:soap.v1", "s:attr2");
+ elm.setAttributeNode(attr);
+ attr = doc.createAttributeNS("http://attr3", "attr3");
+ elm.setAttributeNode(attr);
+ root.appendChild(elm);
+
+ elm = doc.createElementNS("urn:schemas-xmlsoap-org:soap.v1", "s:testAttributes2");
+ attr = doc.createAttributeNS("http://attr_A", "attr_A");
+ elm.setAttributeNode(attr);
+ attr = doc.createAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns");
+ attr.setValue("http://attr_A");
+ elm.setAttributeNode(attr);
+ attr = doc.createAttributeNS("http://attr_B", "attr_B");
+ elm.setAttributeNode(attr);
+ root.appendChild(elm);
+
+ LSSerializer writer = ((DOMImplementationLS) DOMImplementationImpl.getDOMImplementation()).createLSSerializer();
+ LSOutput dOut = new DOMOutputImpl();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ dOut.setByteStream(baos);
+ writer.write(doc, dOut);
+
+ String output = baos.toString("UTF-8");
+ assertTrue("Output should contain xmlns: declarations", output.contains("xmlns"));
+ assertTrue("Output should contain namespace http://rsa2", output.contains("http://rsa2"));
+ assertTrue("Output should contain s:child1", output.contains("s:child1"));
+ assertTrue("Output should contain s:child2", output.contains("s:child2"));
+ assertTrue("Output should contain child3", output.contains("child3"));
+ assertTrue("Output should contain child4", output.contains("child4"));
+ assertTrue("Output should contain m1:root", output.contains("m1:root"));
+ assertTrue("Output should contain m1:e1", output.contains("m1:e1"));
+ assertTrue("Output should contain prefix:child7", output.contains("prefix:child7"));
+ assertTrue("Output should contain xmlns:prefix", output.contains("xmlns:prefix"));
+ assertTrue("Output should contain s:testAttributes", output.contains("s:testAttributes"));
+ assertTrue("Output should contain s:testAttributes2", output.contains("s:testAttributes2"));
}
-
- private static void printUsage() {
-
- System.err.println("usage: java dom.serialize.TestNS (options) uri ...");
- System.err.println();
-
- System.err.println("options:");
- System.err.println(" -x number Select number of repetitions.");
- System.err.println(" NOTE: Requires use of -n.");
- System.err.println(" -o | -O Turn on/off serialization to standard output.");
- System.err.println(" -m | -M Turn on/off document modification.");
- System.err.println(" -n | -N Turn on/off namespace processing.");
- System.err.println(" -v | -V Turn on/off validation.");
- System.err.println(" -s | -S Turn on/off Schema validation support.");
- System.err.println();
-
-
-
- } // printUsage()
}
-
-