1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Conditions Of Use
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software was developed by employees of the National Institute of
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Standards and Technology (NIST), an agency of the Federal Government.
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Pursuant to title 15 Untied States Code Section 105, works of NIST
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* employees are not subject to copyright protection in the United States
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* and are considered to be in the public domain.  As a result, a formal
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* license is not needed to use the software.
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* This software is provided by NIST as a service and is expressly
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* AND DATA ACCURACY.  NIST does not warrant or make any representations
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* regarding the use of the software or the results thereof, including but
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* not limited to the correctness, accuracy, reliability or usefulness of
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* the software.
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* Permission to use this software is contingent upon your acceptance
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* of the terms of this agreement
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang* .
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang*/
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*******************************************************************************
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).        *
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *******************************************************************************/
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.javax.sip.address;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport gov.nist.core.*;
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport javax.sip.address.*;
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * BUG Fix from Antonis Kadris.
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/**
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Address structure. Imbeds a URI and adds a display name.
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *@author M. Ranganathan   <br/>
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *@version 1.2 $Revision: 1.11 $ $Date: 2009/07/17 18:57:21 $
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic final class AddressImpl
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    extends NetObject
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    implements javax.sip.address.Address {
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static final long serialVersionUID = 429592779568617259L;
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Constant field.
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final int NAME_ADDR = 1;
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** constant field.
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final int ADDRESS_SPEC = 2;
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Constant field.
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public static final int WILD_CARD = 3;
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected int addressType;
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** displayName field
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected String displayName;
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** address field
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    protected GenericURI address;
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Match on the address only.
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Dont care about the display name.
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean match(Object other) {
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        // TODO -- add the matcher;
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (other == null)
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return true;
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!(other instanceof Address))
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return false;
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        else {
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            AddressImpl that = (AddressImpl) other;
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (that.getMatcher() != null)
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return that.getMatcher().match(this.encode());
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            else if (that.displayName != null && this.displayName == null)
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return false;
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            else if (that.displayName == null)
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return address.match(that.address);
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            else
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return displayName.equalsIgnoreCase(that.displayName)
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    && address.match(that.address);
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Get the host port portion of the address spec.
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@return host:port in a HostPort structure.
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public HostPort getHostPort() {
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!(address instanceof SipUri))
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new RuntimeException("address is not a SipUri");
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SipUri uri = (SipUri) address;
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return uri.getHostPort();
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Get the port from the imbedded URI. This assumes that a SIP URL
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * is encapsulated in this address object.
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@return the port from the address.
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getPort() {
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!(address instanceof SipUri))
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new RuntimeException("address is not a SipUri");
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SipUri uri = (SipUri) address;
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return uri.getHostPort().getPort();
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Get the user@host:port for the address field. This assumes
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * that the encapsulated object is a SipUri.
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@return string containing user@host:port.
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getUserAtHostPort() {
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (address instanceof SipUri) {
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            SipUri uri = (SipUri) address;
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return uri.getUserAtHostPort();
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return address.toString();
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Get the host name from the address.
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@return the host name.
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getHost() {
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!(address instanceof SipUri))
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new RuntimeException("address is not a SipUri");
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SipUri uri = (SipUri) address;
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return uri.getHostPort().getHost().getHostname();
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Remove a parameter from the address.
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@param parameterName is the name of the parameter to remove.
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void removeParameter(String parameterName) {
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!(address instanceof SipUri))
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            throw new RuntimeException("address is not a SipUri");
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        SipUri uri = (SipUri) address;
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        uri.removeParameter(parameterName);
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Encode the address as a string and return it.
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return String canonical encoded version of this address.
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String encode() {
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return encode(new StringBuffer()).toString();
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public StringBuffer encode(StringBuffer buffer) {
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (this.addressType == WILD_CARD) {
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            buffer.append('*');
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        else {
172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (displayName != null) {
173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                buffer.append(DOUBLE_QUOTE)
174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        .append(displayName)
175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        .append(DOUBLE_QUOTE)
176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        .append(SP);
177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            }
178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (address != null) {
179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (addressType == NAME_ADDR || displayName != null)
180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    buffer.append(LESS_THAN);
181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                address.encode(buffer);
182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                if (addressType == NAME_ADDR || displayName != null)
183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    buffer.append(GREATER_THAN);
184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            }
185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return buffer;
187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public AddressImpl() {
190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.addressType = NAME_ADDR;
191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Get the address type;
195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return int
196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int getAddressType() {
198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return addressType;
199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the address type. The address can be NAME_ADDR, ADDR_SPEC or
203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * WILD_CARD
204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param atype int to set
206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setAddressType(int atype) {
209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        addressType = atype;
210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * get the display name
214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return String
216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getDisplayName() {
219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return displayName;
220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the displayName member
224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param displayName String to set
226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setDisplayName(String displayName) {
229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.displayName = displayName;
230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.addressType = NAME_ADDR;
231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set the address field
235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param address SipUri to set
237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setAddess(javax.sip.address.URI address) {
240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.address = (GenericURI) address;
241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * hashCode impelmentation
245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int hashCode() {
248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.address.hashCode();
249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Compare two address specs for equality.
253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param other Object to compare this this address
255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return boolean
257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean equals(Object other) {
260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (this==other) return true;
262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (other instanceof Address) {
264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            final Address o = (Address) other;
265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            // Don't compare display name (?)
267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return this.getURI().equals( o.getURI() );
268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return false;
270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** return true if DisplayName exist.
273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return boolean
275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean hasDisplayName() {
277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return (displayName != null);
278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** remove the displayName field
281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void removeDisplayName() {
283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        displayName = null;
284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Return true if the imbedded URI is a sip URI.
287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return true if the imbedded URI is a SIP URI.
289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean isSIPAddress() {
292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return address instanceof SipUri;
293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Returns the URI address of this Address. The type of URI can be
296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * determined by the scheme.
297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return address parmater of the Address object
299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public URI getURI() {
301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.address;
302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** This determines if this address is a wildcard address. That is
305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * <code>Address.getAddress.getUserInfo() == *;</code>
306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return true if this name address is a wildcard, false otherwise.
308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean isWildcard() {
310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.addressType == WILD_CARD;
311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Sets the URI address of this Address. The URI can be either a
314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * TelURL or a SipURI.
315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param address - the new URI address value of this NameAddress.
317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setURI(URI address) {
319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.address = (GenericURI) address;
320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Set the user name for the imbedded URI.
323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *@param user -- user name to set for the imbedded URI.
325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setUser(String user) {
327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        ((SipUri) this.address).setUser(user);
328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /** Mark this a wild card address type.
331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Also set the SIP URI to a special wild card address.
332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setWildCardFlag() {
334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.addressType = WILD_CARD;
335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.address = new SipUri();
336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        ((SipUri)this.address).setUser("*");
337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Object clone() {
340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        AddressImpl retval = (AddressImpl) super.clone();
341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (this.address != null)
342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.address = (GenericURI) this.address.clone();
343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return retval;
344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
347