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