1 /*
   2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 package stream.XMLStreamWriterTest;
  25 
  26 import java.io.StringWriter;
  27 
  28 import javax.xml.stream.XMLOutputFactory;
  29 import javax.xml.stream.XMLStreamReader;
  30 import javax.xml.stream.XMLStreamWriter;
  31 
  32 import org.testng.Assert;
  33 import org.testng.annotations.Listeners;
  34 import org.testng.annotations.Test;
  35 
  36 import util.BaseStAXUT;
  37 
  38 /*
  39  * @test
  40  * @bug 6675332
  41  * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
  42  * @run testng/othervm -DrunSecMngr=true stream.XMLStreamWriterTest.Bug6675332Test
  43  * @run testng/othervm stream.XMLStreamWriterTest.Bug6675332Test
  44  * @summary Test XMLStreamWriter writeAttribute when IS_REPAIRING_NAMESPACES is true.
  45  */
  46 @Listeners({jaxp.library.BasePolicy.class})
  47 public class Bug6675332Test extends BaseStAXUT {
  48 
  49     private static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newInstance();
  50 
  51     @Test
  52     public void test() {
  53         final String URL_P1 = "http://p1.org";
  54         final String URL_DEF = "urn:default";
  55         final String ATTR_VALUE = "'value\"";
  56         final String ATTR_VALUE2 = "<tag>";
  57 
  58         final String TEXT = "  some text\n";
  59         XML_OUTPUT_FACTORY.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
  60 
  61         final String EXPECTED_OUTPUT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root></root>";
  62         XMLStreamWriter w = null;
  63         StringWriter strw = new StringWriter();
  64         try {
  65             w = XML_OUTPUT_FACTORY.createXMLStreamWriter(strw);
  66 
  67             w.writeStartDocument();
  68 
  69             /*
  70              * Calling this method should be optional; but if we call it,
  71              * exceptation is that it does properly bind the prefix and URL as
  72              * the 'preferred' combination. In this case we'll just try to make
  73              * URL bound as the default namespace
  74              */
  75             w.setDefaultNamespace(URL_DEF);
  76             w.writeStartElement(URL_DEF, "test"); // root
  77 
  78             /*
  79              * And let's further make element and attribute(s) belong to that
  80              * same namespace
  81              */
  82             w.writeStartElement("", "leaf", URL_DEF); // 1st leaf
  83             w.writeAttribute("", URL_DEF, "attr", ATTR_VALUE);
  84             w.writeAttribute(URL_DEF, "attr2", ATTR_VALUE);
  85             w.writeEndElement();
  86 
  87             // w.writeEmptyElement("", "leaf"); // 2nd leaf; in empty/no
  88             // namespace!
  89 
  90             w.writeStartElement(URL_DEF, "leaf"); // 3rd leaf
  91             // w.writeAttribute("", "attr2", ATTR_VALUE2); // in empty/no
  92             // namespace
  93             w.writeEndElement();
  94 
  95             w.writeEndElement(); // root elem
  96             w.writeEndDocument();
  97             w.close();
  98             System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\\n");
  99             System.out.println(strw.toString());
 100 
 101             // And then let's parse and verify it all:
 102             // System.err.println("testAttributes: doc = '"+strw+"'");
 103 
 104             XMLStreamReader sr = constructNsStreamReader(strw.toString());
 105             assertTokenType(START_DOCUMENT, sr.getEventType(), sr);
 106 
 107             // root element
 108             assertTokenType(START_ELEMENT, sr.next(), sr);
 109             Assert.assertEquals("test", sr.getLocalName());
 110             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 111 
 112             // first leaf:
 113             assertTokenType(START_ELEMENT, sr.next(), sr);
 114             Assert.assertEquals("leaf", sr.getLocalName());
 115             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 116             System.out.println(sr.getAttributeLocalName(0));
 117             System.out.println(sr.getAttributeLocalName(1));
 118             Assert.assertEquals(2, sr.getAttributeCount());
 119             Assert.assertEquals("attr", sr.getAttributeLocalName(0));
 120 
 121             String uri = sr.getAttributeNamespace(0);
 122             if (!URL_DEF.equals(uri)) {
 123                 Assert.fail("Expected attribute 'attr' to have NS '" + URL_DEF + "', was " + valueDesc(uri) + "; input = '" + strw + "'");
 124             }
 125             Assert.assertEquals(ATTR_VALUE, sr.getAttributeValue(0));
 126             assertTokenType(END_ELEMENT, sr.next(), sr);
 127             Assert.assertEquals("leaf", sr.getLocalName());
 128             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 129 
 130             // 2nd/empty leaf
 131             /**
 132              * assertTokenType(START_ELEMENT, sr.next(), sr);
 133              * assertEquals("leaf", sr.getLocalName()); assertNoNsURI(sr);
 134              * assertTokenType(END_ELEMENT, sr.next(), sr); assertEquals("leaf",
 135              * sr.getLocalName()); assertNoNsURI(sr);
 136              */
 137             // third leaf
 138             assertTokenType(START_ELEMENT, sr.next(), sr);
 139             Assert.assertEquals("leaf", sr.getLocalName());
 140             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 141 
 142             /*
 143              * attr in 3rd leaf, in empty/no namespace assertEquals(1,
 144              * sr.getAttributeCount()); assertEquals("attr2",
 145              * sr.getAttributeLocalName(0));
 146              * assertNoAttrNamespace(sr.getAttributeNamespace(0));
 147              * assertEquals(ATTR_VALUE2, sr.getAttributeValue(0));
 148              */
 149             assertTokenType(END_ELEMENT, sr.next(), sr);
 150             Assert.assertEquals("leaf", sr.getLocalName());
 151             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 152 
 153             // closing root element
 154             assertTokenType(END_ELEMENT, sr.next(), sr);
 155             Assert.assertEquals("test", sr.getLocalName());
 156             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 157 
 158             assertTokenType(END_DOCUMENT, sr.next(), sr);
 159         } catch (Exception e) {
 160             e.printStackTrace();
 161             Assert.fail(e.toString());
 162         }
 163 
 164     }
 165 
 166 }