HttpHost.java
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 }