/******************************************************************************* | |
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved. | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 | |
* which accompanies this distribution. | |
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html | |
* and the Eclipse Distribution License is available at | |
* http://www.eclipse.org/org/documents/edl-v10.php. | |
* | |
* Contributors: | |
* Denise Smith - initial implementation (2.4) | |
******************************************************************************/ | |
package org.eclipse.persistence.internal.oxm; | |
import javax.xml.namespace.QName; | |
/** | |
* <p>This class represents the pairing of a local name and a namespace uri. | |
* Additionally it can be marked as namespace aware or not. When an XPathQName is not | |
* namespace aware then the namespace uri will be ignored during equality checks even | |
* if an namespaceUri is set.</p> | |
* | |
* @since Eclipselink 2.4 | |
*/ | |
public class XPathQName { | |
private boolean isNamespaceAware; | |
private String localName; | |
private String namespaceUri; | |
/** | |
* Create a new XPathQName. | |
* namespaceUri will be "" and isNamespaceAware will be true. | |
* @param localName The local name to associate with this XPathQName | |
*/ | |
public XPathQName(){ | |
isNamespaceAware = true; | |
this.namespaceUri = Constants.EMPTY_STRING; | |
} | |
/** | |
* Create a new XPathQName with the specified local name. | |
* namespaceUri will be null and isNamespaceAware will be set based on the MediaType. | |
* @param localName The local name to associate with this XPathQName | |
* @param mediaType the mediaType associate with this XPathQName | |
*/ | |
public XPathQName(String localName, boolean namespaceAware){ | |
this(Constants.EMPTY_STRING, localName, namespaceAware); | |
} | |
/** | |
* Create a new XPathQName with the specified local name and namespace | |
* @param namespaceUri The namespace to associate with this XPathQName | |
* @param localName The local name to associate with this XPathQName | |
* @param namespaceAware set if namespaces should be processed or ignored | |
*/ | |
public XPathQName(String namespaceUri, String localName, boolean namespaceAware){ | |
if(namespaceUri == null) { | |
this.namespaceUri = Constants.EMPTY_STRING; | |
}else{ | |
this.namespaceUri = namespaceUri; | |
} | |
this.localName = localName; | |
isNamespaceAware = namespaceAware; | |
} | |
/** | |
* Create a new XPathQName with the specified QName | |
* @param QName The QName to build this XPathQName from | |
* @param namespaceAware set if namespaces should be processed or ignored | |
*/ | |
public XPathQName(QName qname, boolean namespaceAware){ | |
this(qname.getNamespaceURI(), qname.getLocalPart(), namespaceAware); | |
} | |
public int hashCode() { | |
if(null == localName) { | |
return 1; | |
} else { | |
return localName.hashCode(); | |
} | |
} | |
public boolean equals(Object obj){ | |
if(obj == null || !(obj instanceof XPathQName)){ | |
return false; | |
} | |
XPathQName qName = (XPathQName)obj; | |
if(isNamespaceAware && qName.isNamespaceAware){ | |
if(namespaceUri == null){ | |
if(qName.namespaceUri != null){ | |
return false; | |
} | |
}else{ | |
if(qName.namespaceUri == null){ | |
return false; | |
}else if(namespaceUri != qName.namespaceUri && !(namespaceUri.equals(qName.namespaceUri))){ | |
return false; | |
} | |
} | |
} | |
return ((localName == qName.localName) || ((localName != null) && localName.equals(qName.localName))); | |
} | |
@Override | |
public String toString() { | |
StringBuilder stringBuilder = new StringBuilder(); | |
if(null != namespaceUri && namespaceUri.length() > 0) { | |
stringBuilder.append('{'); | |
stringBuilder.append(namespaceUri); | |
stringBuilder.append('}'); | |
} | |
if(null != localName) { | |
stringBuilder.append(localName); | |
} | |
return stringBuilder.toString(); | |
} | |
} |