| /************************************************************************ |
| * |
| * 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; |
| import java.util.Map; |
| |
| /** |
| * Class wrapping the XML Namespace URI and XML Namespace prefix as a single entity. |
| */ |
| public class OdfNamespace implements Comparable<OdfNamespace>, NamespaceName { |
| |
| private static Map<String, OdfNamespace> mNamespacesByURI = new HashMap<String, OdfNamespace>(); |
| private String mUri; |
| private String mPrefix; |
| |
| private OdfNamespace() { |
| } |
| |
| private OdfNamespace(String prefix, String uri) { |
| mUri = uri; |
| mPrefix = prefix; |
| } |
| |
| /** Returns the OdfNamespace for the given name. |
| * Creates a new one, if the name was not asked before. |
| * @param name represents a W3C Namespace Name. The interface <code>NamespaceName</code> is often implemented by an enum. |
| * @return the OdfNamespace for the given name. |
| */ |
| public static OdfNamespace newNamespace(NamespaceName name) { |
| OdfNamespace ns = null; |
| if (name != null) { |
| ns = newNamespace(name.getPrefix(), name.getUri()); |
| } |
| return ns; |
| } |
| |
| /** Returns the OdfNamespace for the given name. |
| * Creates a new one, if the name was not asked before. |
| * @param uri identifying the namespace. |
| * @return the namespace. |
| */ |
| public static OdfNamespace newNamespace(String prefix, String uri) { |
| OdfNamespace odfNamespace = null; |
| if (uri != null && uri.length() > 0 |
| && prefix != null && prefix.length() > 0) { |
| odfNamespace = mNamespacesByURI.get(uri); |
| if (odfNamespace == null) { |
| odfNamespace = new OdfNamespace(prefix, uri); |
| mNamespacesByURI.put(uri, odfNamespace); |
| } else { |
| // prefix will be adapted for all OdfNamespaces (last wins) |
| odfNamespace.mPrefix = prefix; |
| } |
| } |
| return odfNamespace; |
| } |
| |
| /** Returns the namespace for the given uri. |
| * @param uri identifying the namespace. |
| * @return the namespace identified by the given uri. |
| */ |
| public static OdfNamespace getNamespace(String uri) { |
| OdfNamespace ns = null; |
| if (uri != null) { |
| ns = mNamespacesByURI.get(uri); |
| } |
| return ns; |
| } |
| |
| public String getPrefix() { |
| return mPrefix; |
| } |
| |
| public String getUri() { |
| return mUri; |
| } |
| |
| @Override |
| @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") |
| public boolean equals(Object obj) { |
| if (mUri != null) { |
| return mUri.equals(obj.toString()); |
| } else { |
| return mUri == obj; |
| } |
| } |
| |
| @Override |
| public int hashCode() { |
| if (mUri != null) { |
| return mUri.hashCode(); |
| } else { |
| return 0; |
| } |
| } |
| |
| @Override |
| public String toString() { |
| return mUri; |
| } |
| |
| /** Splits the XML Qname into the local name and the prefix. |
| * |
| * @param qname is the qualified name to be splitted. |
| * @return an array of two strings containing first the prefix and the second the local part. |
| * @throws IllegalArgumentException if no qualified name was given. |
| */ |
| public static String[] splitQName(String qname) throws IllegalArgumentException { |
| String localpart = qname; |
| String prefix = null; |
| int colon = qname.indexOf(':'); |
| if (colon > 0) { |
| localpart = qname.substring(colon + 1); |
| prefix = qname.substring(0, colon); |
| } else { |
| throw new IllegalArgumentException("A qualified name was required, but '" + qname + "' was given!"); |
| } |
| return new String[]{prefix, localpart}; |
| } |
| |
| /** |
| * @param qname is the qualified name to be splitted. |
| * @return the local name of the XML Qname. |
| * @throws IllegalArgumentException if no qualified name was given. |
| */ |
| public static String getPrefixPart(String qname) { |
| return splitQName(qname)[0]; |
| } |
| |
| /** |
| * @param qname is the qualified name to be splitted. |
| * @return the prefix of the XML Qname. |
| * @throws IllegalArgumentException if no qualified name was given. |
| */ |
| public static String getLocalPart(String qname) { |
| return splitQName(qname)[1]; |
| } |
| |
| public int compareTo(OdfNamespace namespace) { |
| return toString().compareTo(namespace.toString()); |
| } |
| } |