1a1440511280bea4606ec5202a225f9f832987890Jesse Wilson/* 2a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * Copyright (C) 2010 The Android Open Source Project 3a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * 4a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * you may not use this file except in compliance with the License. 6a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * You may obtain a copy of the License at 7a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * 8a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * 10a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * See the License for the specific language governing permissions and 14a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * limitations under the License. 15a1440511280bea4606ec5202a225f9f832987890Jesse Wilson */ 16a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 17c4145311fb4a343f59851aea9f36dcabc84ff737Jesse Wilsonpackage libcore.xml; 18a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 19a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport junit.framework.TestCase; 20a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport org.xml.sax.Attributes; 21a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport org.xml.sax.InputSource; 22a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport org.xml.sax.XMLReader; 23a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport org.xml.sax.helpers.DefaultHandler; 24a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 25a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport javax.xml.parsers.SAXParserFactory; 26a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport java.io.StringReader; 27a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport java.util.ArrayList; 28a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport java.util.Arrays; 29a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonimport java.util.List; 30a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 31a1440511280bea4606ec5202a225f9f832987890Jesse Wilson/** 32a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * Tests that we both report and retrieve attributes using the appropriate 33a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * names for different combinations of namespaces and namespace prefixes. 34a1440511280bea4606ec5202a225f9f832987890Jesse Wilson */ 35a1440511280bea4606ec5202a225f9f832987890Jesse Wilsonpublic class NamespacedAttributesLookupTest extends TestCase { 36a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 37a1440511280bea4606ec5202a225f9f832987890Jesse Wilson private static final String SAX_PROPERTY_NS = 38a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "http://xml.org/sax/features/namespaces"; 39a1440511280bea4606ec5202a225f9f832987890Jesse Wilson private static final String SAX_PROPERTY_NS_PREFIXES = 40a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "http://xml.org/sax/features/namespace-prefixes"; 41a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 42a1440511280bea4606ec5202a225f9f832987890Jesse Wilson private static String xml = "<?xml version='1.0' encoding='UTF-8'?>" + 43a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "<test xmlns='http://foo' xmlns:bar='http://bar' xmlns:baz='http://baz' baz:c='a'>" + 44a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "<b c='w' bar:c='x'/>" + 45a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "<bar:e baz:c='y' bar:c='z'/>" + 46a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "</test>"; 47a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 48a1440511280bea4606ec5202a225f9f832987890Jesse Wilson public void testNamespace() throws Exception { 49a1440511280bea4606ec5202a225f9f832987890Jesse Wilson List<String> expected = Arrays.asList( 50a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "http://foo,test\n" + 51a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://baz,c\n" + 52a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://bar+c=null,\n" + 53a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " bar:c=null\n", 54a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 55a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "http://foo,b\n" + 56a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " ,c\n" + 57a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://bar,c\n" + 58a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://bar+c=x,\n" + 59a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " bar:c=x\n", 60a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 61a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "http://bar,e\n" + 62a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://baz,c\n" + 63a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://bar,c\n" + 64a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://bar+c=z,\n" + 65a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " bar:c=z\n"); 66a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 67a1440511280bea4606ec5202a225f9f832987890Jesse Wilson boolean namespace = true; 68a1440511280bea4606ec5202a225f9f832987890Jesse Wilson boolean namespacePrefixes = false; 69a1440511280bea4606ec5202a225f9f832987890Jesse Wilson assertEquals(expected, getStartElements(xml, namespace, namespacePrefixes)); 70a1440511280bea4606ec5202a225f9f832987890Jesse Wilson } 71a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 72a1440511280bea4606ec5202a225f9f832987890Jesse Wilson public void testNamespacePrefixes() throws Exception { 73a1440511280bea4606ec5202a225f9f832987890Jesse Wilson List<String> expected = Arrays.asList( 74a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "test\n" + 75a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " xmlns\n" + 76a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " xmlns:bar\n" + 77a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " xmlns:baz\n" + 78a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " baz:c\n" + 79a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://bar+c=null,\n" + 80a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " bar:c=null\n", 81a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 82a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "b\n" + 83a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " c\n" + 84a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " bar:c\n" + 85a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://bar+c=null,\n" + 86a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " bar:c=x\n", 87a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 88a1440511280bea4606ec5202a225f9f832987890Jesse Wilson "bar:e\n" + 89a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " baz:c\n" + 90a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " bar:c\n" + 91a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " http://bar+c=null,\n" + 92a1440511280bea4606ec5202a225f9f832987890Jesse Wilson " bar:c=z\n"); 93a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 94a1440511280bea4606ec5202a225f9f832987890Jesse Wilson boolean namespace = false; 95a1440511280bea4606ec5202a225f9f832987890Jesse Wilson boolean namespacePrefixes = true; 96a1440511280bea4606ec5202a225f9f832987890Jesse Wilson assertEquals(expected, getStartElements(xml, namespace, namespacePrefixes)); 97a1440511280bea4606ec5202a225f9f832987890Jesse Wilson } 98a1440511280bea4606ec5202a225f9f832987890Jesse Wilson 99a1440511280bea4606ec5202a225f9f832987890Jesse Wilson public List<String> getStartElements(String xml, final boolean namespace, boolean namespacePrefixes) 100a1440511280bea4606ec5202a225f9f832987890Jesse Wilson throws Exception { 101a1440511280bea4606ec5202a225f9f832987890Jesse Wilson final List<String> result = new ArrayList<String>(); 102a1440511280bea4606ec5202a225f9f832987890Jesse Wilson XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); 103a1440511280bea4606ec5202a225f9f832987890Jesse Wilson reader.setFeature(SAX_PROPERTY_NS, namespace); 104a1440511280bea4606ec5202a225f9f832987890Jesse Wilson reader.setFeature(SAX_PROPERTY_NS_PREFIXES, namespacePrefixes); 105a1440511280bea4606ec5202a225f9f832987890Jesse Wilson reader.setContentHandler(new DefaultHandler() { 106a1440511280bea4606ec5202a225f9f832987890Jesse Wilson @Override public final void startElement( 107a1440511280bea4606ec5202a225f9f832987890Jesse Wilson String uri, String localName, String qName, Attributes attributes) { 108a1440511280bea4606ec5202a225f9f832987890Jesse Wilson StringBuilder serialized = new StringBuilder(); 109a1440511280bea4606ec5202a225f9f832987890Jesse Wilson /* 110a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * Only supply the uri+localName or qname depending on whether namespaces are 111a1440511280bea4606ec5202a225f9f832987890Jesse Wilson * enabled. It's an optional parameter and the RI only supplies one or the other. 112a1440511280bea4606ec5202a225f9f832987890Jesse Wilson */ 113a1440511280bea4606ec5202a225f9f832987890Jesse Wilson if (namespace) { 114a1440511280bea4606ec5202a225f9f832987890Jesse Wilson serialized.append(uri).append(","); 115a1440511280bea4606ec5202a225f9f832987890Jesse Wilson serialized.append(localName); 116a1440511280bea4606ec5202a225f9f832987890Jesse Wilson } else { 117a1440511280bea4606ec5202a225f9f832987890Jesse Wilson serialized.append(qName); 118a1440511280bea4606ec5202a225f9f832987890Jesse Wilson } 119a1440511280bea4606ec5202a225f9f832987890Jesse Wilson for (int i = 0; i < attributes.getLength(); i++) { 120a1440511280bea4606ec5202a225f9f832987890Jesse Wilson serialized.append("\n "); 121a1440511280bea4606ec5202a225f9f832987890Jesse Wilson if (namespace) { 122a1440511280bea4606ec5202a225f9f832987890Jesse Wilson serialized.append(attributes.getURI(i)).append(","); 123a1440511280bea4606ec5202a225f9f832987890Jesse Wilson serialized.append(attributes.getLocalName(i)); 124a1440511280bea4606ec5202a225f9f832987890Jesse Wilson } else { 125a1440511280bea4606ec5202a225f9f832987890Jesse Wilson serialized.append(attributes.getQName(i)); 126a1440511280bea4606ec5202a225f9f832987890Jesse Wilson } 127a1440511280bea4606ec5202a225f9f832987890Jesse Wilson } 128a1440511280bea4606ec5202a225f9f832987890Jesse Wilson serialized.append("\n http://bar+c=") 129a1440511280bea4606ec5202a225f9f832987890Jesse Wilson .append(attributes.getValue("http://bar", "c")).append(",") 130a1440511280bea4606ec5202a225f9f832987890Jesse Wilson .append("\n bar:c=") 131a1440511280bea4606ec5202a225f9f832987890Jesse Wilson .append(attributes.getValue("bar:c")) 132a1440511280bea4606ec5202a225f9f832987890Jesse Wilson .append("\n"); 133a1440511280bea4606ec5202a225f9f832987890Jesse Wilson result.add(serialized.toString()); 134a1440511280bea4606ec5202a225f9f832987890Jesse Wilson } 135a1440511280bea4606ec5202a225f9f832987890Jesse Wilson }); 136a1440511280bea4606ec5202a225f9f832987890Jesse Wilson reader.parse(new InputSource(new StringReader(xml))); 137a1440511280bea4606ec5202a225f9f832987890Jesse Wilson return result; 138a1440511280bea4606ec5202a225f9f832987890Jesse Wilson } 139a1440511280bea4606ec5202a225f9f832987890Jesse Wilson} 140