All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.odftoolkit.odfdom.pkg.OdfName Maven / Gradle / Ivy

The newest version!
/************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
 * 
 * Use is subject to license terms.
 * 
 * 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. You can also
 * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
 * 
 * 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.
 *
 ************************************************************************/
package org.odftoolkit.odfdom.pkg;

import java.util.HashMap;

/** The class provides a simplified interface for XML names.
 *  The class defines a name for an XML node. It embraces XML NamespaceURI, XML prefix and XML localname. */
public class OdfName implements Comparable {

	private OdfNamespace mNS;
	private String mLocalName;
	private String mExpandedName; // i.e. {nsURI}localName
	private static HashMap mOdfNames = new HashMap();

	private OdfName(OdfNamespace ns, String localname, String expandedName) {
		mNS = ns;
		mLocalName = localname;
		mExpandedName = expandedName;
	}

	/** Returns the OdfName for the given namespace and name.
	 *  Creates a new one, if the OdfName was not asked before.
	 * @param name of the XML node
	 * @return the OdfName for the given OdfNamesapce and name.
	 */
	public static OdfName newName(String name) {
		return createName(null, name);
	}

	/** Returns the OdfName for the given namespace and name.
	 *  Creates a new one, if the OdfName was not asked before.
	 * @param odfNamespace the namespace of the name to be created
	 * @param name of the XML node. Can be both local or qualified name.
	 * @return the OdfName for the given OdfNamesapce and name.
	 */
	public static OdfName newName(OdfNamespace odfNamespace, String name) {
		return createName(odfNamespace, name);
	}

	/** Returns the OdfName for the given namespace and name.
	 *  Creates a new one, if the OdfName was not asked before.
	 * @param namespaceNamed represents a W3C Namespace Name. The interface NamespaceName is often implemented by an enum.
	 * @param name of the XML node. Can be both local or qualified name.
	 * @return the OdfName for the given OdfNamesapce and name.
	 */
	public static OdfName newName(NamespaceName namespaceNamed, String name) {
		return createName(OdfNamespace.newNamespace(namespaceNamed), name);
	}

	public static OdfName newName(String uri, String qname) {
		String prefix = OdfNamespace.getPrefixPart(qname);
		String localName = OdfNamespace.getLocalPart(qname);
		OdfNamespace ns = OdfNamespace.newNamespace(prefix, uri);
		return createName(ns, localName);
	}

	private static OdfName createName(OdfNamespace odfNamespace, String name) {
		int i = 0;
		if ((i = name.indexOf(':')) >= 0) {
			name = name.substring(i + 1);
		}
		String expandedName = null;
		// ToDo: Is there need for the prefix? For instance during serialization?
		if (odfNamespace != null) {
			StringBuilder b = new StringBuilder();
			b.append('{');
			b.append(odfNamespace.toString());
			b.append('}');
			b.append(name);
			expandedName = b.toString();
		} else {
			expandedName = name;
		}
		// return a similar OdfName if one was already created before..
		OdfName odfName = mOdfNames.get(expandedName);
		if (odfName != null) {
			return odfName;
		} else {
			// otherwise create a new OdfName, store it in the map and return it..
			odfName = new OdfName(odfNamespace, name, expandedName);
			mOdfNames.put(expandedName, odfName);
			return odfName;
		}
	}

	/** 
	 * @return the XML Namespace URI, for  it would be urn:oasis:names:tc:opendocument:xmlns:text:1.0
	 */
	public String getUri() {
		if (mNS == null) {
			return null;
		} else {
			return mNS.getUri();
		}
	}

	/**
	 * @return the XML localname, for  it would be p.
	 */
	public String getLocalName() {
		return mLocalName;
	}

	/**
	 * @return the XML prefix, for  it would be text.
	 */
	public String getPrefix() {
		String prefix = null;
		if (mNS != null) {
			prefix = mNS.getPrefix();
		}
		return prefix;
	}

	/**
	 * @return the XML QName, the qualified name e.g. for  it is text:p.
	 */
	public String getQName() {
		if (mNS != null) {
			return ((mNS.getPrefix() + ":" + mLocalName).intern());
		} else {
			return mLocalName;
		}
	}

	/**
	 * @return the OdfName as String, represented by a concatenation of
	 * XML Namespace URI (within brackets) and local name, as for  it would be
	 * {urn:oasis:names:tc:opendocument:xmlns:text:1.0}p
	 */
	@Override
	public String toString() {
		return mExpandedName;
	}

	@Override
	@SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
	public boolean equals(Object obj) {
		if (obj != null) {
			return toString().equals(obj.toString());
		} else {
			return false;
		}
	}

	/**
	 * @param namespaceUri of the XML node to be compared.
	 * @param name of the XML node to be compared. Can be qualifed name or localname.
	 * @return true if the given OdfName has the same namespaceURI and localname.
	 */
	public boolean equals(String namespaceUri, String name) {
		if (!mNS.getUri().equals(namespaceUri)) {
			return false;
		}

		int beginIndex = name.indexOf(':');
		if (beginIndex >= 0) {
			return mLocalName.equals(name.substring(beginIndex + 1));
		} else {
			return mLocalName.equals(name);
		}
	}

	@Override
	/** Returns the hashcode of the OdfName */
	public int hashCode() {
		return toString().hashCode();
	}

	/** Compares the by parameter given OdfName with this OdfName  */
	public int compareTo(OdfName o) {
		return toString().compareTo(o.toString());
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy