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:  $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.serializer.dom3;
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Enumeration;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.NoSuchElementException;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Namespace support for XML document handlers. This class doesn't
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * perform any error checking and assumes that all strings passed
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * as arguments to methods are unique symbols. The SymbolTable class
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * can be used for this purpose.
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Derived from org.apache.xerces.util.NamespaceSupport
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @author Andy Clark, IBM
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @version $Id: Exp $
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class NamespaceSupport {
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	static final String PREFIX_XML = "xml".intern();
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	static final String PREFIX_XMLNS = "xmlns".intern();
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The XML Namespace ("http://www.w3.org/XML/1998/namespace"). This is
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the Namespace URI that is automatically mapped to the "xml" prefix.
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public final static String XML_URI = "http://www.w3.org/XML/1998/namespace".intern();
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * XML Information Set REC
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * all namespace attributes (including those named xmlns,
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * whose [prefix] property has no value) have a namespace URI of http://www.w3.org/2000/xmlns/
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public final static String XMLNS_URI = "http://www.w3.org/2000/xmlns/".intern();
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	//
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Data
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Namespace binding information. This array is composed of a
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * series of tuples containing the namespace binding information:
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <prefix, uri>. The default size can be set to anything
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * as long as it is a power of 2 greater than 1.
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #fNamespaceSize
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #fContext
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String[] fNamespace = new String[16 * 2];
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The top of the namespace information array. */
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int fNamespaceSize;
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // NOTE: The constructor depends on the initial context size
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //       being at least 1. -Ac
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Context indexes. This array contains indexes into the namespace
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * information array. The index at the current context is the start
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * index of declared namespace bindings and runs to the size of the
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * namespace information array.
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see #fNamespaceSize
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int[] fContext = new int[8];
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** The current context. */
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int fCurrentContext;
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String[] fPrefixes = new String[16];
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Constructors
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** Default constructor. */
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public NamespaceSupport() {
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // <init>()
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Public methods
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xerces.xni.NamespaceContext#reset()
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void reset() {
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // reset namespace and context info
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fNamespaceSize = 0;
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fCurrentContext = 0;
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fContext[fCurrentContext] = fNamespaceSize;
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // bind "xml" prefix to the XML uri
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fNamespace[fNamespaceSize++] = PREFIX_XML;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fNamespace[fNamespaceSize++] = XML_URI;
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // bind "xmlns" prefix to the XMLNS uri
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fNamespace[fNamespaceSize++] = PREFIX_XMLNS;
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fNamespace[fNamespaceSize++] = XMLNS_URI;
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ++fCurrentContext;
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // reset(SymbolTable)
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xerces.xni.NamespaceContext#pushContext()
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void pushContext() {
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // extend the array, if necessary
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (fCurrentContext + 1 == fContext.length) {
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int[] contextarray = new int[fContext.length * 2];
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            System.arraycopy(fContext, 0, contextarray, 0, fContext.length);
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fContext = contextarray;
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // push context
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fContext[++fCurrentContext] = fNamespaceSize;
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // pushContext()
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xerces.xni.NamespaceContext#popContext()
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void popContext() {
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fNamespaceSize = fContext[fCurrentContext--];
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // popContext()
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xerces.xni.NamespaceContext#declarePrefix(String, String)
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean declarePrefix(String prefix, String uri) {
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // ignore "xml" and "xmlns" prefixes
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (prefix == PREFIX_XML || prefix == PREFIX_XMLNS) {
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return false;
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // see if prefix already exists in current context
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = fNamespaceSize; i > fContext[fCurrentContext]; i -= 2) {
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //if (fNamespace[i - 2] == prefix) {
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        	if (fNamespace[i - 2].equals(prefix) )  {
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // REVISIT: [Q] Should the new binding override the
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                //          previously declared binding or should it
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                //          it be ignored? -Ac
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // NOTE:    The SAX2 "NamespaceSupport" helper allows
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                //          re-bindings with the new binding overwriting
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                //          the previous binding. -Ac
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fNamespace[i - 1] = uri;
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return true;
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // resize array, if needed
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (fNamespaceSize == fNamespace.length) {
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String[] namespacearray = new String[fNamespaceSize * 2];
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            System.arraycopy(fNamespace, 0, namespacearray, 0, fNamespaceSize);
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fNamespace = namespacearray;
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // bind prefix to uri in current context
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fNamespace[fNamespaceSize++] = prefix;
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fNamespace[fNamespaceSize++] = uri;
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // declarePrefix(String,String):boolean
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xerces.xni.NamespaceContext#getURI(String)
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getURI(String prefix) {
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // find prefix in current context
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = fNamespaceSize; i > 0; i -= 2) {
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //if (fNamespace[i - 2] == prefix) {
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        	if (fNamespace[i - 2].equals(prefix) ) {
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return fNamespace[i - 1];
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // prefix not found
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return null;
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // getURI(String):String
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xerces.xni.NamespaceContext#getPrefix(String)
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getPrefix(String uri) {
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // find uri in current context
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = fNamespaceSize; i > 0; i -= 2) {
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //if (fNamespace[i - 1] == uri) {
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        	if (fNamespace[i - 1].equals(uri) ) {
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                //if (getURI(fNamespace[i - 2]) == uri)
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        		if (getURI(fNamespace[i - 2]).equals(uri) )
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return fNamespace[i - 2];
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // uri not found
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return null;
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // getPrefix(String):String
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xerces.xni.NamespaceContext#getDeclaredPrefixCount()
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public int getDeclaredPrefixCount() {
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (fNamespaceSize - fContext[fCurrentContext]) / 2;
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // getDeclaredPrefixCount():int
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xerces.xni.NamespaceContext#getDeclaredPrefixAt(int)
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getDeclaredPrefixAt(int index) {
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return fNamespace[fContext[fCurrentContext] + index * 2];
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // getDeclaredPrefixAt(int):String
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see org.apache.xerces.xni.NamespaceContext#getAllPrefixes()
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	public Enumeration getAllPrefixes() {
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int count = 0;
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (fPrefixes.length < (fNamespace.length/2)) {
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // resize prefix array
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String[] prefixes = new String[fNamespaceSize];
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fPrefixes = prefixes;
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String prefix = null;
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        boolean unique = true;
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = 2; i < (fNamespaceSize-2); i += 2) {
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            prefix = fNamespace[i + 2];
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            for (int k=0;k<count;k++){
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (fPrefixes[k]==prefix){
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    unique = false;
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    break;
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (unique){
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fPrefixes[count++] = prefix;
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            unique = true;
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		return new Prefixes(fPrefixes, count);
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected final class Prefixes implements Enumeration {
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        private String[] prefixes;
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        private int counter = 0;
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        private int size = 0;
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		/**
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 * Constructor for Prefixes.
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 */
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		public Prefixes(String [] prefixes, int size) {
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			this.prefixes = prefixes;
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            this.size = size;
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       /**
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 * @see java.util.Enumeration#hasMoreElements()
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 */
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		public boolean hasMoreElements() {
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			return (counter< size);
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		/**
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 * @see java.util.Enumeration#nextElement()
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		 */
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		public Object nextElement() {
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (counter< size){
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return fPrefixes[counter++];
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson			throw new NoSuchElementException("Illegal access to Namespace prefixes enumeration.");
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		}
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        public String toString(){
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            StringBuffer buf = new StringBuffer();
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            for (int i=0;i<size;i++){
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                buf.append(prefixes[i]);
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                buf.append(" ");
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return buf.toString();
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} // class NamespaceSupport
316