< prev index next >

test/javax/xml/jaxp/unittest/transform/TransformerTest.java

Print this page
rev 959 : 8162598: XSLTC transformer swallows empty namespace declaration which is needed to undeclare default namespace


  45 
  46 import org.testng.Assert;
  47 import org.testng.AssertJUnit;
  48 import org.testng.annotations.Test;
  49 import org.w3c.dom.Document;
  50 import org.w3c.dom.Node;
  51 import org.w3c.dom.NodeList;
  52 import org.xml.sax.ContentHandler;
  53 import org.xml.sax.DTDHandler;
  54 import org.xml.sax.EntityResolver;
  55 import org.xml.sax.ErrorHandler;
  56 import org.xml.sax.InputSource;
  57 import org.xml.sax.SAXException;
  58 import org.xml.sax.SAXNotRecognizedException;
  59 import org.xml.sax.SAXNotSupportedException;
  60 import org.xml.sax.XMLReader;
  61 import org.xml.sax.helpers.AttributesImpl;
  62 
  63 /*
  64  * @summary Transformer Tests
  65  * @bug 6272879 6305029 6505031 8150704
  66  */
  67 public class TransformerTest {
  68     private Transformer createTransformer() throws TransformerException {
  69         return TransformerFactory.newInstance().newTransformer();
  70     }
  71 
  72     private Transformer createTransformerFromInputstream(InputStream xslStream) throws TransformerException {
  73         return TransformerFactory.newInstance().newTransformer(new StreamSource(xslStream));
  74     }
  75 
  76     private Transformer createTransformerFromResource(String xslResource) throws TransformerException {
  77         return TransformerFactory.newInstance().newTransformer(new StreamSource(getClass().getResource(xslResource).toString()));
  78     }
  79 
  80     private Document transformInputStreamToDocument(Transformer transformer, InputStream sourceStream) throws TransformerException {
  81         DOMResult response = new DOMResult();
  82         transformer.transform(new StreamSource(sourceStream), response);
  83         return (Document)response.getNode();
  84     }
  85 


  94      * WARNING: this method adds a final line feed even if the last line of the file doesn't contain one.
  95      *
  96      * @param f
  97      * The file to read
  98      * @return The content of the file as a string, with line terminators as \"n"
  99      * for all platforms
 100      * @throws IOException
 101      * If there was an error reading
 102      */
 103     private String getFileContentAsString(File f) throws IOException {
 104         try (BufferedReader reader = new BufferedReader(new FileReader(f))) {
 105             String line;
 106             StringBuilder sb = new StringBuilder();
 107             while ((line = reader.readLine()) != null) {
 108                 sb.append(line).append("\n");
 109             }
 110             return sb.toString();
 111         }
 112     }
 113 





















 114     private class XMLReaderFor6305029 implements XMLReader {
 115         private static final String NAMESPACES = "http://xml.org/sax/features/namespaces";
 116         private static final String NAMESPACE_PREFIXES = "http://xml.org/sax/features/namespace-prefixes";
 117         private boolean namespaces = true;
 118         private boolean namespacePrefixes = false;
 119         private EntityResolver resolver;
 120         private DTDHandler dtdHandler;
 121         private ContentHandler contentHandler;
 122         private ErrorHandler errorHandler;
 123 
 124         public boolean getFeature(final String name) throws SAXNotRecognizedException, SAXNotSupportedException {
 125             if (name.equals(NAMESPACES)) {
 126                 return namespaces;
 127             } else if (name.equals(NAMESPACE_PREFIXES)) {
 128                 return namespacePrefixes;
 129             } else {
 130                 throw new SAXNotRecognizedException();
 131             }
 132         }
 133 


 232                 "</xsl:template>" + LINE_SEPARATOR +
 233                 "</xsl:stylesheet>";
 234 
 235         final String sourceXml =
 236                 "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + LINE_SEPARATOR +
 237                 // "<!DOCTYPE XMLUtils [" + LINE_SEPARATOR +
 238                 // "<!ELEMENT XMLUtils (test*)>" + LINE_SEPARATOR +
 239                 // "<!ELEMENT test (valeur*)>" + LINE_SEPARATOR +
 240                 // "<!ELEMENT valeur (#PCDATA)>" + LINE_SEPARATOR +
 241                 // "<!ATTLIST valeur attribut CDATA #REQUIRED>]>" +
 242                 // LINE_SEPARATOR +
 243                 "<XMLUtils>" + LINE_SEPARATOR +
 244                 "  <test>" + LINE_SEPARATOR +
 245                 "    <valeur attribut=\"Attribut 1\">Valeur 1</valeur>" + LINE_SEPARATOR +
 246                 "  </test>" + LINE_SEPARATOR +
 247                 "  <test>" + LINE_SEPARATOR +
 248                 "    <valeur attribut=\"Attribut 2\">Valeur 2</valeur>" + LINE_SEPARATOR +
 249                 "  </test>" + LINE_SEPARATOR +
 250                 "</XMLUtils>";
 251 
 252         Document document;
 253         Node node;
 254 
 255         System.out.println("Stylesheet:");
 256         System.out.println("==================================");
 257         System.out.println(xsl);
 258         System.out.println();
 259 
 260         System.out.println("Source file before transformation:");
 261         System.out.println("==================================");
 262         System.out.println(sourceXml);
 263         System.out.println();
 264 
 265         System.out.println("Source file after transformation:");
 266         System.out.println("=================================");
 267         document = transformInputStreamToDocument(createTransformerFromInputstream(new ByteArrayInputStream(xsl.getBytes())),
 268             new ByteArrayInputStream(sourceXml.getBytes()));
 269         OutputFormat format = new OutputFormat();
 270         format.setIndenting(true);
 271         new XMLSerializer(System.out, format).serialize(document);
 272         System.out.println();
 273 
 274         System.out.println("Node content for element valeur2:");
 275         System.out.println("=================================");
 276         NodeList nodes = document.getElementsByTagName("valeur2");
 277         nodes = document.getElementsByTagName("valeur2");
 278         for (int i = 0; i < nodes.getLength(); i++) {
 279             node = nodes.item(i);
 280             System.out.println("  Node value: " + node.getFirstChild().getNodeValue());
 281             System.out.println("  Node attribute: " + node.getAttributes().item(0).getNodeValue());
 282 
 283             AssertJUnit.assertEquals("Node value mismatch", "Valeur " + (i + 1), node.getFirstChild().getNodeValue());
 284             AssertJUnit.assertEquals("Node attribute mismatch", "Attribut " + (i + 1), node.getAttributes().item(0).getNodeValue());
 285         }
 286     }
 287 
 288     /*
 289      * @bug 6305029
 290      * @summary Test for JDK-6305029
 291      */
 292     @Test
 293     public final void testBug6305029() throws TransformerException {
 294         final String XML_DOCUMENT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<prefix:localName xmlns:prefix=\"namespaceUri\"/>";
 295 
 296         // test SAXSource
 297         SAXSource saxSource = new SAXSource(new XMLReaderFor6305029(), new InputSource());
 298         StringWriter resultWriter = new StringWriter();
 299         createTransformer().transform(saxSource, new StreamResult(resultWriter));


 323      * @bug 8150704
 324      * @summary Test that XSL transformation with lots of temporary result trees will not run out of DTM IDs.
 325      */
 326     @Test
 327     public final void testBug8150704() throws TransformerException, IOException {
 328         System.out.println("Testing transformation of Bug8150704-1.xml...");
 329         Transformer transformer = createTransformerFromResource("Bug8150704-1.xsl");
 330         StringWriter result = transformResourceToStringWriter(transformer, "Bug8150704-1.xml");
 331         String resultstring = result.toString().replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n");
 332         String reference = getFileContentAsString(new File(getClass().getResource("Bug8150704-1.ref").getPath()));
 333         Assert.assertEquals(resultstring, reference, "Output of transformation of Bug8150704-1.xml does not match reference");
 334         System.out.println("Passed.");
 335 
 336         System.out.println("Testing transformation of Bug8150704-2.xml...");
 337         transformer = createTransformerFromResource("Bug8150704-2.xsl");
 338         result = transformResourceToStringWriter(transformer, "Bug8150704-2.xml");
 339         resultstring = result.toString().replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n");
 340         reference = getFileContentAsString(new File(getClass().getResource("Bug8150704-2.ref").getPath()));
 341         Assert.assertEquals(resultstring, reference, "Output of transformation of Bug8150704-2.xml does not match reference");
 342         System.out.println("Passed.");


























































 343     }
 344 }


  45 
  46 import org.testng.Assert;
  47 import org.testng.AssertJUnit;
  48 import org.testng.annotations.Test;
  49 import org.w3c.dom.Document;
  50 import org.w3c.dom.Node;
  51 import org.w3c.dom.NodeList;
  52 import org.xml.sax.ContentHandler;
  53 import org.xml.sax.DTDHandler;
  54 import org.xml.sax.EntityResolver;
  55 import org.xml.sax.ErrorHandler;
  56 import org.xml.sax.InputSource;
  57 import org.xml.sax.SAXException;
  58 import org.xml.sax.SAXNotRecognizedException;
  59 import org.xml.sax.SAXNotSupportedException;
  60 import org.xml.sax.XMLReader;
  61 import org.xml.sax.helpers.AttributesImpl;
  62 
  63 /*
  64  * @summary Transformer Tests
  65  * @bug 6272879 6305029 6505031 8150704 8162598 8162598
  66  */
  67 public class TransformerTest {
  68     private Transformer createTransformer() throws TransformerException {
  69         return TransformerFactory.newInstance().newTransformer();
  70     }
  71 
  72     private Transformer createTransformerFromInputstream(InputStream xslStream) throws TransformerException {
  73         return TransformerFactory.newInstance().newTransformer(new StreamSource(xslStream));
  74     }
  75 
  76     private Transformer createTransformerFromResource(String xslResource) throws TransformerException {
  77         return TransformerFactory.newInstance().newTransformer(new StreamSource(getClass().getResource(xslResource).toString()));
  78     }
  79 
  80     private Document transformInputStreamToDocument(Transformer transformer, InputStream sourceStream) throws TransformerException {
  81         DOMResult response = new DOMResult();
  82         transformer.transform(new StreamSource(sourceStream), response);
  83         return (Document)response.getNode();
  84     }
  85 


  94      * WARNING: this method adds a final line feed even if the last line of the file doesn't contain one.
  95      *
  96      * @param f
  97      * The file to read
  98      * @return The content of the file as a string, with line terminators as \"n"
  99      * for all platforms
 100      * @throws IOException
 101      * If there was an error reading
 102      */
 103     private String getFileContentAsString(File f) throws IOException {
 104         try (BufferedReader reader = new BufferedReader(new FileReader(f))) {
 105             String line;
 106             StringBuilder sb = new StringBuilder();
 107             while ((line = reader.readLine()) != null) {
 108                 sb.append(line).append("\n");
 109             }
 110             return sb.toString();
 111         }
 112     }
 113 
 114     private void checkNodeNS8162598(Node test, String nstest, String nsb, String nsc) {
 115         String testNodeName = test.getNodeName();
 116         if (nstest == null) {
 117             Assert.assertNull(test.getNamespaceURI(), "unexpected namespace for " + testNodeName);
 118         } else {
 119             Assert.assertEquals(test.getNamespaceURI(), nstest, "unexpected namespace for " + testNodeName);
 120         }
 121         Node b = test.getChildNodes().item(0);
 122         if (nsb == null) {
 123             Assert.assertNull(b.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b");
 124         } else {
 125             Assert.assertEquals(b.getNamespaceURI(), nsb, "unexpected namespace for " + testNodeName + "->b");
 126         }
 127         Node c = b.getChildNodes().item(0);
 128         if (nsc == null) {
 129             Assert.assertNull(c.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b->c");
 130         } else {
 131             Assert.assertEquals(c.getNamespaceURI(), nsc, "unexpected namespace for " + testNodeName + "->b->c");
 132         }
 133     }
 134 
 135     private class XMLReaderFor6305029 implements XMLReader {
 136         private static final String NAMESPACES = "http://xml.org/sax/features/namespaces";
 137         private static final String NAMESPACE_PREFIXES = "http://xml.org/sax/features/namespace-prefixes";
 138         private boolean namespaces = true;
 139         private boolean namespacePrefixes = false;
 140         private EntityResolver resolver;
 141         private DTDHandler dtdHandler;
 142         private ContentHandler contentHandler;
 143         private ErrorHandler errorHandler;
 144 
 145         public boolean getFeature(final String name) throws SAXNotRecognizedException, SAXNotSupportedException {
 146             if (name.equals(NAMESPACES)) {
 147                 return namespaces;
 148             } else if (name.equals(NAMESPACE_PREFIXES)) {
 149                 return namespacePrefixes;
 150             } else {
 151                 throw new SAXNotRecognizedException();
 152             }
 153         }
 154 


 253                 "</xsl:template>" + LINE_SEPARATOR +
 254                 "</xsl:stylesheet>";
 255 
 256         final String sourceXml =
 257                 "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + LINE_SEPARATOR +
 258                 // "<!DOCTYPE XMLUtils [" + LINE_SEPARATOR +
 259                 // "<!ELEMENT XMLUtils (test*)>" + LINE_SEPARATOR +
 260                 // "<!ELEMENT test (valeur*)>" + LINE_SEPARATOR +
 261                 // "<!ELEMENT valeur (#PCDATA)>" + LINE_SEPARATOR +
 262                 // "<!ATTLIST valeur attribut CDATA #REQUIRED>]>" +
 263                 // LINE_SEPARATOR +
 264                 "<XMLUtils>" + LINE_SEPARATOR +
 265                 "  <test>" + LINE_SEPARATOR +
 266                 "    <valeur attribut=\"Attribut 1\">Valeur 1</valeur>" + LINE_SEPARATOR +
 267                 "  </test>" + LINE_SEPARATOR +
 268                 "  <test>" + LINE_SEPARATOR +
 269                 "    <valeur attribut=\"Attribut 2\">Valeur 2</valeur>" + LINE_SEPARATOR +
 270                 "  </test>" + LINE_SEPARATOR +
 271                 "</XMLUtils>";
 272 



 273         System.out.println("Stylesheet:");
 274         System.out.println("=============================");
 275         System.out.println(xsl);
 276         System.out.println();
 277 
 278         System.out.println("Source before transformation:");
 279         System.out.println("=============================");
 280         System.out.println(sourceXml);
 281         System.out.println();
 282 
 283         System.out.println("Result after transformation:");
 284         System.out.println("============================");
 285         Document document = transformInputStreamToDocument(createTransformerFromInputstream(new ByteArrayInputStream(xsl.getBytes())),
 286             new ByteArrayInputStream(sourceXml.getBytes()));
 287         OutputFormat format = new OutputFormat();
 288         format.setIndenting(true);
 289         new XMLSerializer(System.out, format).serialize(document);
 290         System.out.println();
 291 
 292         System.out.println("Node content for element valeur2:");
 293         System.out.println("=================================");
 294         NodeList nodes = document.getElementsByTagName("valeur2");

 295         for (int i = 0; i < nodes.getLength(); i++) {
 296             Node node = nodes.item(i);
 297             System.out.println("  Node value: " + node.getFirstChild().getNodeValue());
 298             System.out.println("  Node attribute: " + node.getAttributes().item(0).getNodeValue());
 299 
 300             AssertJUnit.assertEquals("Node value mismatch", "Valeur " + (i + 1), node.getFirstChild().getNodeValue());
 301             AssertJUnit.assertEquals("Node attribute mismatch", "Attribut " + (i + 1), node.getAttributes().item(0).getNodeValue());
 302         }
 303     }
 304 
 305     /*
 306      * @bug 6305029
 307      * @summary Test for JDK-6305029
 308      */
 309     @Test
 310     public final void testBug6305029() throws TransformerException {
 311         final String XML_DOCUMENT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<prefix:localName xmlns:prefix=\"namespaceUri\"/>";
 312 
 313         // test SAXSource
 314         SAXSource saxSource = new SAXSource(new XMLReaderFor6305029(), new InputSource());
 315         StringWriter resultWriter = new StringWriter();
 316         createTransformer().transform(saxSource, new StreamResult(resultWriter));


 340      * @bug 8150704
 341      * @summary Test that XSL transformation with lots of temporary result trees will not run out of DTM IDs.
 342      */
 343     @Test
 344     public final void testBug8150704() throws TransformerException, IOException {
 345         System.out.println("Testing transformation of Bug8150704-1.xml...");
 346         Transformer transformer = createTransformerFromResource("Bug8150704-1.xsl");
 347         StringWriter result = transformResourceToStringWriter(transformer, "Bug8150704-1.xml");
 348         String resultstring = result.toString().replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n");
 349         String reference = getFileContentAsString(new File(getClass().getResource("Bug8150704-1.ref").getPath()));
 350         Assert.assertEquals(resultstring, reference, "Output of transformation of Bug8150704-1.xml does not match reference");
 351         System.out.println("Passed.");
 352 
 353         System.out.println("Testing transformation of Bug8150704-2.xml...");
 354         transformer = createTransformerFromResource("Bug8150704-2.xsl");
 355         result = transformResourceToStringWriter(transformer, "Bug8150704-2.xml");
 356         resultstring = result.toString().replaceAll("\\r\\n", "\n").replaceAll("\\r", "\n");
 357         reference = getFileContentAsString(new File(getClass().getResource("Bug8150704-2.ref").getPath()));
 358         Assert.assertEquals(resultstring, reference, "Output of transformation of Bug8150704-2.xml does not match reference");
 359         System.out.println("Passed.");
 360     }
 361 
 362     /*
 363      * @bug 8162598
 364      * @summary Test XSLTC handling of namespaces, especially empty namespace definitions to reset the
 365      *          default namespace
 366      */
 367     @Test
 368     public final void testBug8162598() throws IOException, TransformerException {
 369         final String LINE_SEPARATOR = System.getProperty("line.separator");
 370 
 371         final String xsl =
 372             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + LINE_SEPARATOR +
 373             "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">" + LINE_SEPARATOR +
 374             "    <xsl:template match=\"/\">" + LINE_SEPARATOR +
 375             "        <root xmlns=\"ns1\">" + LINE_SEPARATOR +
 376             "            <xsl:call-template name=\"transform\"/>" + LINE_SEPARATOR +
 377             "        </root>" + LINE_SEPARATOR +
 378             "    </xsl:template>" + LINE_SEPARATOR +
 379             "    <xsl:template name=\"transform\">" + LINE_SEPARATOR +
 380             "        <test1 xmlns=\"ns2\"><b xmlns=\"ns2\"><c xmlns=\"\"></c></b></test1>" + LINE_SEPARATOR +
 381             "        <test2 xmlns=\"ns1\"><b xmlns=\"ns2\"><c xmlns=\"\"></c></b></test2>" + LINE_SEPARATOR +
 382             "        <test3><b><c xmlns=\"\"></c></b></test3>" + LINE_SEPARATOR +
 383             "        <test4 xmlns=\"\"><b><c xmlns=\"\"></c></b></test4>" + LINE_SEPARATOR +
 384             "        <test5 xmlns=\"ns1\"><b><c xmlns=\"\"></c></b></test5>" + LINE_SEPARATOR +
 385             "        <test6 xmlns=\"\"/>" + LINE_SEPARATOR +
 386             "    </xsl:template>" + LINE_SEPARATOR +
 387             "</xsl:stylesheet>";
 388 
 389 
 390         final String sourceXml =
 391                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><aaa></aaa>" + LINE_SEPARATOR;
 392 
 393         System.out.println("Stylesheet:");
 394         System.out.println("=============================");
 395         System.out.println(xsl);
 396         System.out.println();
 397 
 398         System.out.println("Source before transformation:");
 399         System.out.println("=============================");
 400         System.out.println(sourceXml);
 401         System.out.println();
 402 
 403         System.out.println("Result after transformation:");
 404         System.out.println("============================");
 405         Document document = transformInputStreamToDocument(
 406             createTransformerFromInputstream(new ByteArrayInputStream(xsl.getBytes())),
 407                                              new ByteArrayInputStream(sourceXml.getBytes()));
 408         OutputFormat format = new OutputFormat();
 409         format.setIndenting(true);
 410         new XMLSerializer(System.out, format).serialize(document);
 411         System.out.println();
 412         checkNodeNS8162598(document.getElementsByTagName("test1").item(0), "ns2", "ns2", null);
 413         checkNodeNS8162598(document.getElementsByTagName("test2").item(0), "ns1", "ns2", null);
 414         checkNodeNS8162598(document.getElementsByTagName("test3").item(0), null, null, null);
 415         checkNodeNS8162598(document.getElementsByTagName("test4").item(0), null, null, null);
 416         checkNodeNS8162598(document.getElementsByTagName("test5").item(0), "ns1", "ns1", null);
 417         Assert.assertNull(document.getElementsByTagName("test6").item(0).getNamespaceURI(), "unexpected namespace for test6");
 418     }
 419 }
< prev index next >