/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.invocation.pooled.interfaces; import java.io.Serializable; import java.io.IOException; import javax.net.SocketFactory; /** * This class encapsulates all the required information for a client to * establish a connection with the server. * * It also attempts to provide a fast hash() function since this object * is used as a key in a hashmap mainted by the ConnectionManager. * * @author Bill Burke * @author Scott.Stark@jboss.org * @version $Revision: 81030 $ */ public class ServerAddress implements Serializable { /** The serialVersionUID @since 1.1.4.1 */ private static final long serialVersionUID = -7206359745950445445L; /** * Address of host to connect to * @serial */ public String address; /** * Port the service is listening on * @serial */ public int port; /** * If the TcpNoDelay option should be used on the socket. * @serial */ public boolean enableTcpNoDelay = false; /** * Timeout of setSoTimeout * @serial */ public int timeout = 60000; /** An option socket factory for connecting to the server * @serial */ public SocketFactory clientSocketFactory; /** * This object is used as a key in a hashmap, * so we precompute the hascode for faster lookups. */ private transient int hashCode; /** * The server address/port representation. * * @param address - hostname/ip of the server * @param port - the invoker port * @param enableTcpNoDelay - the Socket.setTcpNoDelay flag * @param timeout - the Socket.setSoTimeout value * @param clientSocketFactory - optional SocketFactory */ public ServerAddress(String address, int port, boolean enableTcpNoDelay, int timeout, SocketFactory clientSocketFactory) { this.address = address; this.port = port; this.enableTcpNoDelay = enableTcpNoDelay; this.hashCode = address.hashCode() + port; if( enableTcpNoDelay ) this.hashCode ++; this.timeout = timeout; this.clientSocketFactory = clientSocketFactory; } public String toString() { return "[address:" + address + ",port:" + port + ",enableTcpNoDelay:" + enableTcpNoDelay + "]"; } public boolean equals(Object obj) { try { // Compare this to obj ServerAddress o = (ServerAddress) obj; if (port != o.port) return false; if (address.equals(o.address) == false) return false; if (enableTcpNoDelay != o.enableTcpNoDelay) return false; return true; } catch (Throwable e) { return false; } } public int hashCode() { return hashCode; } /** * Create the transient hashCode * @param in * @throws IOException * @throws ClassNotFoundException */ private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { // Trigger default serialization in.defaultReadObject(); // Build the hashCode this.hashCode = address.hashCode() + port; if( enableTcpNoDelay ) this.hashCode ++; } }