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.Test;
  34 
  35 import util.BaseStAXUT;
  36 
  37 /*
  38  * @bug 6675332
  39  * @summary Test XMLStreamWriter writeAttribute when IS_REPAIRING_NAMESPACES is true.
  40  */
  41 public class Bug6675332Test extends BaseStAXUT {
  42 
  43     private static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newInstance();
  44 
  45     @Test
  46     public void test() {
  47         final String URL_P1 = "http://p1.org";
  48         final String URL_DEF = "urn:default";
  49         final String ATTR_VALUE = "'value\"";
  50         final String ATTR_VALUE2 = "<tag>";
  51 
  52         final String TEXT = "  some text\n";
  53         XML_OUTPUT_FACTORY.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
  54 
  55         final String EXPECTED_OUTPUT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root></root>";
  56         XMLStreamWriter w = null;
  57         StringWriter strw = new StringWriter();
  58         try {
  59             w = XML_OUTPUT_FACTORY.createXMLStreamWriter(strw);
  60 
  61             w.writeStartDocument();
  62 
  63             /*
  64              * Calling this method should be optional; but if we call it,
  65              * exceptation is that it does properly bind the prefix and URL as
  66              * the 'preferred' combination. In this case we'll just try to make
  67              * URL bound as the default namespace
  68              */
  69             w.setDefaultNamespace(URL_DEF);
  70             w.writeStartElement(URL_DEF, "test"); // root
  71 
  72             /*
  73              * And let's further make element and attribute(s) belong to that
  74              * same namespace
  75              */
  76             w.writeStartElement("", "leaf", URL_DEF); // 1st leaf
  77             w.writeAttribute("", URL_DEF, "attr", ATTR_VALUE);
  78             w.writeAttribute(URL_DEF, "attr2", ATTR_VALUE);
  79             w.writeEndElement();
  80 
  81             // w.writeEmptyElement("", "leaf"); // 2nd leaf; in empty/no
  82             // namespace!
  83 
  84             w.writeStartElement(URL_DEF, "leaf"); // 3rd leaf
  85             // w.writeAttribute("", "attr2", ATTR_VALUE2); // in empty/no
  86             // namespace
  87             w.writeEndElement();
  88 
  89             w.writeEndElement(); // root elem
  90             w.writeEndDocument();
  91             w.close();
  92             System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\\n");
  93             System.out.println(strw.toString());
  94 
  95             // And then let's parse and verify it all:
  96             // System.err.println("testAttributes: doc = '"+strw+"'");
  97 
  98             XMLStreamReader sr = constructNsStreamReader(strw.toString());
  99             assertTokenType(START_DOCUMENT, sr.getEventType(), sr);
 100 
 101             // root element
 102             assertTokenType(START_ELEMENT, sr.next(), sr);
 103             Assert.assertEquals("test", sr.getLocalName());
 104             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 105 
 106             // first leaf:
 107             assertTokenType(START_ELEMENT, sr.next(), sr);
 108             Assert.assertEquals("leaf", sr.getLocalName());
 109             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 110             System.out.println(sr.getAttributeLocalName(0));
 111             System.out.println(sr.getAttributeLocalName(1));
 112             Assert.assertEquals(2, sr.getAttributeCount());
 113             Assert.assertEquals("attr", sr.getAttributeLocalName(0));
 114 
 115             String uri = sr.getAttributeNamespace(0);
 116             if (!URL_DEF.equals(uri)) {
 117                 Assert.fail("Expected attribute 'attr' to have NS '" + URL_DEF + "', was " + valueDesc(uri) + "; input = '" + strw + "'");
 118             }
 119             Assert.assertEquals(ATTR_VALUE, sr.getAttributeValue(0));
 120             assertTokenType(END_ELEMENT, sr.next(), sr);
 121             Assert.assertEquals("leaf", sr.getLocalName());
 122             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 123 
 124             // 2nd/empty leaf
 125             /**
 126              * assertTokenType(START_ELEMENT, sr.next(), sr);
 127              * assertEquals("leaf", sr.getLocalName()); assertNoNsURI(sr);
 128              * assertTokenType(END_ELEMENT, sr.next(), sr); assertEquals("leaf",
 129              * sr.getLocalName()); assertNoNsURI(sr);
 130              */
 131             // third leaf
 132             assertTokenType(START_ELEMENT, sr.next(), sr);
 133             Assert.assertEquals("leaf", sr.getLocalName());
 134             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 135 
 136             /*
 137              * attr in 3rd leaf, in empty/no namespace assertEquals(1,
 138              * sr.getAttributeCount()); assertEquals("attr2",
 139              * sr.getAttributeLocalName(0));
 140              * assertNoAttrNamespace(sr.getAttributeNamespace(0));
 141              * assertEquals(ATTR_VALUE2, sr.getAttributeValue(0));
 142              */
 143             assertTokenType(END_ELEMENT, sr.next(), sr);
 144             Assert.assertEquals("leaf", sr.getLocalName());
 145             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 146 
 147             // closing root element
 148             assertTokenType(END_ELEMENT, sr.next(), sr);
 149             Assert.assertEquals("test", sr.getLocalName());
 150             Assert.assertEquals(URL_DEF, sr.getNamespaceURI());
 151 
 152             assertTokenType(END_DOCUMENT, sr.next(), sr);
 153         } catch (Exception e) {
 154             e.printStackTrace();
 155             Assert.fail(e.toString());
 156         }
 157 
 158     }
 159 
 160 }