NamespaceSupport.java revision 0d4ce4227fa818288b8db762b640dfa21e3162f5
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 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.EmptyStackException; 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration; 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Hashtable; 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector; 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 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 */ 1160d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes private static final Enumeration EMPTY_ENUMERATION = 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new Vector().elements(); 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Constructor. 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Create a new Namespace support object. 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public NamespaceSupport () 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project reset(); 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 //////////////////////////////////////////////////////////////////// 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Context management. 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reset this Namespace support object for reuse. 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>It is necessary to invoke this method before reusing the 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Namespace support object for a new session. If namespace 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declaration URIs are to be supported, that flag must also 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be set to a non-default value. 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #setNamespaceDeclUris 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void reset () 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts = new Context[32]; 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project namespaceDeclUris = false; 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contextPos = 0; 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts[contextPos] = currentContext = new Context(); 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.declarePrefix("xml", XMLNS); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Start a new Namespace context. 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The new context will automatically inherit 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the declarations of its parent context, but it will also keep 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * track of which declarations were made within this context. 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Event callback code should start a new context once per element. 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This means being ready to call this in either of two places. 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For elements that don't include namespace declarations, the 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>ContentHandler.startElement()</em> callback is the right place. 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For elements with such a declaration, it'd done in the first 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>ContentHandler.startPrefixMapping()</em> callback. 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A boolean flag can be used to 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * track whether a context has been started yet. When either of 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * those methods is called, it checks the flag to see if a new context 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * needs to be started. If so, it starts the context and sets the 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * flag. After <em>ContentHandler.startElement()</em> 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does that, it always clears the flag. 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Normally, SAX drivers would push a new context at the beginning 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of each XML element. Then they perform a first pass over the 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * attributes to process all namespace declarations, making 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>ContentHandler.startPrefixMapping()</em> callbacks. 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Then a second pass is made, to determine the namespace-qualified 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * names for all attributes and for the element name. 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Finally all the information for the 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>ContentHandler.startElement()</em> callback is available, 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * so it can then be made. 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>The Namespace support object always starts with a base context 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * already in force: in this context, only the "xml" prefix is 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declared.</p> 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.ContentHandler 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #popContext 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void pushContext () 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int max = contexts.length; 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts [contextPos].declsOK = false; 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contextPos++; 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Extend the array if necessary 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contextPos >= max) { 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Context newContexts[] = new Context[max*2]; 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(contexts, 0, newContexts, 0, max); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project max *= 2; 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts = newContexts; 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Allocate the context if necessary. 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext = contexts[contextPos]; 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (currentContext == null) { 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts[contextPos] = currentContext = new Context(); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Set the parent, if any. 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contextPos > 0) { 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.setParent(contexts[contextPos - 1]); 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 /** 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Revert to the previous Namespace context. 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Normally, you should pop the context at the end of each 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * XML element. After popping the context, all Namespace prefix 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * mappings that were previously in force are restored.</p> 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>You must not attempt to declare additional Namespace 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * prefixes after popping a context, unless you push another 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * context first.</p> 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #pushContext 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void popContext () 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts[contextPos].clear(); 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contextPos--; 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contextPos < 0) { 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new EmptyStackException(); 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext = contexts[contextPos]; 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 //////////////////////////////////////////////////////////////////// 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Operations within a context. 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Declare a Namespace prefix. All prefixes must be declared 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * before they are referenced. For example, a SAX driver (parser) 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * would scan an element's attributes 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in two passes: first for namespace declarations, 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then a second pass using {@link #processName processName()} to 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * interpret prefixes against (potentially redefined) prefixes. 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This method declares a prefix in the current Namespace 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * context; the prefix will remain in force until this context 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is popped, unless it is shadowed in a descendant context.</p> 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>To declare the default element Namespace, use the empty string as 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the prefix.</p> 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Note that you must <em>not</em> declare a prefix after 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you've pushed and popped another Namespace context, or 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * treated the declarations phase as complete by processing 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a prefixed name.</p> 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Note that there is an asymmetry in this library: {@link 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * #getPrefix getPrefix} will not return the "" prefix, 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * even if you have declared a default element namespace. 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To check for a default namespace, 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you have to look it up explicitly using {@link #getURI getURI}. 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This asymmetry exists to make it easier to look up prefixes 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for attribute names, where the default prefix is not allowed.</p> 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param prefix The prefix to declare, or the empty string to 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicate the default element namespace. This may never have 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value "xml" or "xmlns". 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri The Namespace URI to associate with the prefix. 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if the prefix was legal, false otherwise 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #processName 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefix 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean declarePrefix (String prefix, String uri) 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (prefix.equals("xml") || prefix.equals("xmlns")) { 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.declarePrefix(prefix, uri); 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 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 /** 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Process a raw XML qualified name, after all declarations in the 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * current context have been handled by {@link #declarePrefix 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declarePrefix()}. 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This method processes a raw XML qualified name in the 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * current context by removing the prefix and looking it up among 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the prefixes currently declared. The return value will be the 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * array supplied by the caller, filled in as follows:</p> 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dl> 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>parts[0]</dt> 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>The Namespace URI, or an empty string if none is 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in use.</dd> 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>parts[1]</dt> 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>The local name (without prefix).</dd> 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dt>parts[2]</dt> 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <dd>The original raw name.</dd> 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </dl> 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>All of the strings in the array will be internalized. If 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the raw name has a prefix that has not been declared, then 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the return value will be null.</p> 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Note that attribute names are processed differently than 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * element names: an unprefixed element name will receive the 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * default Namespace (if any), while an unprefixed attribute name 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will not.</p> 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param qName The XML qualified name to be processed. 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param parts An array supplied by the caller, capable of 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * holding at least three members. 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param isAttribute A flag indicating whether this is an 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * attribute name (true) or an element name (false). 338f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * @return The supplied array holding three internalized strings 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * representing the Namespace URI (or empty string), the 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * local name, and the XML qualified name; or null if there 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is an undeclared prefix. 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #declarePrefix 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.String#intern */ 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String [] processName (String qName, String parts[], 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean isAttribute) 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String myParts[] = currentContext.processName(qName, isAttribute); 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (myParts == null) { 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parts[0] = myParts[0]; 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parts[1] = myParts[1]; 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parts[2] = myParts[2]; 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return parts; 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 /** 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Look up a prefix and get the currently-mapped Namespace URI. 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This method looks up the prefix in the current context. 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Use the empty string ("") for the default Namespace.</p> 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param prefix The prefix to look up. 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The associated Namespace URI, or null if the prefix 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is undeclared in this context. 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefix 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefixes 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getURI (String prefix) 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentContext.getURI(prefix); 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of all prefixes whose declarations are 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * active in the current context. 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This includes declarations from parent contexts that have 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not been overridden. 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p><strong>Note:</strong> if there is a default prefix, it will not be 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returned in this enumeration; check for the default prefix 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * using the {@link #getURI getURI} with an argument of "".</p> 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of prefixes (never empty). 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getDeclaredPrefixes 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Enumeration getPrefixes () 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentContext.getPrefixes(); 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return one of the prefixes mapped to a Namespace URI. 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>If more than one prefix is currently mapped to the same 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URI, this method will make an arbitrary selection; if you 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * want all of the prefixes, use the {@link #getPrefixes} 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method instead.</p> 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p><strong>Note:</strong> this will never return the empty (default) prefix; 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to check for a default prefix, use the {@link #getURI getURI} 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method with an argument of "".</p> 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri the namespace URI 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return one of the prefixes currently mapped to the URI supplied, 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or null if none is mapped or if the URI is assigned to 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default namespace 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefixes(java.lang.String) 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getPrefix (String uri) 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentContext.getPrefix(uri); 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of all prefixes for a given URI whose 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declarations are active in the current context. 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This includes declarations from parent contexts that have 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not been overridden. 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This method returns prefixes mapped to a specific Namespace 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URI. The xml: prefix will be included. If you want only one 430f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * prefix that's mapped to the Namespace URI, and you don't care 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * which one you get, use the {@link #getPrefix getPrefix} 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method instead.</p> 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p><strong>Note:</strong> the empty (default) prefix is <em>never</em> included 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in this enumeration; to check for the presence of a default 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Namespace, use the {@link #getURI getURI} method with an 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * argument of "".</p> 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri The Namespace URI. 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of prefixes (never empty). 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefix 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getDeclaredPrefixes 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Enumeration getPrefixes (String uri) 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Vector prefixes = new Vector(); 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration allPrefixes = getPrefixes(); 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (allPrefixes.hasMoreElements()) { 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String prefix = (String)allPrefixes.nextElement(); 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (uri.equals(getURI(prefix))) { 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixes.addElement(prefix); 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return prefixes.elements(); 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of all prefixes declared in this context. 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 462f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * <p>The empty (default) prefix will be included in this 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * enumeration; note that this behaviour differs from that of 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #getPrefix} and {@link #getPrefixes}.</p> 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of all prefixes declared in this 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * context. 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getPrefixes 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getURI 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Enumeration getDeclaredPrefixes () 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return currentContext.getDeclaredPrefixes(); 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Controls whether namespace declaration attributes are placed 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * into the {@link #NSDECL NSDECL} namespace 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by {@link #processName processName()}. This may only be 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * changed before any contexts have been pushed. 481f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value the namespace declaration attribute state. A value of true 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * enables this feature, a value of false disables it. 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since SAX 2.1alpha 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception IllegalStateException when attempting to set this 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * after any context has been pushed. 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setNamespaceDeclUris (boolean value) 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contextPos != 0) 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException (); 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value == namespaceDeclUris) 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project namespaceDeclUris = value; 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value) 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.declarePrefix ("xmlns", NSDECL); 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contexts[contextPos] = currentContext = new Context(); 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentContext.declarePrefix("xml", XMLNS); 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns true if namespace declaration attributes are placed into 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a namespace. This behavior is not the default. 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return true if namespace declaration attributes are enabled, false 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise. 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since SAX 2.1alpha 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isNamespaceDeclUris () 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { return namespaceDeclUris; } 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal state. 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Context contexts[]; 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Context currentContext; 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int contextPos; 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean namespaceDeclUris; 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal classes. 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////////// 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Internal class for a single Namespace context. 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This module caches and reuses Namespace contexts, 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * so the number allocated 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will be equal to the element depth of the document, not to the total 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number of elements (i.e. 5-10 rather than tens of thousands). 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Also, data structures used to represent contexts are shared when 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * possible (child contexts without declarations) to further reduce 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the amount of memory that's consumed. 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final class Context { 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Create the root-level Namespace context. 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Context () 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project copyTables(); 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 553f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 554f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (Re)set the parent of this Namespace context. 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The context must either have been freshly constructed, 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or must have been cleared. 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param context The parent Namespace context object. 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void setParent (Context parent) 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.parent = parent; 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declarations = null; 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixTable = parent.prefixTable; 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uriTable = parent.uriTable; 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementNameTable = parent.elementNameTable; 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributeNameTable = parent.attributeNameTable; 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultNS = parent.defaultNS; 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declSeen = false; 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declsOK = true; 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Makes associated state become collectible, 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invalidating this context. 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #setParent} must be called before 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this context may be used again. 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void clear () 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project parent = null; 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixTable = null; 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uriTable = null; 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementNameTable = null; 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributeNameTable = null; 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultNS = null; 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 590f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 591f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Declare a Namespace prefix for this context. 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param prefix The prefix to declare. 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri The associated Namespace URI. 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#declarePrefix 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void declarePrefix (String prefix, String uri) 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Lazy processing... 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!declsOK) 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException ( 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "can't declare any more prefixes in this context"); 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!declSeen) { 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project copyTables(); 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (declarations == null) { 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declarations = new Vector(); 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 611f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefix = prefix.intern(); 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uri = uri.intern(); 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ("".equals(prefix)) { 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ("".equals(uri)) { 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultNS = null; 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultNS = uri; 619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixTable.put(prefix, uri); 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uriTable.put(uri, prefix); // may wipe out another prefix 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declarations.addElement(prefix); 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Process an XML qualified name in this context. 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param qName The XML qualified name. 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param isAttribute true if this is an attribute name. 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An array of three strings containing the 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URI part (or empty string), the local part, 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and the raw name, all internalized, or null 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if there is an undeclared prefix. 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#processName 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String [] processName (String qName, boolean isAttribute) 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String name[]; 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable table; 643f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // detect errors in call sequence 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declsOK = false; 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Select the appropriate table. 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isAttribute) { 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project table = attributeNameTable; 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project table = elementNameTable; 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 653f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Start by looking in the cache, and 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // return immediately if the name 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // is already known in this content 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name = (String[])table.get(qName); 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (name != null) { 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return name; 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 661f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We haven't seen this name in this 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // context before. Maybe in the parent 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // context, but we can't assume prefix 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // bindings are the same. 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name = new String[3]; 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[2] = qName.intern(); 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int index = qName.indexOf(':'); 669f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 670f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // No prefix. 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index == -1) { 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isAttribute) { 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (qName == "xmlns" && namespaceDeclUris) 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = NSDECL; 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = ""; 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (defaultNS == null) { 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = ""; 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = defaultNS; 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[1] = name[2]; 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 685f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Prefix 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String prefix = qName.substring(0, index); 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String local = qName.substring(index+1); 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String uri; 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ("".equals(prefix)) { 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uri = defaultNS; 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uri = (String)prefixTable.get(prefix); 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (uri == null 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || (!isAttribute && "xmlns".equals (prefix))) { 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[0] = uri; 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name[1] = local.intern(); 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 703f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Save in the cache for future use. 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // (Could be shared with parent context...) 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project table.put(name[2], name); 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return name; 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 709f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Look up the URI associated with a prefix in this context. 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param prefix The prefix to look up. 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The associated Namespace URI, or null if none is 716f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * declared. 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#getURI 718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String getURI (String prefix) 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ("".equals(prefix)) { 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultNS; 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (prefixTable == null) { 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (String)prefixTable.get(prefix); 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Look up one of the prefixes associated with a URI in this context. 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>Since many prefixes may be mapped to the same URI, 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the return value may be unreliable.</p> 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param uri The URI to look up. 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The associated prefix, or null if none is declared. 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#getPrefix 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String getPrefix (String uri) 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (uriTable == null) { 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (String)uriTable.get(uri); 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 749f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 750f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of prefixes declared in this context. 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of prefixes (possibly empty). 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#getDeclaredPrefixes 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration getDeclaredPrefixes () 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (declarations == null) { 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return EMPTY_ENUMERATION; 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return declarations.elements(); 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 765f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 766f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return an enumeration of all prefixes currently in force. 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>The default prefix, if in force, is <em>not</em> 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returned, and will have to be checked for separately.</p> 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An enumeration of prefixes (never empty). 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see org.xml.sax.helpers.NamespaceSupport#getPrefixes 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enumeration getPrefixes () 777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (prefixTable == null) { 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return EMPTY_ENUMERATION; 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return prefixTable.keys(); 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 784f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 785f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal methods. 789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copy on write for the internal tables in this context. 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This class is optimized for the normal case where most 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements do not contain Namespace declarations.</p> 797f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes */ 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void copyTables () 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project { 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (prefixTable != null) { 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixTable = (Hashtable)prefixTable.clone(); 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project prefixTable = new Hashtable(); 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (uriTable != null) { 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uriTable = (Hashtable)uriTable.clone(); 807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project uriTable = new Hashtable(); 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project elementNameTable = new Hashtable(); 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project attributeNameTable = new Hashtable(); 812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project declSeen = true; 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Protected state. 819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 820f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable prefixTable; 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable uriTable; 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable elementNameTable; 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Hashtable attributeNameTable; 825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String defaultNS = null; 826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean declsOK = true; 827f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal state. 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //////////////////////////////////////////////////////////////// 833f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Vector declarations = null; 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean declSeen = false; 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Context parent = null; 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// end of NamespaceSupport.java 841