View Javadoc

    1   /*
    2    * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/HttpHost.java,v 1.3 2005/01/14 21:16:40 olegk Exp $
    3    * $Revision: 510587 $
    4    * $Date: 2007-02-22 17:56:08 +0100 (Thu, 22 Feb 2007) $
    5    *
    6    * ====================================================================
    7    *
    8    *  Licensed to the Apache Software Foundation (ASF) under one or more
    9    *  contributor license agreements.  See the NOTICE file distributed with
    10   *  this work for additional information regarding copyright ownership.
    11   *  The ASF licenses this file to You under the Apache License, Version 2.0
    12   *  (the "License"); you may not use this file except in compliance with
    13   *  the License.  You may obtain a copy of the License at
    14   *
    15   *      http://www.apache.org/licenses/LICENSE-2.0
    16   *
    17   *  Unless required by applicable law or agreed to in writing, software
    18   *  distributed under the License is distributed on an "AS IS" BASIS,
    19   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    20   *  See the License for the specific language governing permissions and
    21   *  limitations under the License.
    22   * ====================================================================
    23   *
    24   * This software consists of voluntary contributions made by many
    25   * individuals on behalf of the Apache Software Foundation.  For more
    26   * information on the Apache Software Foundation, please see
    27   * <http://www.apache.org/>.
    28   *
    29   */
    30
    31  package org.apache.commons.httpclient;
    32
    33  import org.apache.commons.httpclient.protocol.Protocol;
    34  import org.apache.commons.httpclient.util.LangUtils;
    35
    36  /**
    37   * Holds all of the variables needed to describe an HTTP connection to a host. This includes
    38   * remote host, port and protocol.
    39   *
    40   * @author <a href="mailto:becke@u.washington.edu">Michael Becke</a>
    41   * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
    42   * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
    43   * @author Laura Werner
    44   *
    45   * @since 3.0
    46   */
    47  public class HttpHost implements Cloneable {
    48
    49      /** The host to use. */
    50      private String hostname = null;
    51
    52      /** The port to use. */
    53      private int port = -1;
    54
    55      /** The protocol */
    56      private Protocol protocol = null;
    57
    58      /**
    59       * Constructor for HttpHost.
    60       *
    61       * @param hostname the hostname (IP or DNS name). Can be <code>null</code>.
    62       * @param port the port. Value <code>-1</code> can be used to set default protocol port
    63       * @param protocol the protocol. Value <code>null</code> can be used to set default protocol
    64       */
    65      public HttpHost(final String hostname, int port, final Protocol protocol) {
    66          super();
    67          if (hostname == null) {
    68              throw new IllegalArgumentException("Host name may not be null");
    69          }
    70          if (protocol == null) {
    71              throw new IllegalArgumentException("Protocol may not be null");
    72          }
    73          this.hostname = hostname;
    74          this.protocol = protocol;
    75          if (port >= 0) {
    76              this.port = port;
    77          } else {
    78              this.port = this.protocol.getDefaultPort();
    79          }
    80      }
    81
    82      /**
    83       * Constructor for HttpHost.
    84       *
    85       * @param hostname the hostname (IP or DNS name). Can be <code>null</code>.
    86       * @param port the port. Value <code>-1</code> can be used to set default protocol port
    87       */
    88      public HttpHost(final String hostname, int port) {
    89          this(hostname, port, Protocol.getProtocol("http"));
    90      }
    91
    92      /**
    93       * Constructor for HttpHost.
    94       *
    95       * @param hostname the hostname (IP or DNS name). Can be <code>null</code>.
    96       */
    97      public HttpHost(final String hostname) {
    98          this(hostname, -1, Protocol.getProtocol("http"));
    99      }
    100
    101     /**
    102      * URI constructor for HttpHost.
    103      *
    104      * @param uri the URI.
    105      */
    106     public  HttpHost(final URI uri) throws URIException {
    107         this(uri.getHost(), uri.getPort(), Protocol.getProtocol(uri.getScheme()));
    108     }
    109
    110     /**
    111      * Copy constructor for HttpHost
    112      *
    113      * @param httphost the HTTP host to copy details from
    114      */
    115     public HttpHost (final HttpHost httphost) {
    116         super();
    117         init(httphost);
    118     }
    119
    120 	private void init(final HttpHost httphost) {
    121 		this.hostname = httphost.hostname;
    122         this.port = httphost.port;
    123         this.protocol = httphost.protocol;
    124 	}
    125
    126     /**
    127      * @throws CloneNotSupportedException
    128      * @see java.lang.Object#clone()
    129      */
    130     public Object clone() throws CloneNotSupportedException {
    131     	HttpHost copy = (HttpHost) super.clone();
    132     	copy.init(this);
    133         return copy;
    134     }
    135
    136     /**
    137      * Returns the host name (IP or DNS name).
    138      *
    139      * @return the host name (IP or DNS name), or <code>null</code> if not set
    140      */
    141     public String getHostName() {
    142         return this.hostname;
    143     }
    144
    145     /**
    146      * Returns the port.
    147      *
    148      * @return the host port, or <code>-1</code> if not set
    149      */
    150     public int getPort() {
    151         return this.port;
    152     }
    153
    154     /**
    155      * Returns the protocol.
    156      * @return The protocol.
    157      */
    158     public Protocol getProtocol() {
    159         return this.protocol;
    160     }
    161
    162     /**
    163      * Return the host uri.
    164      *
    165      * @return The host uri.
    166      */
    167     public String toURI() {
    168         StringBuffer buffer = new StringBuffer(50);
    169         buffer.append(this.protocol.getScheme());
    170         buffer.append("://");
    171         buffer.append(this.hostname);
    172         if (this.port != this.protocol.getDefaultPort()) {
    173             buffer.append(':');
    174             buffer.append(this.port);
    175         }
    176         return buffer.toString();
    177     }
    178
    179     /**
    180      * @see java.lang.Object#toString()
    181      */
    182     public String toString() {
    183         StringBuffer buffer = new StringBuffer(50);
    184         buffer.append(toURI());
    185         return buffer.toString();
    186     }
    187
    188     /**
    189      * @see java.lang.Object#equals(java.lang.Object)
    190      */
    191     public boolean equals(final Object o) {
    192
    193         if (o instanceof HttpHost) {
    194             // shortcut if we're comparing with ourselves
    195             if (o == this) {
    196                 return true;
    197             }
    198             HttpHost that = (HttpHost) o;
    199             if (!this.hostname.equalsIgnoreCase(that.hostname)) {
    200                 return false;
    201             }
    202             if (this.port != that.port) {
    203                 return false;
    204             }
    205             if (!this.protocol.equals(that.protocol)) {
    206                 return false;
    207             }
    208             // everything matches
    209             return true;
    210         } else {
    211             return false;
    212         }
    213     }
    214
    215     /**
    216      * @see java.lang.Object#hashCode()
    217      */
    218     public int hashCode() {
    219         int hash = LangUtils.HASH_SEED;
    220         hash = LangUtils.hashCode(hash, this.hostname);
    221         hash = LangUtils.hashCode(hash, this.port);
    222         hash = LangUtils.hashCode(hash, this.protocol);
    223         return hash;
    224     }
    225
    226 }