1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// NamespaceSupport.java - generic Namespace support for SAX. 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// http://www.saxproject.org 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Written by David Megginson 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// This class is in the Public Domain. NO WARRANTY! 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// $Id: NamespaceSupport.java,v 1.15 2004/04/26 17:34:35 dmegginson Exp $ 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.xml.sax.helpers; 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughesimport java.util.ArrayList; 102feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughesimport java.util.Collections; 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.EmptyStackException; 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration; 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Hashtable; 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Encapsulate Namespace logic for use by applications using SAX, 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or internally by SAX drivers. 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote> 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>This module, both source code and documentation, is in the 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a> 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for further information. 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote> 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This class encapsulates the logic of Namespace processing: it 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tracks the declarations currently in force for each context and 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * automatically processes qualified XML names into their Namespace 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parts; it can also be used in reverse for generating XML qnames 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from Namespaces.</p> 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Namespace support objects are reusable, but the reset method 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * must be invoked between each session.</p> 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Here is a simple session:</p> 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre> 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String parts[] = new String[3]; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * NamespaceSupport support = new NamespaceSupport(); 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * support.pushContext(); 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * support.declarePrefix("", "http://www.w3.org/1999/xhtml"); 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * support.declarePrefix("dc", "http://www.purl.org/dc#"); 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parts = support.processName("p", parts, false); 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * System.out.println("Namespace URI: " + parts[0]); 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * System.out.println("Local name: " + parts[1]); 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * System.out.println("Raw name: " + parts[2]); 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parts = support.processName("dc:title", parts, false); 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * System.out.println("Namespace URI: " + parts[0]); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * System.out.println("Local name: " + parts[1]); 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * System.out.println("Raw name: " + parts[2]); 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * support.popContext(); 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre> 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Note that this class is optimized for the use case where most 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements do not contain Namespace declarations: if the same 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * prefix/URI mapping is repeated for each context (for example), this 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class will be somewhat less efficient.</p> 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Although SAX drivers (parsers) may choose to use this class to 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implement namespace handling, they are not required to do so. 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Applications must track namespace information themselves if they 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * want to use namespace information. 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since SAX 2.0 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author David Megginson 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @version 2.0.1 (sax2r2) 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class NamespaceSupport 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{ 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Constants. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The XML Namespace URI as a constant. 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The value is <code>http://www.w3.org/XML/1998/namespace</code> 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * as defined in the "Namespaces in XML" * recommendation. 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This is the Namespace URI that is automatically mapped 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to the "xml" prefix.</p> 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 890d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes public static final String XMLNS = 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "http://www.w3.org/XML/1998/namespace"; 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The namespace declaration URI as a constant. 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The value is <code>http://www.w3.org/xmlns/2000/</code>, as defined 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in a backwards-incompatible erratum to the "Namespaces in XML" 97f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * recommendation. Because that erratum postdated SAX2, SAX2 defaults 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to the original recommendation, and does not normally use this URI. 99f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This is the Namespace URI that is optionally applied to 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>xmlns</em> and <em>xmlns:*</em> attributes, which are used to 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declare namespaces. </p> 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since SAX 2.1alpha 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #setNamespaceDeclUris 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #isNamespaceDeclUris 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1090d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes public static final String NSDECL = 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "http://www.w3.org/xmlns/2000/"; 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An empty enumeration. 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1162feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes private static final Enumeration EMPTY_ENUMERATION = Collections.enumeration(Collections.emptyList()); 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Constructor. 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Create a new Namespace support object. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public NamespaceSupport () 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project reset(); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Context management. 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reset this Namespace support object for reuse. 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>It is necessary to invoke this method before reusing the 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Namespace support object for a new session. If namespace 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declaration URIs are to be supported, that flag must also 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be set to a non-default value. 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #setNamespaceDeclUris 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void reset () 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts = new Context[32]; 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project namespaceDeclUris = false; 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contextPos = 0; 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts[contextPos] = currentContext = new Context(); 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.declarePrefix("xml", XMLNS); 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Start a new Namespace context. 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The new context will automatically inherit 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the declarations of its parent context, but it will also keep 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * track of which declarations were made within this context. 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Event callback code should start a new context once per element. 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This means being ready to call this in either of two places. 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For elements that don't include namespace declarations, the 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>ContentHandler.startElement()</em> callback is the right place. 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For elements with such a declaration, it'd done in the first 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>ContentHandler.startPrefixMapping()</em> callback. 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A boolean flag can be used to 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * track whether a context has been started yet. When either of 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * those methods is called, it checks the flag to see if a new context 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * needs to be started. If so, it starts the context and sets the 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * flag. After <em>ContentHandler.startElement()</em> 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does that, it always clears the flag. 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Normally, SAX drivers would push a new context at the beginning 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of each XML element. Then they perform a first pass over the 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * attributes to process all namespace declarations, making 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>ContentHandler.startPrefixMapping()</em> callbacks. 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Then a second pass is made, to determine the namespace-qualified 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * names for all attributes and for the element name. 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Finally all the information for the 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>ContentHandler.startElement()</em> callback is available, 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * so it can then be made. 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>The Namespace support object always starts with a base context 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * already in force: in this context, only the "xml" prefix is 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declared.</p> 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.ContentHandler 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #popContext 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void pushContext () 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int max = contexts.length; 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts [contextPos].declsOK = false; 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contextPos++; 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Extend the array if necessary 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contextPos >= max) { 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Context newContexts[] = new Context[max*2]; 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(contexts, 0, newContexts, 0, max); 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project max *= 2; 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts = newContexts; 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Allocate the context if necessary. 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext = contexts[contextPos]; 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (currentContext == null) { 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts[contextPos] = currentContext = new Context(); 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Set the parent, if any. 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contextPos > 0) { 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.setParent(contexts[contextPos - 1]); 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Revert to the previous Namespace context. 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Normally, you should pop the context at the end of each 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * XML element. After popping the context, all Namespace prefix 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mappings that were previously in force are restored.</p> 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>You must not attempt to declare additional Namespace 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * prefixes after popping a context, unless you push another 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * context first.</p> 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #pushContext 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void popContext () 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts[contextPos].clear(); 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contextPos--; 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contextPos < 0) { 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new EmptyStackException(); 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext = contexts[contextPos]; 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Operations within a context. 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Declare a Namespace prefix. All prefixes must be declared 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * before they are referenced. For example, a SAX driver (parser) 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * would scan an element's attributes 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in two passes: first for namespace declarations, 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then a second pass using {@link #processName processName()} to 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * interpret prefixes against (potentially redefined) prefixes. 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This method declares a prefix in the current Namespace 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * context; the prefix will remain in force until this context 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is popped, unless it is shadowed in a descendant context.</p> 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>To declare the default element Namespace, use the empty string as 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the prefix.</p> 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Note that you must <em>not</em> declare a prefix after 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you've pushed and popped another Namespace context, or 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * treated the declarations phase as complete by processing 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a prefixed name.</p> 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Note that there is an asymmetry in this library: {@link 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * #getPrefix getPrefix} will not return the "" prefix, 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * even if you have declared a default element namespace. 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To check for a default namespace, 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you have to look it up explicitly using {@link #getURI getURI}. 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This asymmetry exists to make it easier to look up prefixes 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for attribute names, where the default prefix is not allowed.</p> 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param prefix The prefix to declare, or the empty string to 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicate the default element namespace. This may never have 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value "xml" or "xmlns". 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri The Namespace URI to associate with the prefix. 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if the prefix was legal, false otherwise 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #processName 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefix 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean declarePrefix (String prefix, String uri) 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (prefix.equals("xml") || prefix.equals("xmlns")) { 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.declarePrefix(prefix, uri); 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Process a raw XML qualified name, after all declarations in the 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * current context have been handled by {@link #declarePrefix 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declarePrefix()}. 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This method processes a raw XML qualified name in the 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * current context by removing the prefix and looking it up among 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the prefixes currently declared. The return value will be the 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * array supplied by the caller, filled in as follows:</p> 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dl> 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>parts[0]</dt> 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>The Namespace URI, or an empty string if none is 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in use.</dd> 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>parts[1]</dt> 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>The local name (without prefix).</dd> 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>parts[2]</dt> 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>The original raw name.</dd> 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </dl> 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>All of the strings in the array will be internalized. If 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the raw name has a prefix that has not been declared, then 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the return value will be null.</p> 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Note that attribute names are processed differently than 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * element names: an unprefixed element name will receive the 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * default Namespace (if any), while an unprefixed attribute name 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will not.</p> 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param qName The XML qualified name to be processed. 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param parts An array supplied by the caller, capable of 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * holding at least three members. 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param isAttribute A flag indicating whether this is an 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * attribute name (true) or an element name (false). 337f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * @return The supplied array holding three internalized strings 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * representing the Namespace URI (or empty string), the 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * local name, and the XML qualified name; or null if there 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is an undeclared prefix. 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #declarePrefix 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.String#intern */ 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String [] processName (String qName, String parts[], 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean isAttribute) 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String myParts[] = currentContext.processName(qName, isAttribute); 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (myParts == null) { 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parts[0] = myParts[0]; 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parts[1] = myParts[1]; 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parts[2] = myParts[2]; 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return parts; 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Look up a prefix and get the currently-mapped Namespace URI. 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This method looks up the prefix in the current context. 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Use the empty string ("") for the default Namespace.</p> 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param prefix The prefix to look up. 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The associated Namespace URI, or null if the prefix 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is undeclared in this context. 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefix 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefixes 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getURI (String prefix) 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentContext.getURI(prefix); 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of all prefixes whose declarations are 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * active in the current context. 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This includes declarations from parent contexts that have 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not been overridden. 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p><strong>Note:</strong> if there is a default prefix, it will not be 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returned in this enumeration; check for the default prefix 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using the {@link #getURI getURI} with an argument of "".</p> 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of prefixes (never empty). 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getDeclaredPrefixes 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Enumeration getPrefixes () 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentContext.getPrefixes(); 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return one of the prefixes mapped to a Namespace URI. 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>If more than one prefix is currently mapped to the same 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URI, this method will make an arbitrary selection; if you 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * want all of the prefixes, use the {@link #getPrefixes} 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method instead.</p> 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p><strong>Note:</strong> this will never return the empty (default) prefix; 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to check for a default prefix, use the {@link #getURI getURI} 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method with an argument of "".</p> 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri the namespace URI 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return one of the prefixes currently mapped to the URI supplied, 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or null if none is mapped or if the URI is assigned to 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default namespace 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefixes(java.lang.String) 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getPrefix (String uri) 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentContext.getPrefix(uri); 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of all prefixes for a given URI whose 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declarations are active in the current context. 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This includes declarations from parent contexts that have 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not been overridden. 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This method returns prefixes mapped to a specific Namespace 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URI. The xml: prefix will be included. If you want only one 429f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * prefix that's mapped to the Namespace URI, and you don't care 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * which one you get, use the {@link #getPrefix getPrefix} 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method instead.</p> 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p><strong>Note:</strong> the empty (default) prefix is <em>never</em> included 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in this enumeration; to check for the presence of a default 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Namespace, use the {@link #getURI getURI} method with an 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * argument of "".</p> 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri The Namespace URI. 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of prefixes (never empty). 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefix 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getDeclaredPrefixes 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 4442feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes public Enumeration getPrefixes(String uri) { 4452feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes ArrayList<String> prefixes = new ArrayList<String>(); 4462feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes Enumeration allPrefixes = getPrefixes(); 4472feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes while (allPrefixes.hasMoreElements()) { 4482feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes String prefix = (String) allPrefixes.nextElement(); 4492feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes if (uri.equals(getURI(prefix))) { 4502feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes prefixes.add(prefix); 4512feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes } 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 4532feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes return Collections.enumeration(prefixes); 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of all prefixes declared in this context. 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 460f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * <p>The empty (default) prefix will be included in this 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * enumeration; note that this behaviour differs from that of 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #getPrefix} and {@link #getPrefixes}.</p> 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of all prefixes declared in this 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * context. 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefixes 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Enumeration getDeclaredPrefixes () 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentContext.getDeclaredPrefixes(); 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Controls whether namespace declaration attributes are placed 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * into the {@link #NSDECL NSDECL} namespace 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by {@link #processName processName()}. This may only be 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * changed before any contexts have been pushed. 479f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value the namespace declaration attribute state. A value of true 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * enables this feature, a value of false disables it. 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since SAX 2.1alpha 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception IllegalStateException when attempting to set this 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * after any context has been pushed. 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setNamespaceDeclUris (boolean value) 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contextPos != 0) 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException (); 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value == namespaceDeclUris) 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project namespaceDeclUris = value; 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value) 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.declarePrefix ("xmlns", NSDECL); 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts[contextPos] = currentContext = new Context(); 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.declarePrefix("xml", XMLNS); 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns true if namespace declaration attributes are placed into 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a namespace. This behavior is not the default. 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if namespace declaration attributes are enabled, false 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise. 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since SAX 2.1alpha 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isNamespaceDeclUris () 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { return namespaceDeclUris; } 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal state. 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Context contexts[]; 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Context currentContext; 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int contextPos; 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean namespaceDeclUris; 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal classes. 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Internal class for a single Namespace context. 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This module caches and reuses Namespace contexts, 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * so the number allocated 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will be equal to the element depth of the document, not to the total 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number of elements (i.e. 5-10 rather than tens of thousands). 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Also, data structures used to represent contexts are shared when 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * possible (child contexts without declarations) to further reduce 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the amount of memory that's consumed. 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final class Context { 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Create the root-level Namespace context. 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Context () 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project copyTables(); 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 551f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 552f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (Re)set the parent of this Namespace context. 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The context must either have been freshly constructed, 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or must have been cleared. 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param context The parent Namespace context object. 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void setParent (Context parent) 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.parent = parent; 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declarations = null; 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixTable = parent.prefixTable; 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uriTable = parent.uriTable; 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementNameTable = parent.elementNameTable; 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributeNameTable = parent.attributeNameTable; 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultNS = parent.defaultNS; 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declSeen = false; 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declsOK = true; 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Makes associated state become collectible, 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invalidating this context. 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #setParent} must be called before 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this context may be used again. 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void clear () 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parent = null; 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixTable = null; 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uriTable = null; 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementNameTable = null; 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributeNameTable = null; 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultNS = null; 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 588f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 589f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Declare a Namespace prefix for this context. 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param prefix The prefix to declare. 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri The associated Namespace URI. 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#declarePrefix 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 5972feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes void declarePrefix(String prefix, String uri) { 5982feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes // Lazy processing... 5992feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes if (!declsOK) { 6002feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes throw new IllegalStateException ("can't declare any more prefixes in this context"); 6012feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes } 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!declSeen) { 6032feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes copyTables(); 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (declarations == null) { 6062feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes declarations = new ArrayList<String>(); 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 608f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefix = prefix.intern(); 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uri = uri.intern(); 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ("".equals(prefix)) { 6122feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes if ("".equals(uri)) { 6132feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes defaultNS = null; 6142feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes } else { 6152feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes defaultNS = uri; 6162feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes } 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 6182feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes prefixTable.put(prefix, uri); 6192feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes uriTable.put(uri, prefix); // may wipe out another prefix 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 6212feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes declarations.add(prefix); 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Process an XML qualified name in this context. 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param qName The XML qualified name. 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param isAttribute true if this is an attribute name. 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An array of three strings containing the 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URI part (or empty string), the local part, 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and the raw name, all internalized, or null 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if there is an undeclared prefix. 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#processName 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String [] processName (String qName, boolean isAttribute) 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String name[]; 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable table; 640f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // detect errors in call sequence 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declsOK = false; 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Select the appropriate table. 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isAttribute) { 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project table = attributeNameTable; 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project table = elementNameTable; 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 650f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Start by looking in the cache, and 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // return immediately if the name 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // is already known in this content 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name = (String[])table.get(qName); 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (name != null) { 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return name; 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 658f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We haven't seen this name in this 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // context before. Maybe in the parent 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // context, but we can't assume prefix 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // bindings are the same. 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name = new String[3]; 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[2] = qName.intern(); 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = qName.indexOf(':'); 666f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 667f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // No prefix. 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index == -1) { 670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isAttribute) { 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (qName == "xmlns" && namespaceDeclUris) 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = NSDECL; 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = ""; 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (defaultNS == null) { 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = ""; 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = defaultNS; 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[1] = name[2]; 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 682f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Prefix 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String prefix = qName.substring(0, index); 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String local = qName.substring(index+1); 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String uri; 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ("".equals(prefix)) { 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uri = defaultNS; 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uri = (String)prefixTable.get(prefix); 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (uri == null 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || (!isAttribute && "xmlns".equals (prefix))) { 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = uri; 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[1] = local.intern(); 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 700f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Save in the cache for future use. 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // (Could be shared with parent context...) 703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project table.put(name[2], name); 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return name; 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 706f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Look up the URI associated with a prefix in this context. 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param prefix The prefix to look up. 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The associated Namespace URI, or null if none is 713f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * declared. 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#getURI 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String getURI (String prefix) 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ("".equals(prefix)) { 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultNS; 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (prefixTable == null) { 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (String)prefixTable.get(prefix); 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Look up one of the prefixes associated with a URI in this context. 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Since many prefixes may be mapped to the same URI, 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the return value may be unreliable.</p> 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri The URI to look up. 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The associated prefix, or null if none is declared. 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#getPrefix 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String getPrefix (String uri) 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (uriTable == null) { 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (String)uriTable.get(uri); 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 746f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 747f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of prefixes declared in this context. 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of prefixes (possibly empty). 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#getDeclaredPrefixes 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 7542feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes Enumeration getDeclaredPrefixes() { 7552feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes return (declarations == null) ? EMPTY_ENUMERATION : Collections.enumeration(declarations); 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 757f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 758f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of all prefixes currently in force. 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>The default prefix, if in force, is <em>not</em> 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returned, and will have to be checked for separately.</p> 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of prefixes (never empty). 766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#getPrefixes 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration getPrefixes () 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (prefixTable == null) { 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return EMPTY_ENUMERATION; 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return prefixTable.keys(); 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 776f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 777f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal methods. 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copy on write for the internal tables in this context. 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This class is optimized for the normal case where most 788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements do not contain Namespace declarations.</p> 789f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes */ 790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void copyTables () 791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (prefixTable != null) { 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixTable = (Hashtable)prefixTable.clone(); 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixTable = new Hashtable(); 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (uriTable != null) { 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uriTable = (Hashtable)uriTable.clone(); 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uriTable = new Hashtable(); 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementNameTable = new Hashtable(); 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributeNameTable = new Hashtable(); 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declSeen = true; 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Protected state. 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 812f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable prefixTable; 814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable uriTable; 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable elementNameTable; 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable attributeNameTable; 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String defaultNS = null; 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean declsOK = true; 819f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal state. 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 825f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 8262feeee4119506ed1511942f80fc2f7eb431afab7Elliott Hughes private ArrayList<String> declarations = null; 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean declSeen = false; 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Context parent = null; 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// end of NamespaceSupport.java 833