001/* InetSocketAddress.java --
002   Copyright (C) 2002, 2006  Free Software Foundation, Inc.
003
004This file is part of GNU Classpath.
005
006GNU Classpath is free software; you can redistribute it and/or modify
007it under the terms of the GNU General Public License as published by
008the Free Software Foundation; either version 2, or (at your option)
009any later version.
010
011GNU Classpath is distributed in the hope that it will be useful, but
012WITHOUT ANY WARRANTY; without even the implied warranty of
013MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014General Public License for more details.
015
016You should have received a copy of the GNU General Public License
017along with GNU Classpath; see the file COPYING.  If not, write to the
018Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
01902110-1301 USA.
020
021Linking this library statically or dynamically with other modules is
022making a combined work based on this library.  Thus, the terms and
023conditions of the GNU General Public License cover the whole
024combination.
025
026As a special exception, the copyright holders of this library give you
027permission to link this library with independent modules to produce an
028executable, regardless of the license terms of these independent
029modules, and to copy and distribute the resulting executable under
030terms of your choice, provided that you also meet, for each linked
031independent module, the terms and conditions of the license of that
032module.  An independent module is a module which is not derived from
033or based on this library.  If you modify this library, you may extend
034this exception to your version of the library, but you are not
035obligated to do so.  If you do not wish to do so, delete this
036exception statement from your version. */
037
038package java.net;
039
040
041/**
042 * InetSocketAddress instances represent socket addresses
043 * in the java.nio package. They encapsulate a InetAddress and
044 * a port number.
045 *
046 * @since 1.4
047 */
048public class InetSocketAddress extends SocketAddress
049{
050  /**
051   * Compatible with JDK 1.4+
052   */
053  private static final long serialVersionUID = 5076001401234631237L;
054
055  /**
056   * Name of host.
057   */
058  private String hostname;
059
060  /**
061   * Address of host.
062   */
063  private InetAddress addr;
064
065  /**
066   * Port of host.
067   */
068  private int port;
069
070  /**
071   * Constructs an InetSocketAddress instance.
072   *
073   * @param addr Address of the socket
074   * @param port Port if the socket
075   *
076   * @exception IllegalArgumentException If the port number is illegel
077   */
078  public InetSocketAddress(InetAddress addr, int port)
079    throws IllegalArgumentException
080  {
081    if (port < 0 || port > 65535)
082      throw new IllegalArgumentException("Bad port number: " + port);
083
084    if (addr == null)
085      addr = InetAddress.ANY_IF;
086
087    this.addr = addr;
088    this.port = port;
089  }
090
091  /**
092   * Constructs an InetSocketAddress instance.
093   *
094   * @param port Port if the socket
095   *
096   * @exception IllegalArgumentException If the port number is illegal
097   */
098  public InetSocketAddress(int port) throws IllegalArgumentException
099  {
100    this((InetAddress) null, port);
101  }
102
103  /**
104   * Constructs an InetSocketAddress instance.
105   *
106   * @param hostname The hostname for the socket address
107   * @param port The port for the socket address
108   *
109   * @exception IllegalArgumentException If the port number is illegal or
110   * the hostname argument is null
111   */
112  public InetSocketAddress(String hostname, int port)
113  {
114    this(hostname, port, true);
115  }
116
117  /**
118   * Constructs an InetSocketAddress instance.
119   *
120   * @param hostname The hostname for the socket address
121   * @param port The port for the socket address
122   * @param resolve <code>true</code> if the address has to be resolved,
123   * <code>false</code> otherwise
124   *
125   * @exception IllegalArgumentException If the port number is illegal or
126   * the hostname argument is null
127   */
128  private InetSocketAddress(String hostname, int port, boolean resolve)
129  {
130    if (hostname == null)
131      throw new IllegalArgumentException("Null host name value");
132
133    if (port < 0 || port > 65535)
134      throw new IllegalArgumentException("Bad port number: " + port);
135
136    this.port = port;
137    this.hostname = hostname;
138    this.addr = null;
139
140    if (resolve)
141    {
142      try
143        {
144          this.addr = InetAddress.getByName(hostname);
145        }
146      catch (Exception e) // UnknownHostException, SecurityException
147        {
148          // Do nothing here. this.addr is already set to null.
149        }
150    }
151
152  }
153
154  /**
155   * Creates an unresolved <code>InetSocketAddress</code> object.
156   *
157   * @param hostname The hostname for the socket address
158   * @param port The port for the socket address
159   *
160   * @exception IllegalArgumentException If the port number is illegal or
161   * the hostname argument is null
162   *
163   * @since 1.5
164   */
165  public static InetSocketAddress createUnresolved(String hostname, int port)
166  {
167    return new InetSocketAddress(hostname, port, false);
168  }
169
170  /**
171   * Test if obj is a <code>InetSocketAddress</code> and
172   * has the same address and port
173   *
174   * @param obj The obj to compare this address with.
175   *
176   * @return True if obj is equal.
177   */
178  public final boolean equals(Object obj)
179  {
180    // InetSocketAddress objects are equal when addr and port are equal.
181    // The hostname may differ.
182    if (obj instanceof InetSocketAddress)
183      {
184        InetSocketAddress sa = (InetSocketAddress) obj;
185
186        if (addr == null && sa.addr != null)
187          return false;
188        else if (addr == null && sa.addr == null) // we know hostname != null
189          return hostname.equals(sa.hostname) && sa.port == port;
190        else
191          return addr.equals(sa.addr) && sa.port == port;
192      }
193
194    return false;
195  }
196
197  /**
198   * Returns the <code>InetAddress</code> or
199   * <code>null</code> if its unresolved
200   *
201   * @return The IP address of this address.
202   */
203  public final InetAddress getAddress()
204  {
205    return addr;
206  }
207
208  /**
209   * Returns <code>hostname</code>
210   *
211   * @return The hostname of this address.
212   */
213  public final String getHostName()
214  {
215    if (hostname == null) // we know addr != null
216      hostname = addr.getHostName();
217
218    return hostname;
219  }
220
221  /**
222   * Returns the <code>port</code>
223   *
224   * @return The port of this address.
225   */
226  public final int getPort()
227  {
228    return port;
229  }
230
231  /**
232   * Returns the hashcode of the <code>InetSocketAddress</code>
233   *
234   * @return The hashcode for this address.
235   */
236  public final int hashCode()
237  {
238    return port + addr.hashCode();
239  }
240
241  /**
242   * Checks wether the address has been resolved or not
243   *
244   * @return True if address is unresolved.
245   */
246  public final boolean isUnresolved()
247  {
248    return addr == null;
249  }
250
251  /**
252   * Returns the <code>InetSocketAddress</code> as string
253   *
254   * @return A string representation of this address.
255   */
256  public String toString()
257  {
258    // Note: if addr is null, then hostname != null.
259    return (addr == null ? hostname : addr.toString()) + ":" + port;
260  }
261}