/*
* $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/HostConfiguration.java,v 1.23 2005/01/14 21:16:40 olegk Exp $
* $Revision: 510585 $
* $Date: 2007-02-22 17:52:16 +0100 (Thu, 22 Feb 2007) $
*
* ====================================================================
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.commons.httpclient;
import org.apache.commons.httpclient.params.HostParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.util.LangUtils;
import java.net.InetAddress;
/**
* Holds all of the variables needed to describe an HTTP connection to a host. This includes
* remote host, port and protocol, proxy host and port, local address, and virtual host.
*
* @author <a href="mailto:[email protected]">Michael Becke</a>
* @author <a href="mailto:[email protected]">Mike Bowler</a>
* @author <a href="mailto:[email protected]">Oleg Kalnichevski</a>
* @author Laura Werner
*
* @since 2.0
*/
public class HostConfiguration implements Cloneable {
/**
* A value to represent any host configuration, instead of using something like
* <code>null</code>. This value should be treated as immutable and only used in
* lookups and other such places to represent "any" host config.
*/
public static final HostConfiguration ANY_HOST_CONFIGURATION = new HostConfiguration();
/** The host to use. */
private HttpHost host = null;
/** The host name of the proxy server */
private ProxyHost proxyHost = null;
/** The local address to use when creating the socket, or null to use the default */
private InetAddress localAddress = null;
/** Parameters specific to this host */
private HostParams params = new HostParams();
/**
* Constructor for HostConfiguration.
*/
public HostConfiguration() {
super();
}
/**
* Copy constructor for HostConfiguration
*
* @param hostConfiguration the hostConfiguration to copy
*/
public HostConfiguration (final HostConfiguration hostConfiguration) {
init(hostConfiguration);
}
private void init(final HostConfiguration hostConfiguration) {
// wrap all of the assignments in a synchronized block to avoid
// having to negotiate the monitor for each method call
synchronized (hostConfiguration) {
try {
if (hostConfiguration.host != null) {
this.host = (HttpHost) hostConfiguration.host.clone();
} else {
this.host = null;
}
if (hostConfiguration.proxyHost != null) {
this.proxyHost = (ProxyHost) hostConfiguration.proxyHost.clone();
} else {
this.proxyHost = null;
}
this.localAddress = hostConfiguration.getLocalAddress();
this.params = (HostParams)hostConfiguration.getParams().clone();
} catch (CloneNotSupportedException e) {
throw new IllegalArgumentException("Host configuration could not be cloned");
}
}
}
/**
* @see java.lang.Object#clone()
*/
public Object clone() {
HostConfiguration copy;
try {
copy = (HostConfiguration) super.clone();
} catch (CloneNotSupportedException e) {
throw new IllegalArgumentException("Host configuration could not be cloned");
}
copy.init(this);
return copy;
}
/**
* @see java.lang.Object#toString()
*/
public synchronized String toString() {
boolean appendComma = false;
StringBuffer b = new StringBuffer(50);
b.append("HostConfiguration[");
if (this.host != null) {
appendComma = true;
b.append("host=").append(this.host);
}
if (this.proxyHost != null) {
if (appendComma) {
b.append(", ");
} else {
appendComma = true;
}
b.append("proxyHost=").append(this.proxyHost);
}
if (this.localAddress != null) {
if (appendComma) {
b.append(", ");
} else {
appendComma = true;
}
b.append("localAddress=").append(this.localAddress);
if (appendComma) {
b.append(", ");
} else {
appendComma = true;
}
b.append("params=").append(this.params);
}
b.append("]");
return b.toString();
}
/**
* Tests if the host configuration equals the configuration set on the
* connection. True only if the host, port, protocol, local address and virtual address
* are equal. If no host configuration has been set false will be returned.
*
* @param connection the connection to test against
* @return <code>true</code> if the connection's host information equals that of this
* configuration
*
* @see #proxyEquals(HttpConnection)
*/
public synchronized boolean hostEquals(final HttpConnection connection) {
if (connection == null) {
throw new IllegalArgumentException("Connection may not be null");
}
if (this.host != null) {
if (!this.host.getHostName().equalsIgnoreCase(connection.getHost())) {
return false;
}
if (this.host.getPort() != connection.getPort()) {
return false;
}
if (!this.host.getProtocol().equals(connection.getProtocol())) {
return false;
}
if (this.localAddress != null) {
if (!this.localAddress.equals(connection.getLocalAddress())) {
return false;
}
} else {
if (connection.getLocalAddress() != null) {
return false;
}
}
return true;
} else {
return false;
}
}
/**
* Tests if the proxy configuration equals the configuration set on the
* connection. True only if the proxyHost and proxyPort are equal.
*
* @param connection the connection to test against
* @return <code>true</code> if the connection's proxy information equals that of this
* configuration
*
* @see #hostEquals(HttpConnection)
*/
public synchronized boolean proxyEquals(final HttpConnection connection) {
if (connection == null) {
throw new IllegalArgumentException("Connection may not be null");
}
if (this.proxyHost != null) {
return
this.proxyHost.getHostName().equalsIgnoreCase(connection.getProxyHost())
&& this.proxyHost.getPort() == connection.getProxyPort();
} else {
return connection.getProxyHost() == null;
}
}
/**
* Returns true if the host is set.
* @return <code>true</code> if the host is set.
*
* @deprecated no longer used
*/
public synchronized boolean isHostSet() {
return this.host != null;
}
/**
* Sets the given host
*
* @param host the host
*/
public synchronized void setHost(final HttpHost host) {
this.host = host;
}
/**
* Sets the given host, port and protocol
*
* @param host the host(IP or DNS name)
* @param port The port
* @param protocol The protocol.
*/
public synchronized void setHost(final String host, int port, final String protocol) {
this.host = new HttpHost(host, port, Protocol.getProtocol(protocol));
}
/**
* Sets the given host, virtual host, port and protocol.
*
* @param host the host(IP or DNS name)
* @param virtualHost the virtual host name or <code>null</code>
* @param port the host port or -1 to use protocol default
* @param protocol the protocol
*
* @deprecated #setHost(String, int, Protocol)
*/
public synchronized void setHost(final String host, final String virtualHost, int port,
final Protocol protocol) {
setHost(host, port, protocol);
this.params.setVirtualHost(virtualHost);
}
/**
* Sets the given host, port and protocol.
*
* @param host the host(IP or DNS name)
* @param port The port
* @param protocol the protocol
*/
public synchronized void setHost(final String host, int port, final Protocol protocol) {
if (host == null) {
throw new IllegalArgumentException("host must not be null");
}
if (protocol == null) {
throw new IllegalArgumentException("protocol must not be null");
}
this.host = new HttpHost(host, port, protocol);
}
/**
* Sets the given host and port. Uses the default protocol "http".
*
* @param host the host(IP or DNS name)
* @param port The port
*/
public synchronized void setHost(final String host, int port) {
setHost(host, port, Protocol.getProtocol("http"));
}
/**
* Set the given host. Uses the default protocol("http") and its port.
*
* @param host The host(IP or DNS name).
*/
public synchronized void setHost(final String host) {
Protocol defaultProtocol = Protocol.getProtocol("http");
setHost(host, defaultProtocol.getDefaultPort(), defaultProtocol);
}
/**
* Sets the protocol, host and port from the given URI.
* @param uri the URI.
*/
public synchronized void setHost(final URI uri) {
try {
setHost(uri.getHost(), uri.getPort(), uri.getScheme());
} catch (URIException e) {
throw new IllegalArgumentException(e.toString());
}
}
/**
* Return the host url.
*
* @return The host url.
*/
public synchronized String getHostURL() {
if (this.host == null) {
throw new IllegalStateException("Host must be set to create a host URL");
} else {
return this.host.toURI();
}
}
/**
* Returns the host.
*
* @return the host(IP or DNS name), or <code>null</code> if not set
*
* @see #isHostSet()
*/
public synchronized String getHost() {
if (this.host != null) {
return this.host.getHostName();
} else {
return null;
}
}
/**
* Returns the virtual host.
*
* @return the virtual host name, or <code>null</code> if not set
*
* @deprecated use HostParams
*/
public synchronized String getVirtualHost() {
return this.params.getVirtualHost();
}
/**
* Returns the port.
*
* @return the host port, or <code>-1</code> if not set
*
* @see #isHostSet()
*/
public synchronized int getPort() {
if (this.host != null) {
return this.host.getPort();
} else {
return -1;
}
}
/**
* Returns the protocol.
* @return The protocol.
*/
public synchronized Protocol getProtocol() {
if (this.host != null) {
return this.host.getProtocol();
} else {
return null;
}
}
/**
* Tests if the proxy host/port have been set.
*
* @return <code>true</code> if a proxy server has been set.
*
* @see #setProxy(String, int)
*
* @deprecated no longer used
*/
public synchronized boolean isProxySet() {
return this.proxyHost != null;
}
/**
* Sets the given proxy host
*
* @param proxyHost the proxy host
*/
public synchronized void setProxyHost(final ProxyHost proxyHost) {
this.proxyHost = proxyHost;
}
/**
* Set the proxy settings.
* @param proxyHost The proxy host
* @param proxyPort The proxy port
*/
public synchronized void setProxy(final String proxyHost, int proxyPort) {
this.proxyHost = new ProxyHost(proxyHost, proxyPort);
}
/**
* Returns the proxyHost.
*
* @return the proxy host, or <code>null</code> if not set
*
* @see #isProxySet()
*/
public synchronized String getProxyHost() {
if (this.proxyHost != null) {
return this.proxyHost.getHostName();
} else {
return null;
}
}
/**
* Returns the proxyPort.
*
* @return the proxy port, or <code>-1</code> if not set
*
* @see #isProxySet()
*/
public synchronized int getProxyPort() {
if (this.proxyHost != null) {
return this.proxyHost.getPort();
} else {
return -1;
}
}
/**
* Set the local address to be used when creating connections.
* If this is unset, the default address will be used.
* This is useful for specifying the interface to use on multi-homed or clustered systems.
*
* @param localAddress the local address to use
*/
public synchronized void setLocalAddress(InetAddress localAddress) {
this.localAddress = localAddress;
}
/**
* Return the local address to be used when creating connections.
* If this is unset, the default address should be used.
*
* @return the local address to be used when creating Sockets, or <code>null</code>
*/
public synchronized InetAddress getLocalAddress() {
return this.localAddress;
}
/**
* Returns {@link HostParams HTTP protocol parameters} associated with this host.
*
* @return HTTP parameters.
*
* @since 3.0
*/
public HostParams getParams() {
return this.params;
}
/**
* Assigns {@link HostParams HTTP protocol parameters} specific to this host.
*
* @since 3.0
*
* @see HostParams
*/
public void setParams(final HostParams params) {
if (params == null) {
throw new IllegalArgumentException("Parameters may not be null");
}
this.params = params;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
public synchronized boolean equals(final Object o) {
if (o instanceof HostConfiguration) {
// shortcut if we're comparing with ourselves
if (o == this) {
return true;
}
HostConfiguration that = (HostConfiguration) o;
return LangUtils.equals(this.host, that.host)
&& LangUtils.equals(this.proxyHost, that.proxyHost)
&& LangUtils.equals(this.localAddress, that.localAddress);
} else {
return false;
}
}
/**
* @see java.lang.Object#hashCode()
*/
public synchronized int hashCode() {
int hash = LangUtils.HASH_SEED;
hash = LangUtils.hashCode(hash, this.host);
hash = LangUtils.hashCode(hash, this.proxyHost);
hash = LangUtils.hashCode(hash, this.localAddress);
return hash;
}
}
|