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