001: /*--
002:
003: $Id: NamespaceStack.java,v 1.1 2005/04/27 09:32:41 wittek Exp $
004:
005: Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin.
006: All rights reserved.
007:
008: Redistribution and use in source and binary forms, with or without
009: modification, are permitted provided that the following conditions
010: are met:
011:
012: 1. Redistributions of source code must retain the above copyright
013: notice, this list of conditions, and the following disclaimer.
014:
015: 2. Redistributions in binary form must reproduce the above copyright
016: notice, this list of conditions, and the disclaimer that follows
017: these conditions in the documentation and/or other materials
018: provided with the distribution.
019:
020: 3. The name "JDOM" must not be used to endorse or promote products
021: derived from this software without prior written permission. For
022: written permission, please contact <request_AT_jdom_DOT_org>.
023:
024: 4. Products derived from this software may not be called "JDOM", nor
025: may "JDOM" appear in their name, without prior written permission
026: from the JDOM Project Management <request_AT_jdom_DOT_org>.
027:
028: In addition, we request (but do not require) that you include in the
029: end-user documentation provided with the redistribution and/or in the
030: software itself an acknowledgement equivalent to the following:
031: "This product includes software developed by the
032: JDOM Project (http://www.jdom.org/)."
033: Alternatively, the acknowledgment may be graphical using the logos
034: available at http://www.jdom.org/images/logos.
035:
036: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: DISCLAIMED. IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
040: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: SUCH DAMAGE.
048:
049: This software consists of voluntary contributions made by many
050: individuals on behalf of the JDOM Project and was originally
051: created by Jason Hunter <jhunter_AT_jdom_DOT_org> and
052: Brett McLaughlin <brett_AT_jdom_DOT_org>. For more information
053: on the JDOM Project, please see <http://www.jdom.org/>.
054:
055: */
056: package org.jdom.output;
057:
058: import java.util.*;
059:
060: import org.jdom.Namespace;
061:
062: /**
063: * A non-public utility class used by both <code>{@link XMLOutputter}</code> and
064: * <code>{@link SAXOutputter}</code> to manage namespaces in a JDOM Document
065: * during output.
066: *
067: * @version $Revision: 1.1 $, $Date: 2005/04/27 09:32:41 $
068: * @author Elliotte Rusty Harolde
069: * @author Fred Trimble
070: * @author Brett McLaughlin
071: */
072: class NamespaceStack {
073:
074: private static final String CVS_ID = "@(#) $RCSfile: NamespaceStack.java,v $ $Revision: 1.1 $ $Date: 2005/04/27 09:32:41 $ $Name: $";
075:
076: /** The prefixes available */
077: private Stack prefixes;
078:
079: /** The URIs available */
080: private Stack uris;
081:
082: /**
083: * This creates the needed storage.
084: */
085: NamespaceStack() {
086: prefixes = new Stack();
087: uris = new Stack();
088: }
089:
090: /**
091: * This will add a new <code>{@link Namespace}</code>
092: * to those currently available.
093: *
094: * @param ns <code>Namespace</code> to add.
095: */
096: public void push(Namespace ns) {
097: prefixes.push(ns.getPrefix());
098: uris.push(ns.getURI());
099: }
100:
101: /**
102: * This will remove the topmost (most recently added)
103: * <code>{@link Namespace}</code>, and return its prefix.
104: *
105: * @return <code>String</code> - the popped namespace prefix.
106: */
107: public String pop() {
108: String prefix = (String) prefixes.pop();
109: uris.pop();
110:
111: return prefix;
112: }
113:
114: /**
115: * This returns the number of available namespaces.
116: *
117: * @return <code>int</code> - size of the namespace stack.
118: */
119: public int size() {
120: return prefixes.size();
121: }
122:
123: /**
124: * Given a prefix, this will return the namespace URI most
125: * rencently (topmost) associated with that prefix.
126: *
127: * @param prefix <code>String</code> namespace prefix.
128: * @return <code>String</code> - the namespace URI for that prefix.
129: */
130: public String getURI(String prefix) {
131: int index = prefixes.lastIndexOf(prefix);
132: if (index == -1) {
133: return null;
134: }
135: String uri = (String) uris.elementAt(index);
136: return uri;
137: }
138:
139: /**
140: * This will print out the size and current stack, from the
141: * most recently added <code>{@link Namespace}</code> to
142: * the "oldest," all to <code>System.out</code>.
143: */
144: public String toString() {
145: StringBuffer buf = new StringBuffer();
146: String sep = System.getProperty("line.separator");
147: buf.append("Stack: " + prefixes.size() + sep);
148: for (int i = 0; i < prefixes.size(); i++) {
149: buf.append(prefixes.elementAt(i) + "&" + uris.elementAt(i)
150: + sep);
151: }
152: return buf.toString();
153: }
154: }
|