diff --git a/java/external/src/javax/xml/namespace/NamespaceContext.java b/java/external/src/javax/xml/namespace/NamespaceContext.java new file mode 100644 index 0000000..f7d0a9a --- /dev/null +++ b/java/external/src/javax/xml/namespace/NamespaceContext.java @@ -0,0 +1,255 @@ +/* + * Copyright 2003-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// $Id$ + +package javax.xml.namespace; + +import java.util.Iterator; + +/** + *

Interface for read only XML Namespace context processing.

+ * + *

An XML Namespace has the properties:

+ * + *

example: <element xmlns:prefix="http://Namespace-name-URI">

+ * + *

All get*(*) methods operate in the current scope + * for Namespace URI and prefix resolution.

+ * + *

Note that a Namespace URI can be bound to + * multiple prefixes in the current scope. This can + * occur when multiple XMLConstants.XMLNS_ATTRIBUTE + * ("xmlns") Namespace declarations occur in the same Start-Tag and + * refer to the same Namespace URI. e.g.
+ *

+ * <element xmlns:prefix1="http://Namespace-name-URI"
+ *          xmlns:prefix2="http://Namespace-name-URI">
+ * 
+ * This can also occur when the same Namespace URI is used in multiple + * XMLConstants.XMLNS_ATTRIBUTE ("xmlns") Namespace + * declarations in the logical parent element hierarchy. e.g.
+ *
+ * <parent xmlns:prefix1="http://Namespace-name-URI">
+ *   <child xmlns:prefix2="http://Namespace-name-URI">
+ *     ...
+ *   </child>
+ * </parent>
+ * 

+ * + *

A prefix can only be bound to a single + * Namespace URI in the current scope.

+ * + * @author Jeff Suttor + * @version $Revision$, $Date$ + * @see javax.xml.XMLConstants javax.XMLConstants for declarations of common XML values + * @see XML Schema Part2: Datatypes + * @see Namespaces in XML + * @see Namespaces in XML Errata + * @since 1.5 + */ + +public interface NamespaceContext { + + /** + *

Get Namespace URI bound to a prefix in the current scope.

+ * + *

When requesting a Namespace URI by prefix, the following + * table describes the returned Namespace URI value for all + * possible prefix values:

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
+ * getNamespaceURI(prefix) + * return value for specified prefixes + *
prefix parameterNamespace URI return value
DEFAULT_NS_PREFIX ("")default Namespace URI in the current scope or + * {@link javax.xml.XMLConstants#NULL_NS_URI XMLConstants.NULL_NS_URI("")} + * when there is no default Namespace URI in the current scope
bound prefixNamespace URI bound to prefix in current scope
unbound prefix{@link javax.xml.XMLConstants#NULL_NS_URI XMLConstants.NULL_NS_URI("")}
XMLConstants.XML_NS_PREFIX ("xml")XMLConstants.XML_NS_URI + * ("http://www.w3.org/XML/1998/namespace")
XMLConstants.XMLNS_ATTRIBUTE ("xmlns")XMLConstants.XMLNS_ATTRIBUTE_NS_URI + * ("http://www.w3.org/2000/xmlns/")
nullIllegalArgumentException is thrown
+ * + * @param prefix prefix to look up + * @return Namespace URI bound to prefix in the current scope + */ + String getNamespaceURI(String prefix); + + /** + *

Get prefix bound to Namespace URI in the current scope.

+ * + *

To get all prefixes bound to a Namespace URI in the current + * scope, use {@link #getPrefixes(String namespaceURI)}.

+ * + *

When requesting a prefix by Namespace URI, the following + * table describes the returned prefix value for all Namespace URI + * values:

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
+ * getPrefix(namespaceURI) return value for + * specified Namespace URIs + *
Namespace URI parameterprefix value returned
<default Namespace URI>XMLConstants.DEFAULT_NS_PREFIX ("") + *
bound Namespace URIprefix bound to Namespace URI in the current scope, + * if multiple prefixes are bound to the Namespace URI in + * the current scope, a single arbitrary prefix, whose + * choice is implementation dependent, is returned
unbound Namespace URInull
XMLConstants.XML_NS_URI + * ("http://www.w3.org/XML/1998/namespace")XMLConstants.XML_NS_PREFIX ("xml")
XMLConstants.XMLNS_ATTRIBUTE_NS_URI + * ("http://www.w3.org/2000/xmlns/")XMLConstants.XMLNS_ATTRIBUTE ("xmlns")
nullIllegalArgumentException is thrown
+ * + * @param namespaceURI URI of Namespace to lookup + * @return prefix bound to Namespace URI in current context + */ + String getPrefix(String namespaceURI); + + /** + *

Get all prefixes bound to a Namespace URI in the current + * scope.

+ * + *

An Iterator over String elements is returned in an arbitrary, implementation dependent, order.

+ * + *

The Iterator is + * not modifiable. e.g. the + * remove() method will throw + * UnsupportedOperationException.

+ * + *

When requesting prefixes by Namespace URI, the following + * table describes the returned prefixes value for all Namespace + * URI values:

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
+ * getPrefixes(namespaceURI) return value for + * specified Namespace URIs
Namespace URI parameterprefixes value returned
bound Namespace URI, + * including the <default Namespace URI>Iterator over prefixes bound to Namespace URI in + * the current scope in an arbitrary, implementation dependent, + * order
unbound Namespace URIempty Iterator
XMLConstants.XML_NS_URI + * ("http://www.w3.org/XML/1998/namespace")Iterator with one element set to + * XMLConstants.XML_NS_PREFIX ("xml")
XMLConstants.XMLNS_ATTRIBUTE_NS_URI + * ("http://www.w3.org/2000/xmlns/")Iterator with one element set to + * XMLConstants.XMLNS_ATTRIBUTE ("xmlns")
nullIllegalArgumentException is thrown
+ * + * @param namespaceURI URI of Namespace to lookup + * @return Iterator for all prefixes bound to the + * Namespace URI in the current scope + */ + Iterator getPrefixes(String namespaceURI); +} diff --git a/java/external/src/javax/xml/namespace/QName.java b/java/external/src/javax/xml/namespace/QName.java new file mode 100644 index 0000000..ace95c5 --- /dev/null +++ b/java/external/src/javax/xml/namespace/QName.java @@ -0,0 +1,426 @@ +/* + * Copyright 2003-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// $Id$ + +package javax.xml.namespace; + +import java.io.Serializable; + +import javax.xml.XMLConstants; + +/** + *

QName represents a qualified name + * as defined in the XML specifications: XML Schema Part2: + * Datatypes specification, Namespaces + * in XML, Namespaces + * in XML Errata.

+ * + *

The value of a QName contains a Namespace + * URI, local part and + * prefix.

+ * + *

The prefix is included in QName to retain lexical + * information when present in an {@link + * javax.xml.transform.Source XML input source}. The prefix is + * NOT used in {@link #equals(Object) + * QName.equals(Object)} or to compute the {@link #hashCode() + * QName.hashCode()}. Equality and the hash code are defined using + * only the Namespace URI and local part.

+ * + *

If not specified, the Namespace URI is set to {@link + * javax.xml.XMLConstants#NULL_NS_URI XMLConstants.NULL_NS_URI}. + * If not specified, the prefix is set to {@link + * javax.xml.XMLConstants#DEFAULT_NS_PREFIX + * XMLConstants.DEFAULT_NS_PREFIX}.

+ * + *

QName is immutable.

+ * + * @author Jeff Suttor + * @version $Revision$, $Date$ + * @see XML Schema Part2: Datatypes specification + * @see Namespaces in XML + * @see Namespaces in XML Errata + * @since 1.5 + */ + +public class QName implements Serializable { + + /** + *

Stream Unique Identifier.

+ */ + private static final long serialVersionUID = 4418622981026545151L; + + /** + *

Namespace URI of this QName.

+ */ + private final String namespaceURI; + + /** + *

local part of this QName.

+ */ + private final String localPart; + + /** + *

prefix of this QName.

+ */ + private final String prefix; + + /** + *

QName constructor specifying the Namespace URI + * and local part.

+ * + *

If the Namespace URI is null, it is set to + * {@link javax.xml.XMLConstants#NULL_NS_URI + * XMLConstants.NULL_NS_URI}. This value represents no + * explicitly defined Namespace as defined by the Namespaces + * in XML specification. This action preserves compatible + * behavior with QName 1.0. Explicitly providing the {@link + * javax.xml.XMLConstants#NULL_NS_URI + * XMLConstants.NULL_NS_URI} value is the preferred coding + * style.

+ * + *

If the local part is null an + * IllegalArgumentException is thrown. + * A local part of "" is allowed to preserve + * compatible behavior with QName 1.0.

+ * + *

When using this constructor, the prefix is set to {@link + * javax.xml.XMLConstants#DEFAULT_NS_PREFIX + * XMLConstants.DEFAULT_NS_PREFIX}.

+ * + *

The Namespace URI is not validated as a + * URI reference. + * The local part is not validated as a + * NCName + * as specified in Namespaces + * in XML.

+ * + * @param namespaceURI Namespace URI of the QName + * @param localPart local part of the QName + * + * @see #QName(String namespaceURI, String localPart, String + * prefix) QName(String namespaceURI, String localPart, String + * prefix) + */ + public QName(final String namespaceURI, final String localPart) { + this(namespaceURI, localPart, XMLConstants.DEFAULT_NS_PREFIX); + } + + /** + *

QName constructor specifying the Namespace URI, + * local part and prefix.

+ * + *

If the Namespace URI is null, it is set to + * {@link javax.xml.XMLConstants#NULL_NS_URI + * XMLConstants.NULL_NS_URI}. This value represents no + * explicitly defined Namespace as defined by the Namespaces + * in XML specification. This action preserves compatible + * behavior with QName 1.0. Explicitly providing the {@link + * javax.xml.XMLConstants#NULL_NS_URI + * XMLConstants.NULL_NS_URI} value is the preferred coding + * style.

+ * + *

If the local part is null an + * IllegalArgumentException is thrown. + * A local part of "" is allowed to preserve + * compatible behavior with QName 1.0.

+ * + *

If the prefix is null, an + * IllegalArgumentException is thrown. Use {@link + * javax.xml.XMLConstants#DEFAULT_NS_PREFIX + * XMLConstants.DEFAULT_NS_PREFIX} to explicitly indicate that no + * prefix is present or the prefix is not relevant.

+ * + *

The Namespace URI is not validated as a + * URI reference. + * The local part and prefix are not validated as a + * NCName + * as specified in Namespaces + * in XML.

+ * + * @param namespaceURI Namespace URI of the QName + * @param localPart local part of the QName + * @param prefix prefix of the QName + */ + public QName(String namespaceURI, String localPart, String prefix) { + + // map null Namespace URI to default to preserve compatibility with QName 1.0 + if (namespaceURI == null) { + this.namespaceURI = XMLConstants.NULL_NS_URI; + } else { + this.namespaceURI = namespaceURI; + } + + // local part is required. "" is allowed to preserve compatibility with QName 1.0 + if (localPart == null) { + throw new IllegalArgumentException("local part cannot be \"null\" when creating a QName"); + } + this.localPart = localPart; + + // prefix is required + if (prefix == null) { + throw new IllegalArgumentException("prefix cannot be \"null\" when creating a QName"); + } + this.prefix = prefix; + } + + /** + *

QName constructor specifying the local part.

+ * + *

If the local part is null an + * IllegalArgumentException is thrown. + * A local part of "" is allowed to preserve + * compatible behavior with QName 1.0.

+ * + *

When using this constructor, the Namespace URI is set to + * {@link javax.xml.XMLConstants#NULL_NS_URI + * XMLConstants.NULL_NS_URI} and the prefix is set to {@link + * javax.xml.XMLConstants#DEFAULT_NS_PREFIX + * XMLConstants.DEFAULT_NS_PREFIX}.

+ * + *

In an XML context, all Element and Attribute names exist + * in the context of a Namespace. Making this explicit during the + * construction of a QName helps prevent hard to + * diagnosis XML validity errors. The constructors {@link + * #QName(String namespaceURI, String localPart) QName(String + * namespaceURI, String localPart)} and + * {@link #QName(String namespaceURI, String localPart, String prefix)} + * are preferred.

+ * + *

The local part is not validated as a + * NCName + * as specified in Namespaces + * in XML.

+ * + * @param localPart local part of the QName + * @see #QName(String namespaceURI, String localPart) QName(String + * namespaceURI, String localPart) + * @see #QName(String namespaceURI, String localPart, String + * prefix) QName(String namespaceURI, String localPart, String + * prefix) + */ + public QName(String localPart) { + this( + XMLConstants.NULL_NS_URI, + localPart, + XMLConstants.DEFAULT_NS_PREFIX); + } + + /** + *

Get the Namespace URI of this QName.

+ * + * @return Namespace URI of this QName + */ + public String getNamespaceURI() { + return namespaceURI; + } + + /** + *

Get the local part of this QName.

+ * + * @return local part of this QName + */ + public String getLocalPart() { + return localPart; + } + + /** + *

Get the prefix of this QName.

+ * + *

The prefix assigned to a QName might + * NOT be valid in a different + * context. For example, a QName may be assigned a + * prefix in the context of parsing a document but that prefix may + * be invalid in the context of a different document.

+ * + * @return prefix of this QName + */ + public String getPrefix() { + return prefix; + } + + /** + *

Test this QName for equality with another + * Object.

+ * + *

If the Object to be tested is not a + * QName or is null, then this method + * returns false.

+ * + *

Two QNames are considered equal if and only if + * both the Namespace URI and local part are equal. This method + * uses String.equals() to check equality of the + * Namespace URI and local part. The prefix is + * NOT used to determine equality.

+ * + *

This method satisfies the general contract of {@link + * java.lang.Object#equals(Object) Object.equals(Object)}

+ * + * @param objectToTest the Object to test for + * equality with this QName + * @return true if the given Object is + * equal to this QName else false + */ + public final boolean equals(Object objectToTest) { + if (objectToTest == null || !(objectToTest instanceof QName)) { + return false; + } + + QName qName = (QName) objectToTest; + + return namespaceURI.equals(qName.namespaceURI) + && localPart.equals(qName.localPart); + } + + /** + *

Generate the hash code for this QName.

+ * + *

The hash code is calculated using both the Namespace URI and + * the local part of the QName. The prefix is + * NOT used to calculate the hash + * code.

+ * + *

This method satisfies the general contract of {@link + * java.lang.Object#hashCode() Object.hashCode()}.

+ * + * @return hash code for this QName Object + */ + public final int hashCode() { + return namespaceURI.hashCode() ^ localPart.hashCode(); + } + + /** + *

String representation of this + * QName.

+ * + *

The commonly accepted way of representing a QName + * as a String was defined + * by James Clark. Although this is not a standard + * specification, it is in common use, e.g. {@link javax.xml.transform.Transformer#setParameter(String name, Object value)}. + * This implementation represents a QName as: + * "{" + Namespace URI + "}" + local part. If the Namespace URI + * .equals(XMLConstants.NULL_NS_URI), only the + * local part is returned. An appropriate use of this method is + * for debugging or logging for human consumption.

+ * + *

Note the prefix value is NOT + * returned as part of the String representation.

+ * + *

This method satisfies the general contract of {@link + * java.lang.Object#toString() Object.toString()}.

+ * + * @return String representation of this QName + */ + public String toString() { + if (namespaceURI.equals(XMLConstants.NULL_NS_URI)) { + return localPart; + } else { + return "{" + namespaceURI + "}" + localPart; + } + } + + /** + *

QName derived from parsing the formatted + * String.

+ * + *

If the String is null or does not conform to + * {@link #toString() QName.toString()} formatting, an + * IllegalArgumentException is thrown.

+ * + *

The String MUST be in the + * form returned by {@link #toString() QName.toString()}.

+ + *

The commonly accepted way of representing a QName + * as a String was defined + * by James Clark. Although this is not a standard + * specification, it is in common use, e.g. {@link javax.xml.transform.Transformer#setParameter(String name, Object value)}. + * This implementation parses a String formatted + * as: "{" + Namespace URI + "}" + local part. If the Namespace + * URI .equals(XMLConstants.NULL_NS_URI), only the + * local part should be provided.

+ * + *

The prefix value CANNOT be + * represented in the String and will be set to + * {@link javax.xml.XMLConstants#DEFAULT_NS_PREFIX + * XMLConstants.DEFAULT_NS_PREFIX}.

+ * + *

This method does not do full validation of the resulting + * QName. + *

The Namespace URI is not validated as a + * URI reference. + * The local part is not validated as a + * NCName + * as specified in + * Namespaces in XML.

+ * + * @param qNameAsString String representation + * of the QName + * @return QName corresponding to the given String + * @see #toString() QName.toString() + */ + public static QName valueOf(String qNameAsString) { + + // null is not valid + if (qNameAsString == null) { + throw new IllegalArgumentException("cannot create QName from \"null\" or \"\" String"); + } + + // "" local part is valid to preserve compatible behavior with QName 1.0 + if (qNameAsString.length() == 0) { + return new QName( + XMLConstants.NULL_NS_URI, + qNameAsString, + XMLConstants.DEFAULT_NS_PREFIX); + } + + // local part only? + if (qNameAsString.charAt(0) != '{') { + return new QName( + XMLConstants.NULL_NS_URI, + qNameAsString, + XMLConstants.DEFAULT_NS_PREFIX); + } + + // Namespace URI improperly specified? + if (qNameAsString.startsWith("{" + XMLConstants.NULL_NS_URI + "}")) { + throw new IllegalArgumentException( + "Namespace URI .equals(XMLConstants.NULL_NS_URI), " + + ".equals(\"" + XMLConstants.NULL_NS_URI + "\"), " + + "only the local part, " + + "\"" + qNameAsString.substring(2 + XMLConstants.NULL_NS_URI.length()) + "\", " + + "should be provided."); + } + + // Namespace URI and local part specified + int endOfNamespaceURI = qNameAsString.indexOf('}'); + if (endOfNamespaceURI == -1) { + throw new IllegalArgumentException( + "cannot create QName from \"" + + qNameAsString + + "\", missing closing \"}\""); + } + return new QName( + qNameAsString.substring(1, endOfNamespaceURI), + qNameAsString.substring(endOfNamespaceURI + 1), + XMLConstants.DEFAULT_NS_PREFIX); + } +} diff --git a/java/external/src/javax/xml/namespace/package.html b/java/external/src/javax/xml/namespace/package.html new file mode 100644 index 0000000..f4788a3 --- /dev/null +++ b/java/external/src/javax/xml/namespace/package.html @@ -0,0 +1,33 @@ + + + + + + + + + javax.xml.namespace + + + + + + + +

XML Namespace processing.

+ +

The following XML standards apply:

+ + + + diff --git a/java/external/src/javax/xml/package.html b/java/external/src/javax/xml/package.html new file mode 100644 index 0000000..2f52177 --- /dev/null +++ b/java/external/src/javax/xml/package.html @@ -0,0 +1,33 @@ + + + + + + + + javax.xml + + + + + + + + +

Defines core XML constants and functionality from the XML specifications.

+ +

The following core XML standards apply:

+ + + +