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