/* Namespace.java
Purpose: Namespace
Description:
History:
2001/10/21 16:06:46, Create, Tom M. Yeh
Copyright (C) 2001 Potix Corporation. All Rights Reserved.
{{IS_RIGHT
This program is distributed under LGPL Version 2.1 in the hope that
it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.idom;
import java.io.Serializable;
/**
* Represents the namespace.
* A namespace is immutable, so you have to get a new one
*
* @author tomyeh
* @see Item
*/
public final class Namespace implements Serializable, Cloneable {
private static final long serialVersionUID = 20060622L;
/** The <code>Namespace</code> for when <i>not</i> in a namespace
*/
public static final Namespace NO_NAMESPACE = newSpecialNamespace("", "");
/** The xml namespace.
*/
public static final Namespace XML_NAMESPACE = newSpecialNamespace(
"xml", "http://www.w3.org/XML/1998/namespace");
/** The xmlns namespace.
*/
public static final Namespace XMLNS_NAMESPACE = newSpecialNamespace(
"xmlns", "http://www.w3.org/XML/1998/namespace");
/** The prefix mapped to this namespace */
private String _prefix;
/** The URI for this namespace */
private String _uri;
/** Returns the special namespace if prefix is special, or null if not.
*/
public static Namespace getSpecial(String prefix) {
if (prefix.equals("xml"))
return Namespace.XML_NAMESPACE;
if (prefix.equals("xmlns"))
return Namespace.XMLNS_NAMESPACE;
return null;
}
/** Assigns a special namespace whose name starts with xml.
* We need it because the verifier will reject it.
*/
private static final Namespace
newSpecialNamespace(String prefix, String uri) {
Namespace ns = new Namespace("", uri);
ns._prefix = prefix; //assign directly to avoid checkNam...
return ns;
}
/**
* Constructor.
*
* @param prefix String prefix to map to this namespace.
* @param uri String URI for namespace.
* @exception DOMException with NAMESPACE_ERR if the given prefix and uri
* is invalid
*/
public Namespace(String prefix, String uri) {
Verifier.checkNamespacePrefix(prefix, null);
Verifier.checkNamespaceURI(uri, null);
if (prefix.length() != 0 && uri.length() == 0)
throw new DOMException(DOMException.NAMESPACE_ERR,
"Non-empty prefix, "+prefix+", requires a URI");
_prefix = prefix;
_uri = uri;
}
/**
* Gets the tag name of the giving local name.
*/
public final String tagNameOf(String name) {
assert(name.indexOf(':') < 0);
int len = _prefix.length();
return len == 0 ? name: _prefix + ':' + name;
}
/**
* Gets the prefix mapped to this Namespace.
*/
public final String getPrefix() {
return _prefix;
}
/**
* Gets the namespace URI for this Namespace.
*/
public final String getURI() {
return _uri;
}
/** Tests whether two namespace are the same in both prefix
* and namespace URI.
* On the other hand, equals check only the namespace URI.
*
* <p>Note: unlike equals, it throws DOMException if prefix
* is the same but URI is different.
*
* @exception DOMException if they have the same prefix
* but with different namespace URI
*/
public final boolean equalsAll(Namespace ns) {
if (_prefix.equals(ns._prefix))
if (_uri.equals(ns._uri))
return true;
else
throw new DOMException(DOMException.NAMESPACE_ERR,
"The same prefix, " + _prefix + ", cannot have different URI: "+_uri+" vs "+ns._uri);
return false;
}
//-- Cloneable --//
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
//-- Object --//
/** Note: equals() is based on URI only. */
public boolean equals(Object o) {
return this == o
|| ((o instanceof Namespace) && _uri.equals(((Namespace)o)._uri));
}
/** Note: hashCode() is based on URI only. */
public int hashCode() {
return _uri.hashCode();
}
public String toString() {
return "[Namespace: \"" + _prefix + "\", \"" + _uri + "\"]";
}
}