/*
* Conditions Of Use
*
* This software was developed by employees of the National Institute of
* Standards and Technology (NIST), an agency of the Federal Government.
* Pursuant to title 15 Untied States Code Section 105, works of NIST
* employees are not subject to copyright protection in the United States
* and are considered to be in the public domain. As a result, a formal
* license is not needed to use the software.
*
* This software is provided by NIST as a service and is expressly
* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
* AND DATA ACCURACY. NIST does not warrant or make any representations
* regarding the use of the software or the results thereof, including but
* not limited to the correctness, accuracy, reliability or usefulness of
* the software.
*
* Permission to use this software is contingent upon your acceptance
* of the terms of this agreement
*
* .
*
*/
/*******************************************************************************
* Product of NIST/ITL Advanced Networking Technologies Division (ANTD). *
*******************************************************************************/
package gov.nist.javax.sip.address;
import gov.nist.core.*;
import javax.sip.address.*;
/*
* BUG Fix from Antonis Kadris.
*/
/**
* Address structure. Imbeds a URI and adds a display name.
*
*@author M. Ranganathan <br/>
*
*
*
*@version 1.2 $Revision: 1.11 $ $Date: 2009/07/17 18:57:21 $
*
*/
public final class AddressImpl
extends NetObject
implements javax.sip.address.Address {
private static final long serialVersionUID = 429592779568617259L;
/** Constant field.
*/
public static final int NAME_ADDR = 1;
/** constant field.
*/
public static final int ADDRESS_SPEC = 2;
/** Constant field.
*/
public static final int WILD_CARD = 3;
protected int addressType;
/** displayName field
*/
protected String displayName;
/** address field
*/
protected GenericURI address;
/** Match on the address only.
* Dont care about the display name.
*/
public boolean match(Object other) {
// TODO -- add the matcher;
if (other == null)
return true;
if (!(other instanceof Address))
return false;
else {
AddressImpl that = (AddressImpl) other;
if (that.getMatcher() != null)
return that.getMatcher().match(this.encode());
else if (that.displayName != null && this.displayName == null)
return false;
else if (that.displayName == null)
return address.match(that.address);
else
return displayName.equalsIgnoreCase(that.displayName)
&& address.match(that.address);
}
}
/** Get the host port portion of the address spec.
*@return host:port in a HostPort structure.
*/
public HostPort getHostPort() {
if (!(address instanceof SipUri))
throw new RuntimeException("address is not a SipUri");
SipUri uri = (SipUri) address;
return uri.getHostPort();
}
/** Get the port from the imbedded URI. This assumes that a SIP URL
* is encapsulated in this address object.
*
*@return the port from the address.
*
*/
public int getPort() {
if (!(address instanceof SipUri))
throw new RuntimeException("address is not a SipUri");
SipUri uri = (SipUri) address;
return uri.getHostPort().getPort();
}
/** Get the user@host:port for the address field. This assumes
* that the encapsulated object is a SipUri.
*
*
*@return string containing user@host:port.
*/
public String getUserAtHostPort() {
if (address instanceof SipUri) {
SipUri uri = (SipUri) address;
return uri.getUserAtHostPort();
} else
return address.toString();
}
/** Get the host name from the address.
*
*@return the host name.
*/
public String getHost() {
if (!(address instanceof SipUri))
throw new RuntimeException("address is not a SipUri");
SipUri uri = (SipUri) address;
return uri.getHostPort().getHost().getHostname();
}
/** Remove a parameter from the address.
*
*@param parameterName is the name of the parameter to remove.
*/
public void removeParameter(String parameterName) {
if (!(address instanceof SipUri))
throw new RuntimeException("address is not a SipUri");
SipUri uri = (SipUri) address;
uri.removeParameter(parameterName);
}
/**
* Encode the address as a string and return it.
* @return String canonical encoded version of this address.
*/
public String encode() {
return encode(new StringBuffer()).toString();
}
public StringBuffer encode(StringBuffer buffer) {
if (this.addressType == WILD_CARD) {
buffer.append('*');
}
else {
if (displayName != null) {
buffer.append(DOUBLE_QUOTE)
.append(displayName)
.append(DOUBLE_QUOTE)
.append(SP);
}
if (address != null) {
if (addressType == NAME_ADDR || displayName != null)
buffer.append(LESS_THAN);
address.encode(buffer);
if (addressType == NAME_ADDR || displayName != null)
buffer.append(GREATER_THAN);
}
}
return buffer;
}
public AddressImpl() {
this.addressType = NAME_ADDR;
}
/**
* Get the address type;
* @return int
*/
public int getAddressType() {
return addressType;
}
/**
* Set the address type. The address can be NAME_ADDR, ADDR_SPEC or
* WILD_CARD
*
* @param atype int to set
*
*/
public void setAddressType(int atype) {
addressType = atype;
}
/**
* get the display name
*
* @return String
*
*/
public String getDisplayName() {
return displayName;
}
/**
* Set the displayName member
*
* @param displayName String to set
*
*/
public void setDisplayName(String displayName) {
this.displayName = displayName;
this.addressType = NAME_ADDR;
}
/**
* Set the address field
*
* @param address SipUri to set
*
*/
public void setAddess(javax.sip.address.URI address) {
this.address = (GenericURI) address;
}
/**
* hashCode impelmentation
*
*/
public int hashCode() {
return this.address.hashCode();
}
/**
* Compare two address specs for equality.
*
* @param other Object to compare this this address
*
* @return boolean
*
*/
public boolean equals(Object other) {
if (this==other) return true;
if (other instanceof Address) {
final Address o = (Address) other;
// Don't compare display name (?)
return this.getURI().equals( o.getURI() );
}
return false;
}
/** return true if DisplayName exist.
*
* @return boolean
*/
public boolean hasDisplayName() {
return (displayName != null);
}
/** remove the displayName field
*/
public void removeDisplayName() {
displayName = null;
}
/** Return true if the imbedded URI is a sip URI.
*
* @return true if the imbedded URI is a SIP URI.
*
*/
public boolean isSIPAddress() {
return address instanceof SipUri;
}
/** Returns the URI address of this Address. The type of URI can be
* determined by the scheme.
*
* @return address parmater of the Address object
*/
public URI getURI() {
return this.address;
}
/** This determines if this address is a wildcard address. That is
* <code>Address.getAddress.getUserInfo() == *;</code>
*
* @return true if this name address is a wildcard, false otherwise.
*/
public boolean isWildcard() {
return this.addressType == WILD_CARD;
}
/** Sets the URI address of this Address. The URI can be either a
* TelURL or a SipURI.
*
* @param address - the new URI address value of this NameAddress.
*/
public void setURI(URI address) {
this.address = (GenericURI) address;
}
/** Set the user name for the imbedded URI.
*
*@param user -- user name to set for the imbedded URI.
*/
public void setUser(String user) {
((SipUri) this.address).setUser(user);
}
/** Mark this a wild card address type.
* Also set the SIP URI to a special wild card address.
*/
public void setWildCardFlag() {
this.addressType = WILD_CARD;
this.address = new SipUri();
((SipUri)this.address).setUser("*");
}
public Object clone() {
AddressImpl retval = (AddressImpl) super.clone();
if (this.address != null)
retval.address = (GenericURI) this.address.clone();
return retval;
}
}