/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.ssl;
import java.net.Socket;
import java.net.SocketException;
import org.ldaptive.AbstractConfig;
/**
* Contains the configuration data for sockets.
*
* @author Middleware Services
*/
public class SocketConfig extends AbstractConfig
{
/** Keep alive. */
private Boolean keepAlive;
/** OOB Inline. */
private Boolean oobInline;
/** Receive buffer size. */
private Integer receiveBufferSize;
/** Send buffer size. */
private Integer sendBufferSize;
/** Reuse address. */
private Boolean reuseAddress;
/** SO Linger. */
private Integer soLinger;
/** SO Timeout. */
private Integer soTimeout;
/** TCP No Delay. */
private Boolean tcpNoDelay;
/** Traffic Class. */
private Integer trafficClass;
/**
* Returns whether this socket config contains any configuration data.
*
* @return whether all properties are null
*/
public boolean isEmpty()
{
return
keepAlive == null && oobInline == null && receiveBufferSize == null && sendBufferSize == null &&
reuseAddress == null && soLinger == null && soTimeout == null && tcpNoDelay == null && trafficClass == null;
}
/**
* See {@link Socket#getKeepAlive()}.
*
* @return keep alive
*/
public Boolean getKeepAlive()
{
return keepAlive;
}
/**
* See {@link Socket#setKeepAlive(boolean)}.
*
* @param b keep alive
*/
public void setKeepAlive(final boolean b)
{
checkImmutable();
logger.trace("setting keepAlive: {}", b);
keepAlive = b;
}
/**
* See {@link Socket#getOOBInline()}.
*
* @return OOB in line
*/
public Boolean getOOBInline()
{
return oobInline;
}
/**
* See {@link Socket#setOOBInline(boolean)}.
*
* @param b OOB in line
*/
public void setOOBInline(final boolean b)
{
checkImmutable();
logger.trace("setting oobInline: {}", b);
oobInline = b;
}
/**
* See {@link Socket#getReceiveBufferSize()}.
*
* @return receive buffer size
*/
public Integer getReceiveBufferSize()
{
return receiveBufferSize;
}
/**
* See {@link Socket#setReceiveBufferSize(int)}.
*
* @param i receive buffer size
*/
public void setReceiveBufferSize(final int i)
{
checkImmutable();
logger.trace("setting receiveBufferSize: {}", i);
receiveBufferSize = i;
}
/**
* See {@link Socket#getSendBufferSize()}.
*
* @return send buffer size
*/
public Integer getSendBufferSize()
{
return sendBufferSize;
}
/**
* See {@link Socket#setSendBufferSize(int)}.
*
* @param i send buffer size
*/
public void setSendBufferSize(final int i)
{
checkImmutable();
logger.trace("setting sendBufferSize: {}", i);
sendBufferSize = i;
}
/**
* See {@link Socket#getReuseAddress()}.
*
* @return reuse address
*/
public Boolean getReuseAddress()
{
return reuseAddress;
}
/**
* See {@link Socket#setReuseAddress(boolean)}.
*
* @param b reuse address
*/
public void setReuseAddress(final boolean b)
{
checkImmutable();
logger.trace("setting reuseAddress: {}", b);
reuseAddress = b;
}
/**
* See {@link Socket#getSoLinger()}.
*
* @return SO linger
*/
public Integer getSoLinger()
{
return soLinger;
}
/**
* See {@link Socket#setSoLinger(boolean, int)}.
*
* @param i SO linger
*/
public void setSoLinger(final int i)
{
checkImmutable();
logger.trace("setting soLinger: {}", i);
soLinger = i;
}
/**
* See {@link Socket#getSoTimeout()}.
*
* @return SO timeout
*/
public Integer getSoTimeout()
{
return soTimeout;
}
/**
* See {@link Socket#setSoTimeout(int)}.
*
* @param i SO timeout
*/
public void setSoTimeout(final int i)
{
checkImmutable();
logger.trace("setting soTimeout: {}", i);
soTimeout = i;
}
/**
* See {@link Socket#getTcpNoDelay()}.
*
* @return tcp no delay
*/
public Boolean getTcpNoDelay()
{
return tcpNoDelay;
}
/**
* See {@link Socket#setTcpNoDelay(boolean)}.
*
* @param b tcp no delay
*/
public void setTcpNoDelay(final boolean b)
{
checkImmutable();
logger.trace("setting tcpNoDelay: {}", b);
tcpNoDelay = b;
}
/**
* See {@link Socket#getTrafficClass()}.
*
* @return traffic class
*/
public Integer getTrafficClass()
{
return trafficClass;
}
/**
* See {@link Socket#setTrafficClass(int)}.
*
* @param i traffic class
*/
public void setTrafficClass(final int i)
{
checkImmutable();
logger.trace("setting trafficClass: {}", i);
trafficClass = i;
}
/**
* Applies this configuration to the supplied socket.
*
* @param socket to set properties on
*
* @throws SocketException if an error occurs invoking a socket setter
*/
public void configureSocket(final Socket socket)
throws SocketException
{
if (keepAlive != null) {
socket.setKeepAlive(keepAlive);
}
if (oobInline != null) {
socket.setOOBInline(oobInline);
}
if (reuseAddress != null) {
socket.setReuseAddress(reuseAddress);
}
if (tcpNoDelay != null) {
socket.setTcpNoDelay(tcpNoDelay);
}
if (receiveBufferSize != null) {
socket.setReceiveBufferSize(receiveBufferSize);
}
if (sendBufferSize != null) {
socket.setSendBufferSize(sendBufferSize);
}
if (soLinger != null) {
socket.setSoLinger(true, soLinger);
}
if (soTimeout != null) {
socket.setSoTimeout(soTimeout);
}
if (trafficClass != null) {
socket.setTrafficClass(trafficClass);
}
}
@Override
public String toString()
{
return
String.format(
"[%s@%d::keepAlive=%s, oobInline=%s, receiveBufferSize=%s, " +
"sendBufferSize=%s, reuseAddress=%s, soLinger=%s, soTimeout=%s, " +
"tcpNoDelay=%s, trafficClass=%s]",
getClass().getName(),
hashCode(),
keepAlive,
oobInline,
receiveBufferSize,
sendBufferSize,
reuseAddress,
soLinger,
soTimeout,
tcpNoDelay,
trafficClass);
}
}