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.XMLStreamFilterTest; 25 26 import java.io.InputStream; 27 28 import javax.xml.namespace.NamespaceContext; 29 import javax.xml.namespace.QName; 30 import javax.xml.stream.EventFilter; 31 import javax.xml.stream.StreamFilter; 32 import javax.xml.stream.XMLInputFactory; 33 import javax.xml.stream.XMLStreamConstants; 34 import javax.xml.stream.XMLStreamReader; 35 import javax.xml.stream.events.XMLEvent; 36 37 import org.testng.Assert; 38 import org.testng.annotations.Listeners; 39 import org.testng.annotations.Test; 40 41 /* 42 * @test 43 * @bug 6481678 44 * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest 45 * @run testng/othervm -DrunSecMngr=true stream.XMLStreamFilterTest.Bug6481678 46 * @run testng/othervm stream.XMLStreamFilterTest.Bug6481678 47 * @summary Test Filtered XMLStreamReader parses namespace correctly. 48 */ 49 @Listeners({jaxp.library.BasePolicy.class}) 50 public class Bug6481678 { 51 52 String rootElement = "fruits"; 53 String childElement = "varieties"; 54 String prefixApple = "a"; 55 String namespaceURIApple = "apple.fruit"; 56 String prefixOrange = "o"; 57 String namespaceURIOrange = "orange.fruit"; 58 String namespaceURIBanana = "banana.fruit"; 59 60 TypeFilter filter; 61 XMLInputFactory factory; 62 InputStream is; 63 64 /** Creates a new instance of NamespaceTest */ 65 public Bug6481678(java.lang.String testName) { 66 init(); 67 } 68 69 private void init() { 70 factory = XMLInputFactory.newInstance(); 71 factory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.TRUE); 72 filter = createFilter(); 73 } 74 75 String getXML() { 76 StringBuffer sbuffer = new StringBuffer(); 77 sbuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 78 sbuffer.append("<" + rootElement + " state=\"WA\""); 79 sbuffer.append(" xmlns:" + prefixApple + "=\"" + namespaceURIApple + "\""); 80 sbuffer.append(" xmlns:" + prefixOrange + "=\"" + namespaceURIOrange + "\""); 81 sbuffer.append(" xmlns=\"" + namespaceURIBanana + "\">"); 82 sbuffer.append("<" + prefixApple + ":" + childElement + ">"); 83 sbuffer.append("<" + prefixApple + ":fuji/>"); 84 sbuffer.append("<" + prefixApple + ":gala/>"); 85 sbuffer.append("</" + prefixApple + ":" + childElement + ">"); 86 sbuffer.append("</" + rootElement + ">"); 87 // System.out.println("XML = " + sbuffer.toString()) ; 88 return sbuffer.toString(); 89 } 90 91 public TypeFilter createFilter() { 92 93 TypeFilter f = new TypeFilter(); 94 95 f.addType(XMLEvent.START_ELEMENT); 96 f.addType(XMLEvent.END_ELEMENT); 97 f.addType(XMLEvent.PROCESSING_INSTRUCTION); 98 f.addType(XMLEvent.CHARACTERS); 99 f.addType(XMLEvent.COMMENT); 100 f.addType(XMLEvent.SPACE); 101 f.addType(XMLEvent.START_DOCUMENT); 102 f.addType(XMLEvent.END_DOCUMENT); 103 return f; 104 } 105 106 /* 107 * testcase for cr6481678 in our current impl (using cache), the reader 108 * would read from cache when getters are called before next() is. refter to 109 * testRootElementNamespace. 110 */ 111 @Test 112 public void testReadingNamespace() { 113 is = new java.io.ByteArrayInputStream(getXML().getBytes()); 114 try { 115 XMLStreamReader sr = factory.createFilteredReader(factory.createXMLStreamReader(is), (StreamFilter) filter); 116 117 while (sr.hasNext()) { 118 int eventType = sr.getEventType(); 119 if (eventType == XMLStreamConstants.START_ELEMENT) { 120 if (sr.getLocalName().equals(rootElement)) { 121 Assert.assertTrue(sr.getNamespacePrefix(0).equals(prefixApple) && sr.getNamespaceURI(0).equals(namespaceURIApple)); 122 } 123 } 124 eventType = sr.next(); 125 } 126 } catch (Exception ex) { 127 Assert.fail("Exception: " + ex.getMessage()); 128 } 129 } 130 131 @Test 132 public void testRootElementNamespace() { 133 is = new java.io.ByteArrayInputStream(getXML().getBytes()); 134 try { 135 XMLStreamReader sr = factory.createFilteredReader(factory.createXMLStreamReader(is), (StreamFilter) filter); 136 137 while (sr.hasNext()) { 138 int eventType = sr.next(); 139 if (eventType == XMLStreamConstants.START_ELEMENT) { 140 if (sr.getLocalName().equals(rootElement)) { 141 Assert.assertTrue(sr.getNamespacePrefix(0).equals(prefixApple) && sr.getNamespaceURI(0).equals(namespaceURIApple)); 142 } 143 } 144 } 145 } catch (Exception ex) { 146 Assert.fail("Exception: " + ex.getMessage()); 147 } 148 } 149 150 @Test 151 public void testChildElementNamespace() { 152 is = new java.io.ByteArrayInputStream(getXML().getBytes()); 153 try { 154 XMLStreamReader sr = factory.createFilteredReader(factory.createXMLStreamReader(is), (StreamFilter) filter); 155 while (sr.hasNext()) { 156 int eventType = sr.next(); 157 if (eventType == XMLStreamConstants.START_ELEMENT) { 158 if (sr.getLocalName().equals(childElement)) { 159 QName qname = sr.getName(); 160 Assert.assertTrue(qname.getPrefix().equals(prefixApple) && qname.getNamespaceURI().equals(namespaceURIApple) 161 && qname.getLocalPart().equals(childElement)); 162 } 163 } 164 } 165 } catch (Exception ex) { 166 Assert.fail("Exception: " + ex.getMessage()); 167 } 168 } 169 170 @Test 171 public void testNamespaceContext() { 172 is = new java.io.ByteArrayInputStream(getXML().getBytes()); 173 try { 174 XMLStreamReader sr = factory.createFilteredReader(factory.createXMLStreamReader(is), (StreamFilter) filter); 175 while (sr.hasNext()) { 176 int eventType = sr.next(); 177 if (eventType == XMLStreamConstants.START_ELEMENT) { 178 if (sr.getLocalName().equals(childElement)) { 179 NamespaceContext context = sr.getNamespaceContext(); 180 Assert.assertTrue(context.getPrefix(namespaceURIApple).equals(prefixApple)); 181 } 182 } 183 } 184 } catch (Exception ex) { 185 Assert.fail("Exception: " + ex.getMessage()); 186 } 187 } 188 189 @Test 190 public void testNamespaceCount() { 191 is = new java.io.ByteArrayInputStream(getXML().getBytes()); 192 try { 193 XMLStreamReader sr = factory.createFilteredReader(factory.createXMLStreamReader(is), (StreamFilter) filter); 194 while (sr.hasNext()) { 195 int eventType = sr.next(); 196 if (eventType == XMLStreamConstants.START_ELEMENT) { 197 if (sr.getLocalName().equals(rootElement)) { 198 int count = sr.getNamespaceCount(); 199 Assert.assertTrue(count == 3); 200 } 201 } 202 } 203 } catch (Exception ex) { 204 Assert.fail("Exception: " + ex.getMessage()); 205 } 206 } 207 208 class TypeFilter implements EventFilter, StreamFilter { 209 210 protected boolean[] types = new boolean[20]; 211 212 public TypeFilter() { 213 } 214 215 public void addType(int type) { 216 types[type] = true; 217 } 218 219 public boolean accept(XMLEvent e) { 220 return types[e.getEventType()]; 221 } 222 223 public boolean accept(XMLStreamReader r) { 224 return types[r.getEventType()]; 225 } 226 } 227 } 228