19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: NamespaceSupport2.java 468655 2006-10-28 07:12:06Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.utils;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.EmptyStackException;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Enumeration;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Hashtable;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Encapsulate Namespace tracking logic for use by SAX drivers.
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>This class is an attempt to rewrite the SAX NamespaceSupport
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * "helper" class for improved efficiency. It can be used to track the
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * namespace declarations currently in scope, providing lookup
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * routines to map prefixes to URIs and vice versa.</p>
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>ISSUE: For testing purposes, I've extended NamespaceSupport even
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * though I'm completely reasserting all behaviors and fields.
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Wasteful.... But SAX did not put an interface under that object and
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * we seem to have written that SAX class into our APIs... and I don't
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * want to argue with it right now. </p>
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.helpers.NamespaceSupport
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * */
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class NamespaceSupport2
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    extends org.xml.sax.helpers.NamespaceSupport
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Internal state.
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Context2 currentContext; // Current point on the double-linked stack
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Constants.
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The XML Namespace as a constant.
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>This is the Namespace URI that is automatically mapped
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * to the "xml" prefix.</p>
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public final static String XMLNS =
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        "http://www.w3.org/XML/1998/namespace";
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Constructor.
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Create a new Namespace support object.
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public NamespaceSupport2 ()
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        reset();
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Context management.
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Reset this Namespace support object for reuse.
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>It is necessary to invoke this method before reusing the
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Namespace support object for a new session.</p>
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void reset ()
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Discarding the whole stack doesn't save us a lot versus
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // creating a new NamespaceSupport. Do we care, or should we
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // change this to just reset the root context?
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        currentContext = new Context2(null);
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        currentContext.declarePrefix("xml", XMLNS);
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Start a new Namespace context.
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>Normally, you should push a new context at the beginning
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * of each XML element: the new context will automatically inherit
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the declarations of its parent context, but it will also keep
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * track of which declarations were made within this context.</p>
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>The Namespace support object always starts with a base context
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * already in force: in this context, only the "xml" prefix is
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * declared.</p>
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #popContext
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void pushContext ()
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // JJK: Context has a parent pointer.
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // That means we don't need a stack to pop.
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // We may want to retain for reuse, but that can be done via
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // a child pointer.
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Context2 parentContext=currentContext;
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        currentContext = parentContext.getChild();
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (currentContext == null){
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                currentContext = new Context2(parentContext);
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else{
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // JJK: This will wipe out any leftover data
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // if we're reusing a previously allocated Context.
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            currentContext.setParent(parentContext);
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Revert to the previous Namespace context.
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>Normally, you should pop the context at the end of each
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * XML element.  After popping the context, all Namespace prefix
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * mappings that were previously in force are restored.</p>
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>You must not attempt to declare additional Namespace
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * prefixes after popping a context, unless you push another
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * context first.</p>
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #pushContext
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void popContext ()
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Context2 parentContext=currentContext.getParent();
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(parentContext==null)
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new EmptyStackException();
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            currentContext = parentContext;
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Operations within a context.
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////////
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Declare a Namespace prefix.
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>This method declares a prefix in the current Namespace
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * context; the prefix will remain in force until this context
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is popped, unless it is shadowed in a descendant context.</p>
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>To declare a default Namespace, use the empty string.  The
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * prefix must not be "xml" or "xmlns".</p>
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>Note that you must <em>not</em> declare a prefix after
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * you've pushed and popped another Namespace.</p>
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>Note that there is an asymmetry in this library: while {@link
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * #getPrefix getPrefix} will not return the default "" prefix,
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * even if you have declared one; to check for a default prefix,
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * you have to look it up explicitly using {@link #getURI getURI}.
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This asymmetry exists to make it easier to look up prefixes
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * for attribute names, where the default prefix is not allowed.</p>
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param prefix The prefix to declare, or null for the empty
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *        string.
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri The Namespace URI to associate with the prefix.
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if the prefix was legal, false otherwise
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #processName
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getURI
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getPrefix
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean declarePrefix (String prefix, String uri)
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (prefix.equals("xml") || prefix.equals("xmlns")) {
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return false;
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            currentContext.declarePrefix(prefix, uri);
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return true;
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Process a raw XML 1.0 name.
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>This method processes a raw XML 1.0 name in the current
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * context by removing the prefix and looking it up among the
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * prefixes currently declared.  The return value will be the
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * array supplied by the caller, filled in as follows:</p>
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <dl>
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <dt>parts[0]</dt>
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <dd>The Namespace URI, or an empty string if none is
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *  in use.</dd>
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <dt>parts[1]</dt>
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <dd>The local name (without prefix).</dd>
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <dt>parts[2]</dt>
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <dd>The original raw name.</dd>
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * </dl>
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>All of the strings in the array will be internalized.  If
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the raw name has a prefix that has not been declared, then
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the return value will be null.</p>
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>Note that attribute names are processed differently than
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * element names: an unprefixed element name will received the
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * default Namespace (if any), while an unprefixed element name
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * will not.</p>
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param qName The raw XML 1.0 name to be processed.
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param parts A string array supplied by the caller, capable of
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *        holding at least three members.
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param isAttribute A flag indicating whether this is an
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *        attribute name (true) or an element name (false).
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The supplied array holding three internalized strings
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *        representing the Namespace URI (or empty string), the
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *        local name, and the raw XML 1.0 name; or null if there
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *        is an undeclared prefix.
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #declarePrefix
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see java.lang.String#intern */
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String [] processName (String qName, String[] parts,
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                  boolean isAttribute)
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String[] name=currentContext.processName(qName, isAttribute);
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(name==null)
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return null;
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // JJK: This recopying is required because processName may return
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // a cached result. I Don't Like It. *****
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.arraycopy(name,0,parts,0,3);
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return parts;
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Look up a prefix and get the currently-mapped Namespace URI.
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>This method looks up the prefix in the current context.
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Use the empty string ("") for the default Namespace.</p>
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param prefix The prefix to look up.
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The associated Namespace URI, or null if the prefix
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         is undeclared in this context.
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getPrefix
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getPrefixes
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getURI (String prefix)
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return currentContext.getURI(prefix);
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return an enumeration of all prefixes currently declared.
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p><strong>Note:</strong> if there is a default prefix, it will not be
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * returned in this enumeration; check for the default prefix
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * using the {@link #getURI getURI} with an argument of "".</p>
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return An enumeration of all prefixes declared in the
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         current context except for the empty (default)
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         prefix.
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getDeclaredPrefixes
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getURI
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Enumeration getPrefixes ()
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return currentContext.getPrefixes();
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return one of the prefixes mapped to a Namespace URI.
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>If more than one prefix is currently mapped to the same
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * URI, this method will make an arbitrary selection; if you
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * want all of the prefixes, use the {@link #getPrefixes}
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * method instead.</p>
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p><strong>Note:</strong> this will never return the empty
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * (default) prefix; to check for a default prefix, use the {@link
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * #getURI getURI} method with an argument of "".</p>
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri The Namespace URI.
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return One of the prefixes currently mapped to the URI supplied,
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         or null if none is mapped or if the URI is assigned to
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         the default Namespace.
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getPrefixes(java.lang.String)
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getURI */
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getPrefix (String uri)
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return currentContext.getPrefix(uri);
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return an enumeration of all prefixes currently declared for a URI.
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>This method returns prefixes mapped to a specific Namespace
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * URI.  The xml: prefix will be included.  If you want only one
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * prefix that's mapped to the Namespace URI, and you don't care
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * which one you get, use the {@link #getPrefix getPrefix}
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *  method instead.</p>
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p><strong>Note:</strong> the empty (default) prefix is
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <em>never</em> included in this enumeration; to check for the
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * presence of a default Namespace, use the {@link #getURI getURI}
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * method with an argument of "".</p>
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri The Namespace URI.
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return An enumeration of all prefixes declared in the
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         current context.
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getPrefix
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getDeclaredPrefixes
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getURI */
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Enumeration getPrefixes (String uri)
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // JJK: The old code involved creating a vector, filling it
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // with all the matching prefixes, and then getting its
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // elements enumerator. Wastes storage, wastes cycles if we
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // don't actually need them all. Better to either implement
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // a specific enumerator for these prefixes... or a filter
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // around the all-prefixes enumerator, which comes out to
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // roughly the same thing.
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // **** Currently a filter. That may not be most efficient
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // when I'm done restructuring storage!
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return new PrefixForUriEnumerator(this,uri,getPrefixes());
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return an enumeration of all prefixes declared in this context.
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>The empty (default) prefix will be included in this
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * enumeration; note that this behaviour differs from that of
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * {@link #getPrefix} and {@link #getPrefixes}.</p>
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return An enumeration of all prefixes declared in this
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         context.
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getPrefixes
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #getURI
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Enumeration getDeclaredPrefixes ()
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return currentContext.getDeclaredPrefixes();
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson////////////////////////////////////////////////////////////////////
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// Local classes.
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// These were _internal_ classes... but in fact they don't have to be,
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// and may be more efficient if they aren't.
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson////////////////////////////////////////////////////////////////////
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Implementation of Enumeration filter, wrapped
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * aroung the get-all-prefixes version of the operation. This is NOT
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * necessarily the most efficient approach; finding the URI and then asking
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * what prefixes apply to it might make much more sense.
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonclass PrefixForUriEnumerator implements Enumeration
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Enumeration allPrefixes;
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String uri;
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String lookahead=null;
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private NamespaceSupport2 nsup;
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Kluge: Since one can't do a constructor on an
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // anonymous class (as far as I know)...
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    PrefixForUriEnumerator(NamespaceSupport2 nsup,String uri, Enumeration allPrefixes)
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	this.nsup=nsup;
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.uri=uri;
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.allPrefixes=allPrefixes;
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean hasMoreElements()
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(lookahead!=null)
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return true;
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while(allPrefixes.hasMoreElements())
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String prefix=(String)allPrefixes.nextElement();
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if(uri.equals(nsup.getURI(prefix)))
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    {
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        lookahead=prefix;
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        return true;
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return false;
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Object nextElement()
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(hasMoreElements())
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String tmp=lookahead;
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                lookahead=null;
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return tmp;
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new java.util.NoSuchElementException();
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Internal class for a single Namespace context.
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>This module caches and reuses Namespace contexts, so the number allocated
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * will be equal to the element depth of the document, not to the total
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * number of elements (i.e. 5-10 rather than tens of thousands).</p>
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonfinal class Context2 {
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Manefest Constants
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * An empty enumeration.
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static Enumeration EMPTY_ENUMERATION =
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        new Vector().elements();
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Protected state.
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Hashtable prefixTable;
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Hashtable uriTable;
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Hashtable elementNameTable;
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Hashtable attributeNameTable;
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String defaultNS = null;
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Internal state.
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Vector declarations = null;
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean tablesDirty = false;
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Context2 parent = null;
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Context2 child = null;
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Create a new Namespace context.
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Context2 (Context2 parent)
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(parent==null)
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                prefixTable = new Hashtable();
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                uriTable = new Hashtable();
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                elementNameTable=null;
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                attributeNameTable=null;
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            setParent(parent);
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @returns The child Namespace context object, or null if this
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is the last currently on the chain.
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Context2 getChild()
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return child;
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @returns The parent Namespace context object, or null if this
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is the root.
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Context2 getParent()
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return parent;
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * (Re)set the parent of this Namespace context.
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This is separate from the c'tor because it's re-applied
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * when a Context2 is reused by push-after-pop.
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param context The parent Namespace context object.
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    void setParent (Context2 parent)
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.parent = parent;
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        parent.child = this;        // JJK: Doubly-linked
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        declarations = null;
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        prefixTable = parent.prefixTable;
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        uriTable = parent.uriTable;
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        elementNameTable = parent.elementNameTable;
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        attributeNameTable = parent.attributeNameTable;
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        defaultNS = parent.defaultNS;
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        tablesDirty = false;
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Declare a Namespace prefix for this context.
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param prefix The prefix to declare.
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri The associated Namespace URI.
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.helpers.NamespaceSupport2#declarePrefix
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    void declarePrefix (String prefix, String uri)
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // Lazy processing...
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (!tablesDirty) {
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            copyTables();
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (declarations == null) {
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            declarations = new Vector();
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        prefix = prefix.intern();
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        uri = uri.intern();
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ("".equals(prefix)) {
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ("".equals(uri)) {
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                defaultNS = null;
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                defaultNS = uri;
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            prefixTable.put(prefix, uri);
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            uriTable.put(uri, prefix); // may wipe out another prefix
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        declarations.addElement(prefix);
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Process a raw XML 1.0 name in this context.
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param qName The raw XML 1.0 name.
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param isAttribute true if this is an attribute name.
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return An array of three strings containing the
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         URI part (or empty string), the local part,
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         and the raw name, all internalized, or null
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         if there is an undeclared prefix.
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.helpers.NamespaceSupport2#processName
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String [] processName (String qName, boolean isAttribute)
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String name[];
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Hashtable table;
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // Select the appropriate table.
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (isAttribute) {
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if(elementNameTable==null)
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                elementNameTable=new Hashtable();
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            table = elementNameTable;
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if(attributeNameTable==null)
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                attributeNameTable=new Hashtable();
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            table = attributeNameTable;
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // Start by looking in the cache, and
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // return immediately if the name
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // is already known in this content
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        name = (String[])table.get(qName);
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (name != null) {
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return name;
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // We haven't seen this name in this
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // context before.
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        name = new String[3];
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int index = qName.indexOf(':');
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // No prefix.
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (index == -1) {
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (isAttribute || defaultNS == null) {
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                name[0] = "";
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                name[0] = defaultNS;
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            name[1] = qName.intern();
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            name[2] = name[1];
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // Prefix
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else {
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String prefix = qName.substring(0, index);
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String local = qName.substring(index+1);
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String uri;
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ("".equals(prefix)) {
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                uri = defaultNS;
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                uri = (String)prefixTable.get(prefix);
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (uri == null) {
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return null;
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            name[0] = uri;
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            name[1] = local.intern();
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            name[2] = qName.intern();
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                // Save in the cache for future use.
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        table.put(name[2], name);
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        tablesDirty = true;
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return name;
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Look up the URI associated with a prefix in this context.
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param prefix The prefix to look up.
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The associated Namespace URI, or null if none is
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *         declared.
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.helpers.NamespaceSupport2#getURI
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String getURI (String prefix)
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ("".equals(prefix)) {
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return defaultNS;
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (prefixTable == null) {
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return null;
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return (String)prefixTable.get(prefix);
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Look up one of the prefixes associated with a URI in this context.
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>Since many prefixes may be mapped to the same URI,
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the return value may be unreliable.</p>
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param uri The URI to look up.
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return The associated prefix, or null if none is declared.
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.helpers.NamespaceSupport2#getPrefix
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String getPrefix (String uri)
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (uriTable == null) {
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return null;
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return (String)uriTable.get(uri);
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return an enumeration of prefixes declared in this context.
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return An enumeration of prefixes (possibly empty).
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.helpers.NamespaceSupport2#getDeclaredPrefixes
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Enumeration getDeclaredPrefixes ()
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (declarations == null) {
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return EMPTY_ENUMERATION;
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return declarations.elements();
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return an enumeration of all prefixes currently in force.
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>The default prefix, if in force, is <em>not</em>
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * returned, and will have to be checked for separately.</p>
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return An enumeration of prefixes (never empty).
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.xml.sax.helpers.NamespaceSupport2#getPrefixes
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Enumeration getPrefixes ()
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (prefixTable == null) {
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return EMPTY_ENUMERATION;
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return prefixTable.keys();
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Internal methods.
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ////////////////////////////////////////////////////////////////
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Copy on write for the internal tables in this context.
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>This class is optimized for the normal case where most
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * elements do not contain Namespace declarations. In that case,
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the Context2 will share data structures with its parent.
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * New tables are obtained only when new declarations are issued,
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * so they can be popped off the stack.</p>
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p> JJK: **** Alternative: each Context2 might declare
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *  _only_ its local bindings, and delegate upward if not found.</p>
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void copyTables ()
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Start by copying our parent's bindings
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        prefixTable = (Hashtable)prefixTable.clone();
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        uriTable = (Hashtable)uriTable.clone();
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Replace the caches with empty ones, rather than
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // trying to determine which bindings should be flushed.
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // As far as I can tell, these caches are never actually
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // used in Xalan... More efficient to remove the whole
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // cache system? ****
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(elementNameTable!=null)
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            elementNameTable=new Hashtable();
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(attributeNameTable!=null)
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            attributeNameTable=new Hashtable();
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        tablesDirty = true;
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// end of NamespaceSupport2.java
750