| /* | ||
| * Copyright 2001-2004 (C) MetaStuff, Ltd. All Rights Reserved. | ||
| * | ||
| * This software is open source. | ||
| * See the bottom of this file for the licence. | ||
| * | ||
| * $Id: Namespace.java,v 1.20 2004/06/25 08:03:33 maartenc Exp $ | ||
| */ | ||
| package org.dom4j; | ||
| import org.dom4j.tree.AbstractNode; | ||
| import org.dom4j.tree.DefaultNamespace; | ||
| import org.dom4j.tree.NamespaceCache; | ||
| /** <p><code>Namespace</code> is a Flyweight Namespace that can be shared amongst nodes.</p> | ||
| * | ||
| * @author <a href="mailto:jstrachan@apache.org">James Strachan</a> | ||
| * @version $Revision: 1.20 $ | ||
| */ | ||
| public class Namespace extends AbstractNode { | ||
| /** Cache of Namespace instances */ | ||
| protected static final NamespaceCache cache = new NamespaceCache(); | ||
| /** XML Namespace */ | ||
| public static final Namespace XML_NAMESPACE | ||
| = cache.get("xml", "http://www.w3.org/XML/1998/namespace"); | ||
| /** No Namespace present */ | ||
| public static final Namespace NO_NAMESPACE | ||
| = cache.get("", ""); | ||
| /** The prefix mapped to this namespace */ | ||
| private String prefix; | ||
| /** The URI for this namespace */ | ||
| private String uri; | ||
| /** A cached version of the hashcode for efficiency */ | ||
| private int hashCode; | ||
| /** A helper method to return the Namespace instance | ||
| * for the given prefix and URI | ||
| * | ||
| * @return an interned Namespace object | ||
| */ | ||
| public static Namespace get(String prefix, String uri) { | ||
| 132410x | return cache.get(prefix, uri); | |
| } | ||
| /** A helper method to return the Namespace instance | ||
| * for no prefix and the URI | ||
| * | ||
| * @return an interned Namespace object | ||
| */ | ||
| public static Namespace get(String uri) { | ||
| 8x | return cache.get(uri); | |
| } | ||
| /** @param prefix is the prefix for this namespace | ||
| * @param uri is the URI for this namespace | ||
| */ | ||
| 20706x | public Namespace(String prefix, String uri) { | |
| 1/2 20706x | this.prefix = (prefix != null) ? prefix : ""; | |
| 1/2 20706x | this.uri = (uri != null) ? uri : "";; | |
| 20706x | } | |
| public short getNodeType() { | ||
| 14x | return NAMESPACE_NODE; | |
| } | ||
| /** @return the hash code based on the qualified name and the URI of the | ||
| * namespace. | ||
| */ | ||
| public int hashCode() { | ||
| 2/2 34276x | if ( hashCode == 0 ) { | |
| 384x | hashCode = createHashCode(); | |
| } | ||
| 34276x | return hashCode; | |
| } | ||
| /** Factory method to create the hashcode allowing derived classes to change the behaviour */ | ||
| protected int createHashCode() { | ||
| 384x | int hashCode = uri.hashCode() ^ prefix.hashCode(); | |
| 2/2 384x | if ( hashCode == 0 ) { | |
| 2x | hashCode = 0xbabe; | |
| } | ||
| 384x | return hashCode; | |
| } | ||
| /** | ||
| * Checks whether this Namespace equals the given Namespace. Two Namespaces | ||
| * are equals if their URI and prefix are equal. | ||
| */ | ||
| public boolean equals(Object object) { | ||
| 2/2 296x | if ( this == object ) { | |
| 14x | return true; | |
| } | ||
| 1/2 282x | else if ( object instanceof Namespace ) { | |
| 282x | Namespace that = (Namespace) object; | |
| // we cache hash codes so this should be quick | ||
| 2/2 282x | if ( hashCode() == that.hashCode() ) { | |
| 2/4 280x | return uri.equals( that.getURI() ) | |
| && prefix.equals( that.getPrefix() ); | ||
| } | ||
| } | ||
| 2x | return false; | |
| } | ||
| public String getText() { | ||
| 0x | return uri; | |
| } | ||
| public String getStringValue() { | ||
| 0x | return uri; | |
| } | ||
| /** @return the prefix for this <code>Namespace</code>. | ||
| */ | ||
| public String getPrefix() { | ||
| 95196x | return prefix; | |
| } | ||
| /** @return the URI for this <code>Namespace</code>. | ||
| */ | ||
| public String getURI() { | ||
| 50632x | return uri; | |
| } | ||
| public String getXPathNameStep() { | ||
| 0/4 0x | if (prefix != null && !"".equals( prefix )) { | |
| 0x | return "namespace::" + prefix; | |
| } | ||
| 0x | return "namespace::*[name()='']"; | |
| } | ||
| public String getPath(Element context) { | ||
| 0x | StringBuffer path = new StringBuffer(10); | |
| 0x | Element parent = getParent(); | |
| 0/4 0x | if (parent != null && parent != context) { | |
| 0x | path.append( parent.getPath( context ) ); | |
| 0x | path.append( '/' ); | |
| } | ||
| 0x | path.append( getXPathNameStep() ); | |
| 0x | return path.toString(); | |
| } | ||
| public String getUniquePath(Element context) { | ||
| 0x | StringBuffer path = new StringBuffer(10); | |
| 0x | Element parent = getParent(); | |
| 0/4 0x | if (parent != null && parent != context) { | |
| 0x | path.append( parent.getUniquePath( context ) ); | |
| 0x | path.append( '/' ); | |
| } | ||
| 0x | path.append( getXPathNameStep() ); | |
| 0x | return path.toString(); | |
| } | ||
| public String toString() { | ||
| 58x | return super.toString() + " [Namespace: prefix " + getPrefix() | |
| + " mapped to URI \"" + getURI() + "\"]"; | ||
| } | ||
| public String asXML() { | ||
| 10x | StringBuffer asxml = new StringBuffer(10); | |
| 10x | String prefix = getPrefix(); | |
| 2/4 10x | if ( prefix != null && prefix.length() > 0 ) { | |
| 10x | asxml.append("xmlns:"); | |
| 10x | asxml.append(prefix); | |
| 10x | asxml.append("=\""); | |
| } | ||
| else { | ||
| 0x | asxml.append("xmlns=\""); | |
| } | ||
| 10x | asxml.append(getURI()); | |
| 10x | asxml.append("\""); | |
| 10x | return asxml.toString(); | |
| } | ||
| public void accept(Visitor visitor) { | ||
| 0x | visitor.visit(this); | |
| 0x | } | |
| protected Node createXPathResult(Element parent) { | ||
| 72x | return new DefaultNamespace( parent, getPrefix(), getURI() ); | |
| } | ||
| } | ||
| /* | ||
| * Redistribution and use of this software and associated documentation | ||
| * ("Software"), with or without modification, are permitted provided | ||
| * that the following conditions are met: | ||
| * | ||
| * 1. Redistributions of source code must retain copyright | ||
| * statements and notices. Redistributions must also contain a | ||
| * copy of this document. | ||
| * | ||
| * 2. Redistributions in binary form must reproduce the | ||
| * above copyright notice, this list of conditions and the | ||
| * following disclaimer in the documentation and/or other | ||
| * materials provided with the distribution. | ||
| * | ||
| * 3. The name "DOM4J" must not be used to endorse or promote | ||
| * products derived from this Software without prior written | ||
| * permission of MetaStuff, Ltd. For written permission, | ||
| * please contact dom4j-info@metastuff.com. | ||
| * | ||
| * 4. Products derived from this Software may not be called "DOM4J" | ||
| * nor may "DOM4J" appear in their names without prior written | ||
| * permission of MetaStuff, Ltd. DOM4J is a registered | ||
| * trademark of MetaStuff, Ltd. | ||
| * | ||
| * 5. Due credit should be given to the DOM4J Project - | ||
| * http://www.dom4j.org | ||
| * | ||
| * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS | ||
| * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT | ||
| * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||
| * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL | ||
| * METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | ||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| * | ||
| * Copyright 2001-2004 (C) MetaStuff, Ltd. All Rights Reserved. | ||
| * | ||
| * $Id: Namespace.java,v 1.20 2004/06/25 08:03:33 maartenc Exp $ | ||
| */ |