duke@1: /* tbell@45: * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as duke@1: * published by the Free Software Foundation. Sun designates this duke@1: * particular file as subject to the "Classpath" exception as provided duke@1: * by Sun in the LICENSE file that accompanied this code. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * duke@1: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@1: * CA 95054 USA or visit www.sun.com if you need additional information or duke@1: * have any questions. duke@1: */ tbell@45: /* tbell@45: * $Id: NameImpl.java,v 1.48 2006/01/27 12:49:38 vj135062 Exp $ tbell@45: * $Revision: 1.48 $ tbell@45: * $Date: 2006/01/27 12:49:38 $ tbell@45: */ tbell@45: tbell@45: duke@1: package com.sun.xml.internal.messaging.saaj.soap.name; duke@1: duke@1: import java.util.logging.Level; duke@1: import java.util.logging.Logger; duke@1: duke@1: import javax.xml.namespace.QName; duke@1: import javax.xml.soap.Name; duke@1: import javax.xml.soap.SOAPConstants; duke@1: duke@1: import com.sun.org.apache.xerces.internal.xni.NamespaceContext; duke@1: import org.w3c.dom.Element; duke@1: duke@1: import com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl; duke@1: import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; duke@1: duke@1: public class NameImpl implements Name { duke@1: public static final String XML_NAMESPACE_PREFIX = "xml"; duke@1: public static final String XML_SCHEMA_NAMESPACE_PREFIX = "xs"; duke@1: public static final String SOAP_ENVELOPE_PREFIX = "SOAP-ENV"; duke@1: duke@1: public static final String XML_NAMESPACE = duke@1: "http://www.w3.org/XML/1998/namespace"; duke@1: public static final String SOAP11_NAMESPACE = duke@1: SOAPConstants.URI_NS_SOAP_ENVELOPE; duke@1: public static final String SOAP12_NAMESPACE = duke@1: SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE; duke@1: public static final String XML_SCHEMA_NAMESPACE = duke@1: "http://www.w3.org/2001/XMLSchema"; duke@1: duke@1: protected String uri = ""; duke@1: protected String localName = ""; duke@1: protected String prefix = ""; duke@1: private String qualifiedName = null; duke@1: duke@1: protected static Logger log = duke@1: Logger.getLogger(LogDomainConstants.NAMING_DOMAIN, duke@1: "com.sun.xml.internal.messaging.saaj.soap.name.LocalStrings"); duke@1: duke@1: protected NameImpl(String name) { duke@1: this.localName = name == null ? "" : name; duke@1: } duke@1: duke@1: protected NameImpl(String name, String prefix, String uri) { duke@1: this.uri = uri == null ? "" : uri; duke@1: this.localName = name == null ? "" : name; duke@1: this.prefix = prefix == null ? "" : prefix; duke@1: duke@1: if (this.prefix.equals("xmlns") && this.uri.equals("")) { duke@1: this.uri = NamespaceContext.XMLNS_URI; duke@1: } duke@1: if (this.uri.equals(NamespaceContext.XMLNS_URI) && this.prefix.equals("")) { duke@1: this.prefix = "xmlns"; duke@1: } duke@1: } duke@1: duke@1: public static Name convertToName(QName qname) { duke@1: return new NameImpl(qname.getLocalPart(), duke@1: qname.getPrefix(), duke@1: qname.getNamespaceURI()); duke@1: } duke@1: duke@1: public static QName convertToQName(Name name) { duke@1: return new QName(name.getURI(), duke@1: name.getLocalName(), duke@1: name.getPrefix()); duke@1: } duke@1: duke@1: public static NameImpl createFromUnqualifiedName(String name) { duke@1: return new NameImpl(name); duke@1: } duke@1: duke@1: public static Name createFromTagName(String tagName) { duke@1: return createFromTagAndUri(tagName, ""); duke@1: } duke@1: duke@1: public static Name createFromQualifiedName( duke@1: String qualifiedName, duke@1: String uri) { duke@1: return createFromTagAndUri(qualifiedName, uri); duke@1: } duke@1: duke@1: protected static Name createFromTagAndUri(String tagName, String uri) { duke@1: if (tagName == null) { duke@1: log.severe("SAAJ0201.name.not.created.from.null.tag"); duke@1: throw new IllegalArgumentException("Cannot create a name from a null tag."); duke@1: } duke@1: int index = tagName.indexOf(':'); duke@1: if (index < 0) { duke@1: return new NameImpl(tagName, "", uri); duke@1: } else { duke@1: return new NameImpl( duke@1: tagName.substring(index + 1), duke@1: tagName.substring(0, index), duke@1: uri); duke@1: } duke@1: } duke@1: duke@1: protected static int getPrefixSeparatorIndex(String qualifiedName) { duke@1: int index = qualifiedName.indexOf(':'); duke@1: if (index < 0) { duke@1: log.log( duke@1: Level.SEVERE, duke@1: "SAAJ0202.name.invalid.arg.format", duke@1: new String[] { qualifiedName }); duke@1: throw new IllegalArgumentException( duke@1: "Argument \"" duke@1: + qualifiedName duke@1: + "\" must be of the form: \"prefix:localName\""); duke@1: } duke@1: return index; duke@1: } duke@1: duke@1: public static String getPrefixFromQualifiedName(String qualifiedName) { duke@1: return qualifiedName.substring( duke@1: 0, duke@1: getPrefixSeparatorIndex(qualifiedName)); duke@1: } duke@1: duke@1: public static String getLocalNameFromQualifiedName(String qualifiedName) { duke@1: return qualifiedName.substring( duke@1: getPrefixSeparatorIndex(qualifiedName) + 1); duke@1: } duke@1: duke@1: public static String getPrefixFromTagName(String tagName) { duke@1: if (isQualified(tagName)) { duke@1: return getPrefixFromQualifiedName(tagName); duke@1: } duke@1: return ""; duke@1: } duke@1: duke@1: public static String getLocalNameFromTagName(String tagName) { duke@1: if (isQualified(tagName)) { duke@1: return getLocalNameFromQualifiedName(tagName); duke@1: } duke@1: return tagName; duke@1: } duke@1: duke@1: public static boolean isQualified(String tagName) { duke@1: return tagName.indexOf(':') >= 0; duke@1: } duke@1: duke@1: public static NameImpl create(String name, String prefix, String uri) { duke@1: if (prefix == null) duke@1: prefix = ""; duke@1: if (uri == null) duke@1: uri = ""; duke@1: if (name == null) duke@1: name = ""; duke@1: duke@1: if (!uri.equals("") && !name.equals("")) { duke@1: if (uri.equals(NameImpl.SOAP11_NAMESPACE)) { duke@1: if (name.equalsIgnoreCase("Envelope")) duke@1: return createEnvelope1_1Name(prefix); duke@1: else if (name.equalsIgnoreCase("Header")) duke@1: return createHeader1_1Name(prefix); duke@1: else if (name.equalsIgnoreCase("Body")) duke@1: return createBody1_1Name(prefix); duke@1: else if (name.equalsIgnoreCase("Fault")) duke@1: return createFault1_1Name(prefix); duke@1: else duke@1: return new SOAP1_1Name(name, prefix); duke@1: } else if (uri.equals(SOAP12_NAMESPACE)) { duke@1: if (name.equalsIgnoreCase("Envelope")) duke@1: return createEnvelope1_2Name(prefix); duke@1: else if (name.equalsIgnoreCase("Header")) duke@1: return createHeader1_2Name(prefix); duke@1: else if (name.equalsIgnoreCase("Body")) duke@1: return createBody1_2Name(prefix); duke@1: else if ( duke@1: name.equals("Fault") duke@1: || name.equals("Reason") duke@1: || name.equals("Detail")) duke@1: return createFault1_2Name(name, prefix); duke@1: else if (name.equals("Code") || name.equals("Subcode")) duke@1: return createCodeSubcode1_2Name(prefix, name); duke@1: else duke@1: return new SOAP1_2Name(name, prefix); duke@1: } duke@1: duke@1: } duke@1: return new NameImpl(name, prefix, uri); duke@1: } duke@1: duke@1: public static String createQName(String prefix, String localName) { duke@1: if (prefix == null || prefix.equals("")) { duke@1: return localName; duke@1: } duke@1: return prefix + ":" + localName; duke@1: } duke@1: duke@1: public boolean equals(Object obj) { duke@1: if (!(obj instanceof Name)) { duke@1: return false; duke@1: } duke@1: duke@1: Name otherName = (Name) obj; duke@1: duke@1: if (!uri.equals(otherName.getURI())) { duke@1: return false; duke@1: } duke@1: duke@1: if (!localName.equals(otherName.getLocalName())) { duke@1: return false; duke@1: } duke@1: duke@1: return true; duke@1: } duke@1: duke@1: /** duke@1: * Get the local name part of this XML Name. duke@1: * duke@1: * @return a string for the local name. duke@1: */ duke@1: public String getLocalName() { duke@1: return localName; duke@1: } duke@1: duke@1: /* getQualifiedName is inherited from QName */ duke@1: duke@1: /** duke@1: * Returns the prefix associated with the namespace of the name. duke@1: * duke@1: * @return the prefix as a string. duke@1: */ duke@1: public String getPrefix() { duke@1: return prefix; duke@1: } duke@1: duke@1: /** duke@1: * Returns the URI associated of the namespace. duke@1: * duke@1: * @return the uri as a string. duke@1: */ duke@1: public String getURI() { duke@1: return uri; duke@1: } duke@1: duke@1: /** duke@1: * Returns a String version of the name suitable for use in an XML document. duke@1: */ duke@1: public String getQualifiedName() { duke@1: if (qualifiedName == null) { duke@1: if (prefix != null && prefix.length() > 0) { duke@1: qualifiedName = prefix + ":" + localName; duke@1: } else { duke@1: qualifiedName = localName; duke@1: } duke@1: } duke@1: return qualifiedName; duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.1 Envelope. duke@1: */ duke@1: public static NameImpl createEnvelope1_1Name(String prefix) { duke@1: return new Envelope1_1Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.2 Envelope. duke@1: */ duke@1: public static NameImpl createEnvelope1_2Name(String prefix) { duke@1: return new Envelope1_2Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.1 Header. duke@1: */ duke@1: public static NameImpl createHeader1_1Name(String prefix) { duke@1: return new Header1_1Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.2 Header. duke@1: */ duke@1: public static NameImpl createHeader1_2Name(String prefix) { duke@1: return new Header1_2Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.1 Body. duke@1: */ duke@1: public static NameImpl createBody1_1Name(String prefix) { duke@1: return new Body1_1Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.2 Body. duke@1: */ duke@1: public static NameImpl createBody1_2Name(String prefix) { duke@1: return new Body1_2Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.1 Fault. duke@1: */ duke@1: public static NameImpl createFault1_1Name(String prefix) { duke@1: return new Fault1_1Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.2 NotUnderstood element. duke@1: */ duke@1: public static NameImpl createNotUnderstood1_2Name(String prefix) { duke@1: return new NotUnderstood1_2Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.2 Upgrade element. duke@1: */ duke@1: public static NameImpl createUpgrade1_2Name(String prefix) { duke@1: return new Upgrade1_2Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.2 SupportedEnvelope Upgrade element. duke@1: */ duke@1: public static NameImpl createSupportedEnvelope1_2Name(String prefix) { duke@1: return new SupportedEnvelope1_2Name(prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.2 duke@1: * Fault, Reason or Detail. duke@1: * duke@1: * @param localName Local Name of element duke@1: */ duke@1: public static NameImpl createFault1_2Name( duke@1: String localName, duke@1: String prefix) { duke@1: return new Fault1_2Name(localName, prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.2 Fault/Code or Subcode. duke@1: * duke@1: * @param localName Either "Code" or "Subcode" duke@1: */ duke@1: public static NameImpl createCodeSubcode1_2Name( duke@1: String prefix, duke@1: String localName) { duke@1: return new CodeSubcode1_2Name(localName, prefix); duke@1: } duke@1: duke@1: /** duke@1: * Create a name object for a SOAP1.1 Fault Detail. duke@1: */ duke@1: public static NameImpl createDetail1_1Name() { duke@1: return new Detail1_1Name(); duke@1: } duke@1: duke@1: public static NameImpl createDetail1_1Name(String prefix) { duke@1: return new Detail1_1Name(prefix); duke@1: } duke@1: duke@1: public static NameImpl createFaultElement1_1Name(String localName) { duke@1: return new FaultElement1_1Name(localName); duke@1: } duke@1: duke@1: public static NameImpl createFaultElement1_1Name(String localName, duke@1: String prefix) { duke@1: return new FaultElement1_1Name(localName, prefix); duke@1: } duke@1: duke@1: public static NameImpl createSOAP11Name(String string) { duke@1: return new SOAP1_1Name(string, null); duke@1: } duke@1: public static NameImpl createSOAP12Name(String string) { duke@1: return new SOAP1_2Name(string, null); duke@1: } duke@1: duke@1: public static NameImpl createSOAP12Name(String localName, String prefix) { duke@1: return new SOAP1_2Name(localName, prefix); duke@1: } duke@1: duke@1: public static NameImpl createXmlName(String localName) { duke@1: return new NameImpl(localName, XML_NAMESPACE_PREFIX, XML_NAMESPACE); duke@1: } duke@1: duke@1: public static Name copyElementName(Element element) { duke@1: String localName = element.getLocalName(); duke@1: String prefix = element.getPrefix(); duke@1: String uri = element.getNamespaceURI(); duke@1: return create(localName, prefix, uri); duke@1: } duke@1: duke@1: duke@1: static class SOAP1_1Name extends NameImpl { duke@1: SOAP1_1Name(String name, String prefix) { duke@1: super( duke@1: name, duke@1: (prefix == null || prefix.equals("")) duke@1: ? NameImpl.SOAP_ENVELOPE_PREFIX duke@1: : prefix, duke@1: NameImpl.SOAP11_NAMESPACE); duke@1: } duke@1: } duke@1: duke@1: static class Envelope1_1Name extends SOAP1_1Name { duke@1: Envelope1_1Name(String prefix) { duke@1: super("Envelope", prefix); duke@1: } duke@1: } duke@1: duke@1: static class Header1_1Name extends SOAP1_1Name { duke@1: Header1_1Name(String prefix) { duke@1: super("Header", prefix); duke@1: } duke@1: } duke@1: duke@1: static class Body1_1Name extends SOAP1_1Name { duke@1: Body1_1Name(String prefix) { duke@1: super("Body", prefix); duke@1: } duke@1: } duke@1: duke@1: static class Fault1_1Name extends NameImpl { duke@1: Fault1_1Name(String prefix) { duke@1: super( duke@1: "Fault", duke@1: (prefix == null || prefix.equals("")) duke@1: ? SOAP_ENVELOPE_PREFIX duke@1: : prefix, duke@1: SOAP11_NAMESPACE); duke@1: } duke@1: } duke@1: duke@1: static class Detail1_1Name extends NameImpl { duke@1: Detail1_1Name() { duke@1: super("detail"); duke@1: } duke@1: duke@1: Detail1_1Name(String prefix) { duke@1: super("detail", prefix, ""); duke@1: } duke@1: } duke@1: duke@1: static class FaultElement1_1Name extends NameImpl { duke@1: FaultElement1_1Name(String localName) { duke@1: super(localName); duke@1: } duke@1: duke@1: FaultElement1_1Name(String localName, String prefix) { duke@1: super(localName, prefix, ""); duke@1: } duke@1: } duke@1: duke@1: static class SOAP1_2Name extends NameImpl { duke@1: SOAP1_2Name(String name, String prefix) { duke@1: super( duke@1: name, duke@1: (prefix == null || prefix.equals("")) duke@1: ? SOAPConstants.SOAP_ENV_PREFIX duke@1: : prefix, duke@1: SOAP12_NAMESPACE); duke@1: } duke@1: } duke@1: duke@1: static class Envelope1_2Name extends SOAP1_2Name { duke@1: Envelope1_2Name(String prefix) { duke@1: super("Envelope", prefix); duke@1: } duke@1: } duke@1: duke@1: static class Header1_2Name extends SOAP1_2Name { duke@1: Header1_2Name(String prefix) { duke@1: super("Header", prefix); duke@1: } duke@1: } duke@1: duke@1: static class Body1_2Name extends SOAP1_2Name { duke@1: Body1_2Name(String prefix) { duke@1: super("Body", prefix); duke@1: } duke@1: } duke@1: duke@1: static class Fault1_2Name extends NameImpl { duke@1: Fault1_2Name(String name, String prefix) { duke@1: super( duke@1: (name == null || name.equals("")) ? "Fault" : name, duke@1: (prefix == null || prefix.equals("")) duke@1: ? SOAPConstants.SOAP_ENV_PREFIX duke@1: : prefix, duke@1: SOAP12_NAMESPACE); duke@1: } duke@1: } duke@1: duke@1: static class NotUnderstood1_2Name extends NameImpl { duke@1: NotUnderstood1_2Name(String prefix) { duke@1: super( duke@1: "NotUnderstood", duke@1: (prefix == null || prefix.equals("")) duke@1: ? SOAPConstants.SOAP_ENV_PREFIX duke@1: : prefix, duke@1: SOAP12_NAMESPACE); duke@1: } duke@1: } duke@1: duke@1: static class Upgrade1_2Name extends NameImpl { duke@1: Upgrade1_2Name(String prefix) { duke@1: super( duke@1: "Upgrade", duke@1: (prefix == null || prefix.equals("")) duke@1: ? SOAPConstants.SOAP_ENV_PREFIX duke@1: : prefix, duke@1: SOAP12_NAMESPACE); duke@1: } duke@1: } duke@1: duke@1: static class SupportedEnvelope1_2Name extends NameImpl { duke@1: SupportedEnvelope1_2Name(String prefix) { duke@1: super( duke@1: "SupportedEnvelope", duke@1: (prefix == null || prefix.equals("")) duke@1: ? SOAPConstants.SOAP_ENV_PREFIX duke@1: : prefix, duke@1: SOAP12_NAMESPACE); duke@1: } duke@1: } duke@1: duke@1: static class CodeSubcode1_2Name extends SOAP1_2Name { duke@1: CodeSubcode1_2Name(String prefix, String localName) { duke@1: super(prefix, localName); duke@1: } duke@1: } duke@1: duke@1: }