package chat;



import java.io.Serializable;

import java.net.InetAddress;



/**
 * Classe che astrae l'<i>endpoint</i> di una connessione di rete.
 * Il concetto di <i>endpoint</i> é lo stesso adottato da TCP per
 * individuare una "connessione", definita appunto come coppia di
 * <i>endpoint</i>.
 * <p>
 * L'oggetto rappresentato da <code>Endpoint</code> è dunque una
 * coppia (<b>indirizzo IP</b>, <b>porta</b>), dove la seconda
 * può essere sia un numero di porta TCP, sia un numero di porta UDP.
 * <p>
 *
 * @author    <em>Marco Cimatti</em>
 * @version   1.0
 */
public class Endpoint implements Serializable {

  /** L'indirizzo IP. */
  private InetAddress IP;

  /** Il numero di porta TCP/UDP. */
  private int porta;

  /**
   * Costruttore. Inizializza le variabili d'istanza <code>IP</code>
   * e <code>porta</code>, verificando il range di appartenenza della
   * seconda: da 0 a 65535 (<code>0xFFFF</code>) estremi compresi.
   *
   * @param       IP          indirizzo IP da inglobare nell'<i>endpoint</i>.
   * @param       porta       il numero di porta TCP/UDP nell'<i>endpoint</i>.
   * @exception   IllegalArgumentException   se e solo se il numero di porta
   *                                         specificato non appartiene
   *                                         all'intervallo [0..65535].
   * @see         #IP
   * @see         #porta
   */
  public Endpoint(InetAddress IP, int porta) {
    if (porta < 0 || 0xffff < porta)
	    throw new IllegalArgumentException("Porta fuori range: " + porta);
    this.IP    = IP;
    this.porta = porta;
  }

  /**
   * <b>Selettore</b> per ottenere l'IP incapsulato nell'istanza.
   * <b>Primitiva</b>.
   *
   * @return   la variabile d'istanza <code>IP</code>.
   * @see      #IP
   */
  public InetAddress IP() {
    return IP;
  }

  /**
   * <b>Selettore</b> per leggere il numero di porta incapsulato nell'istanza.
   * <b>Primitiva</b>.
   *
   * @return   la variabile d'istanza <code>porta</code>.
   * @see      #porta
   */
  public int porta() {
    return porta;
  }

  /**
   * Metodo per verificare l'uguaglianza fra due <code>Endpoint</code>.
   * In questa realizzazione è una <b>primitiva</b> solo per questioni
   * di efficienza, ma non è obbligatorio.
   *
   * @param    obj   l'istanza di <code>Endpoint</code> con la quale
   *                 effettuare il confronto.
   * @return   <code>true</code> se e solo se <code>obj</code> rappresenta
   *           il medesimo <i>endpoint</i> astratto da questa istanza,
   *           ovvero se sono uguali sia l'indirizzo IP, sia il numero
   *           di porta TCP/UDP. Se <code>obj == null</code> riporta <code>false</code>.
   */
  public boolean equals(Object obj) {
    return obj == null ? false
                       : IP.equals(((Endpoint) obj).IP) && porta == ((Endpoint) obj).porta;
  }

  /**
   * <b>Convertitore</b>; in questa realizzazione è una <b>primitiva</b>
   * solo per questioni di efficienza.
   *
   * @return   una stringa rappresentante l'<i>endpoint</i> del tipo
   *           <code>"X.X.X.X:porta"</code>. Ad esempio, il <i>web server</i>
   *           locale risiede tipicamente a <code>"127.0.0.1:80"</code>.
   */
  public String toString() {
    return IP.getHostAddress() + ':' + porta;
  }
}


syntax highlighted by Code2HTML, v. 0.8.11