package org.jivesoftware.openfire.spi;
/**
* ConnectionAcceptors are responsible for accepting new (typically socket) connections from peers.
*
* The configuration (but not the state) of an instance is intended to be immutable. When configuration changes are
* needed, an instance needs to be replaced by a new instance.
*
* @author Guus der Kinderen, guus.der.kinderen@gmail.com
*/
public abstract class ConnectionAcceptor
{
protected final ConnectionConfiguration configuration;
/**
* Constructs a new instance which will accept new connections based on the provided configuration.
*
* The provided configuration is expected to be immutable. ConnectionAcceptor instances are not expected to handle
* changes in configuration. When such changes are to be applied, an instance is expected to be replaced.
*
* Newly instantiated ConnectionAcceptors will not accept any connections before {@link #start()} is invoked.
*
* @param configuration The configuration for connections to be accepted (cannot be null).
*/
public ConnectionAcceptor( ConnectionConfiguration configuration )
{
if (configuration == null)
{
throw new IllegalArgumentException( "Argument 'configuration' cannot be null" );
}
this.configuration = configuration;
}
/**
* Makes the instance start accepting connections.
*
* An invocation of this method on an instance that is already started should have no effect (to the extend that the
* instance should continue to accept connections without interruption or configuration changes).
*/
abstract void start();
/**
* Halts connection acceptation and gracefully releases resources.
*
* An invocation of this method on an instance that was not accepting connections should have no effect.
*
* Instances of this class do not support configuration changes (see class documentation). As a result, there is no
* requirement that an instance that is stopped after it was running can successfully be restarted.
*/
abstract void stop();
/**
* Determines if this instance is currently in a state where it is actively serving connections.
*
* @return false when this instance is started and is currently being used to serve connections (otherwise true)
*/
abstract boolean isIdle();
}