package de.unisiegen.gtitool.ui.exchange;
import javax.swing.event.EventListenerList;
import de.unisiegen.gtitool.ui.exchange.listener.ExchangeFinishedListener;
import de.unisiegen.gtitool.ui.exchange.listener.ExchangeReceivedListener;
import de.unisiegen.gtitool.ui.exchange.listener.NetworkConnectedListener;
/**
* The {@link Network}.
*
* @author Christian Fehler
* @version $Id$
*/
public final class Network
{
/**
* The {@link Connection}.
*/
private Connection connection = null;
/**
* The used host.
*/
private String host = null;
/**
* The used port.
*/
private int port;
/**
* The {@link EventListenerList}.
*/
private EventListenerList listenerList = new EventListenerList ();
/**
* The {@link Exchange}.
*/
private Exchange exchange;
/**
* Allocates a new {@link Network}.
*
* @param port The used port.
*/
public Network ( int port )
{
// Port
if ( ( port < 0 ) || ( port > 65535 ) )
{
throw new IllegalArgumentException ( "port is out of range" ); //$NON-NLS-1$
}
this.port = port;
}
/**
* Allocates a new {@link Network}.
*
* @param host The used host.
* @param port The used port.
* @param exchange The {@link Exchange}.
*/
public Network ( String host, int port, Exchange exchange )
{
// Host
this.host = host;
// Port
if ( ( port < 0 ) || ( port > 65535 ) )
{
throw new IllegalArgumentException ( "port is out of range" ); //$NON-NLS-1$
}
this.port = port;
// Exchange
this.exchange = exchange;
}
/**
* Adds the given {@link ExchangeFinishedListener}.
*
* @param listener The {@link ExchangeFinishedListener}.
*/
public final void addExchangeFinishedListener (
ExchangeFinishedListener listener )
{
this.listenerList.add ( ExchangeFinishedListener.class, listener );
}
/**
* Adds the given {@link ExchangeReceivedListener}.
*
* @param listener The {@link ExchangeReceivedListener}.
*/
public final void addExchangeReceivedListener (
ExchangeReceivedListener listener )
{
this.listenerList.add ( ExchangeReceivedListener.class, listener );
}
/**
* Adds the given {@link NetworkConnectedListener}.
*
* @param listener The {@link NetworkConnectedListener}.
*/
public final void addNetworkConnectedListener (
NetworkConnectedListener listener )
{
this.listenerList.add ( NetworkConnectedListener.class, listener );
}
/**
* Closes the {@link Network}.
*/
public final void close ()
{
if ( this.connection != null )
{
this.connection.close ();
this.connection = null;
}
}
/**
* Connect the {@link Network} to the server.
*
* @throws ExchangeException If the {@link Connection} could not be
* established.
*/
public final void connect () throws ExchangeException
{
if ( this.host == null )
{
throw new RuntimeException ( "host is null" ); //$NON-NLS-1$
}
this.connection = new ConnectionClient ( this, this.exchange );
this.connection.start ();
}
/**
* Let the listeners know that the {@link Exchange} is finished.
*/
public final void fireExchangeFinished ()
{
ExchangeFinishedListener [] listeners = this.listenerList
.getListeners ( ExchangeFinishedListener.class );
for ( ExchangeFinishedListener current : listeners )
{
current.exchangeFinished ();
}
}
/**
* Let the listeners know that a {@link Exchange} was received.
*
* @param newExchange The received {@link Exchange}.
*/
public final void fireExchangeReceived ( Exchange newExchange )
{
ExchangeReceivedListener [] listeners = this.listenerList
.getListeners ( ExchangeReceivedListener.class );
for ( ExchangeReceivedListener current : listeners )
{
current.exchangeReceived ( newExchange );
}
}
/**
* Let the listeners know that the {@link Network} is connected.
*/
public final void fireNetworkConnected ()
{
NetworkConnectedListener [] listeners = this.listenerList
.getListeners ( NetworkConnectedListener.class );
for ( NetworkConnectedListener current : listeners )
{
current.networkConnected ();
}
}
/**
* Returns the host.
*
* @return The host.
* @see #host
*/
public final String getHost ()
{
return this.host;
}
/**
* Returns the port.
*
* @return The port.
* @see #port
*/
public final int getPort ()
{
return this.port;
}
/**
* Listen for incoming {@link Connection}s.
*
* @throws ExchangeException If the {@link Network} could not listen on the
* port.
*/
public final void listen () throws ExchangeException
{
this.connection = new ConnectionServer ( this );
this.connection.start ();
}
/**
* Removes the given {@link ExchangeFinishedListener}.
*
* @param listener The {@link ExchangeFinishedListener}.
*/
public final void removeExchangeFinishedListener (
ExchangeFinishedListener listener )
{
this.listenerList.remove ( ExchangeFinishedListener.class, listener );
}
/**
* Removes the given {@link ExchangeReceivedListener}.
*
* @param listener The {@link ExchangeReceivedListener}.
*/
public final void removeExchangeReceivedListener (
ExchangeReceivedListener listener )
{
this.listenerList.remove ( ExchangeReceivedListener.class, listener );
}
/**
* Removes the given {@link NetworkConnectedListener}.
*
* @param listener The {@link NetworkConnectedListener}.
*/
public final void removeNetworkConnectedListener (
NetworkConnectedListener listener )
{
this.listenerList.remove ( NetworkConnectedListener.class, listener );
}
/**
* Sends the {@link Exchange}.
*/
public final void send ()
{
if ( this.connection != null )
{
this.connection.send ();
}
else
{
throw new RuntimeException ( "not connected" ); //$NON-NLS-1$
}
}
}