simMPLS.scenario.TNode.java Source code

Java tutorial

Introduction

Here is the source code for simMPLS.scenario.TNode.java

Source

/* 
 * Copyright 2015 (C) Manuel Domnguez Dorado - ingeniero@ManoloDominguez.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package simMPLS.scenario;

import simMPLS.protocols.TAbstractPDU;
import simMPLS.protocols.TMPLSPDU;
import simMPLS.hardware.timer.TTimerEvent;
import simMPLS.hardware.timer.ITimerEventListener;
import simMPLS.hardware.ports.TPortSet;
import simMPLS.utils.TMonitor;
import simMPLS.utils.TLongIDGenerator;
import java.awt.*;
import org.jfree.chart.*;
import org.jfree.data.*;

/**
 * Esta es una superclase abstracta de la cual deben heredar todos los nodos
 * axistentes en el simulador.
 * @author <B>Manuel Domnguez Dorado</B><br><A
 * href="mailto:ingeniero@ManoloDominguez.com">ingeniero@ManoloDominguez.com</A><br><A href="http://www.ManoloDominguez.com" target="_blank">http://www.ManoloDominguez.com</A>
 * @version 1.0
 */
public abstract class TNode extends TTopologyElement implements Comparable, ITimerEventListener, Runnable {

    /**
     * Crea una nueva instancia de TNodoTopologia.
     * @since 1.0
     * @param identificador Identificador unico para el nodo en la topology.
     * @param d Direccin IP del nodo.
     * @param il Generador de identificadores para los eventos que deba emitir el nodo.
     * @param t Topologia donde se encuentra el nodo includo.
     */
    public TNode(int identificador, String d, TLongIDGenerator il, TTopology t) {
        super(TTopologyElement.NODO, il);
        posicion = new Point(0, 0);
        id = identificador;
        nombre = "";
        estado = DESELECCIONADO;
        mostrarNombre = false;
        IP = d;
        mask = "255.255.255.255";
        ports = null;
        cerrojo = new TMonitor();
        topology = t;
        generarEstadisticas = false;
        availableNs = 0;
        nsDelTic = 0;
        pasosSinEmitir = 0;
        sayCongested = false;
        LDP = true;
    }

    /**
     * Este mtodo permite establecer las estadsticas del nodo.
     * @param e Estadsticas para el nodo.
     * @since 1.0
     */
    public void setGenerateStats(boolean e) {
        generarEstadisticas = e;
    }

    /**
     * Este mtodo permite acceder directamente a las estadsticas del nodo.
     * @return las estadsticas del nodo.
     * @since 1.0
     */
    public boolean isGeneratingStats() {
        return generarEstadisticas;
    }

    /**
     * Este mtodo permite comparar para ordenar, este nodo con cualquier otro.
     * @param o Nodo con el que se va a comparar.
     * @return -1, 0 o 1, dependiendo de si ordinalmente el nodo actual es menor, igual o
     * mayor que el pasado por parmetros.
     * @since 1.0
     */
    public int compareTo(Object o) {
        TNode n = (TNode) o;
        if (getID() < n.getID())
            return -1;
        else if (getID() == n.getID())
            return 0;
        return 1;
    }

    /**
     * Eeste mtodo permite establecer la topology donde se encuentra el nodo.
     * @since 1.0
     * @param t Topologa donde se encuentra el nodo.
     */
    public void ponerTopologia(TTopology t) {
        topology = t;
    }

    /**
     * Este mtodo permite obtener la topology donde se encuentra el nodo.
     * @return Topologa donde se encuentra el nodo.
     * @since 1.0
     */
    public TTopology obtenerTopologia() {
        return topology;
    }

    /**
     * Este mtodo permite obtener el nombre del nodo.
     * @return Nombre del nodo.
     * @since 1.0
     */
    public String getName() {
        return nombre;
    }

    /**
     * Este mtodo permite establecer el nombre del nodo.
     * @since 1.0
     * @param n nombre deseado para el nodo.
     */
    public void setName(String n) {
        nombre = n;
    }

    /**
     * Este mtodo permite obtener el identificador del nodo.
     * @return El identificador unico del nodo.
     * @since 1.0
     */
    public int getID() {
        return id;
    }

    /**
     * Este mtodo permite establecer el identificador del nodo.
     * @param identificador El identificador unico del nodo.
     * @since 1.0
     */
    public void setID(int identificador) {
        id = identificador;
    }

    /**
     * Este mtodo permite obtener la posicin del panel de simulacin donde se
     * encuentra el nodo.
     * @return Las coordenadas del panel de simulacin donde se encuentra el nodo.
     * @since 1.0
     */
    public Point obtenerPosicion() {
        return posicion;
    }

    /**
     * Este mtopdo permite establecer las coordenadas del panel de simulacin donde se
     * mostrar el nodo.
     * @param p Las coordenadas del panel de simulacin elegidas para el nodo.
     * @since 1.0
     */
    public void setPosition(Point p) {
        posicion.x = p.x - (ANCHO_ICONOS / 2);
        posicion.y = p.y - (ALTO_ICONOS / 2);
    }

    /**
     * Este mtodo permite obtener si el nodo est en una posicin dada o no.
     * @param p Coordenadas donde queremos saber si est el nodo o no.
     * @return TRUE, si el nodo est en ess coordenadas. FALSE en caso contrario.
     * @since 1.0
     */
    public boolean estaEnPosicion(Point p) {
        if ((p.x >= posicion.x) && (p.x <= (posicion.x + ANCHO_ICONOS)) && (p.y >= posicion.y)
                && (p.y <= (posicion.y + ALTO_ICONOS)))
            return true;
        return false;
    }

    /**
     * Este mtodo permite obtener si el nodo est seleccionado o no.
     * @return SELECCIONADO, si el nodo est seleccionado. DESELECCIONADO en caso contrario.
     * @since 1.0
     */
    public int getStatus() {
        return estado;
    }

    /**
     * Este mtodo permite seleccionar o deseleccionar el nodo.
     * @param est SELECCIONADO, si queremos que el nodo est seleccionado. DESELECCIONADO en caso
     * contrario.
     * @since 1.0
     */
    public void setStatus(int est) {
        estado = est;
    }

    /**
     * Este mtodo permite establecer si queremos que se muestre el nombre del nodo en
     * la pantalla o no.
     * @param p TRUE, si queremos ver el nombre del nodo. FALSE en caso contrario.
     * @since 1.0
     */
    public void setShowName(boolean p) {
        if (nombre.length() == 0)
            mostrarNombre = false;
        else
            mostrarNombre = p;
    }

    /**
     * Este mtodo permite saber si se est mostrando el nombre del nodo en la pantalla
     * o no.
     * @return TRUE, si se est mostrando el nombre del nodo. FALSE en caso contrario.
     * @since 1.0
     */
    public boolean getShowName() {
        return mostrarNombre;
    }

    /**
     * Este mtodo permie obtener la direccin IP del nodo.
     * @return La direccin IP del nodo.
     * @since 1.0
     */
    public String getIPAddress() {
        return IP;
    }

    /**
     * este mtodo permite establecer la direccin IP del nodo.
     * @param direccion Direccin IP deseada para el nodo.
     * @since 1.0
     */
    public void setIPAddress(String direccion) {
        IP = direccion;
    }

    /**
     * @return the sayCongested
     */
    public boolean isSayCongested() {
        return sayCongested;
    }

    /**
     * @param sayCongested the sayCongested to set
     */
    public void setSayCongested(boolean sayCongested) {
        this.sayCongested = sayCongested;
    }

    /**
     * Este mtodo permite establecer el nmero de ports que tendr el nodo.
     * @param num El nmero de ports deseados para el nodo. 8 como mucho.
     * @since 1.0
     */
    public abstract void setPorts(int num);

    /**
     * Este mtodo permite poner un paquete en el buffer de entrada del nodo.
     * @param paquete Paquete que deseamo poner.
     * @param puerto Puerto del conjunto de ports en el que deeamos depositar el paquete.
     * @since 1.0
     */
    public synchronized void ponerPaquete(TAbstractPDU paquete, int puerto) {
        cerrojo.lock();
        this.ports.getPort(puerto).addPacket(paquete);
        cerrojo.unLock();
    }

    /**
     * Este mtodo incrementa en 1 el nmero de tics que hace que el nodo no emite un
     * paquete.
     * @since 1.0
     */
    public void increaseStepsWithoutEmitting() {
        pasosSinEmitir++;
    }

    /**
     * Este mtodo coloca a cero el nmero de pasos que el nodo ha estado sin emitir un
     * paquete.
     * @since 1.0
     */
    public void resetStepsWithoutEmittingToZero() {
        pasosSinEmitir = 0;
    }

    /**
     * Este mtodo obtiene el nmero pasos que el nodo lleva sin emitir un paquete.
     * @return El nmero de pasos
     * @since 1.0
     */
    public int getStepsWithoutEmitting() {
        return pasosSinEmitir;
    }

    /**
     * @return the LDP
     */
    public boolean isLDP() {
        return LDP;
    }

    /**
     * @param LDP the LDP to set
     */
    public void setLDP(boolean LDP) {
        this.LDP = LDP;
    }

    /**
     * @return the mask
     */
    public String getMask() {
        return mask;
    }

    /**
     * @param mask the mask to set
     */
    public void setMask(String mask) {
        this.mask = mask;
    }

    /**
     * Put this node onto congested mode
     * @since 1.0
     */
    public abstract void toCongest();

    /**
     * Este mtodo permite descartar un paquete en el nodo.
     * @param paquete Paquete que deseamos descartar.
     * @since 1.0
     */
    public abstract void discardPacket(TAbstractPDU paquete);

    /**
     * Este mtodo permite acceder directamente a los ports del nodo.
     * @return El conjunto de ports del nodo.
     * @since 1.0
     */
    public abstract TPortSet getPorts();

    /**
     * Este mtodo permite obtener eventos de sincronizacin del reloj principal del
     * simulador.
     * @param evt Evento enviado por el reloj principal del simulador.
     * @since 1.0
     */
    public abstract void receiveTimerEvent(TTimerEvent evt);

    /**
     * Este mtodo permite obtener el tipo de nodo al que pertenece la instancia
     * actual.
     * @return El tipo del nodo. Una de las constantes definidas en la clase.
     * @since 1.0
     */
    public abstract int getNodeType();

    /**
     * Este mtodo se ponen en funcionamiento cuando el hilo independiente del nodo
     * entra en funcionamiento. En l se codifica toda la funcionalidad del nodo.
     * @since 1.0
     */
    public abstract void run();

    /**
     * Este mtodo debe ser implementado. Permitir solicitar a un nodo activo la
     * retransmisin de un paquete.
     * @param paquete Paquete cuya retransmisin se est solicitando.
     * @param pSalida Puerto por el que se enviar la solicitud.
     * @since 1.0
     */
    public abstract void runGoSPDUStoreAndRetransmitProtocol(TMPLSPDU paquete, int pSalida);

    /**
     * Este mtodo averigua si al nodo le quedan ports libre o no.
     * @return TRUE, si quedan ports libres al nodo. FALSE en caso contrario.
     * @since 1.0
     */
    public abstract boolean hasAvailablePorts();

    /**
     * Este mtodo devuelve el peso del nodo, que debe ser tenido en cuenta por los
     * algoritmos de encaminamiento.
     * @since 1.0
     * @return El peso del nodo.
     */
    public abstract long getRoutingWeight();

    /**
     * Este mtodo devuelve si el nodo est bien configurado o no.
     * @return TRUE, si el nodo est bien configurado. FALSE en caso contrario.
     * @since 1.0
     */
    public abstract boolean isWellConfigured();

    /**
     * Este mtodo comprueba la configuracin del nodo y devuelve un codigo que expresa
     * esta situacin.
     * @param t Topologa donde se encuentra el nodo.
     * @param recfg TRUE, si se est reconfigurando el nodod. FALSE si se est configurando por
     * primera vez.
     * @return CORRECTA, si la configuracin es correcta. Un cdigo de error en caso contrario.
     * @since 1.0
     */
    public abstract int validateConfig(TTopology t, boolean recfg);

    /**
     * Este mtodo transofmra el cdigo de error de la configuracin de un nodo en un
     * texto inteligible.
     * @param e Cdigo de error.
     * @return Un texto explicando el codigo de error.
     * @since 1.0
     */
    public abstract String getErrorMessage(int e);

    /**
     * Este mtodo transforma el nodo en una repreentacin de texto que se puede volcar
     * a disco.
     * @return La cadena de texto que representa al nodo.
     * @since 1.0
     */
    public abstract String marshall();

    /**
     * Este mtodo toma un nodo serializado y lo deserializa.
     * @param elemento Elemento serializado (texto).
     * @return TRUE, si se consigue deserializar sin problemas. FALSe en caso contrario.
     * @since 1.0
     */
    public abstract boolean unMarshall(String elemento);

    /**
     * This method convert a string into a new switching table entry.
     * @param tableEntry the string to convert.
     * @return TRUE, if the process is a success. FALSE otherwise.
     * @since 2.0
     */
    public abstract boolean addTableEntry(String tableEntry);

    /**
     * This method convert a string into a new switching table entry.
     * @return The String of the table content.
     * @since 2.0
     */
    public abstract String saveTableEntry();

    /**
     * Este mtodo permite acceder directamente a las estadsticas del nodo.
     * @return Estadsticas del nodo.
     * @since 1.0
     */
    public abstract TStats getStats();

    /**
     * Este mtodo reinicia los atributos de la clase, dejndolos como recien iniciados
     * por el constructor.
     * @since 1.0
     */
    public abstract void reset();

    /**
     * Esta constante identifica a un nodo emisor.
     * @since 1.0
     */
    public static final int SENDER = 0;
    /**
     * Esta constante identifica a un nodo receptor.
     * @since 1.0
     */
    public static final int RECEIVER = 1;
    /**
     * Esta constante identifica a un nodo LER.
     * @since 1.0
     */
    public static final int LER = 2;
    /**
     * Esta constante identifica a un nodo LER activo.
     * @since 1.0
     */
    public static final int LERA = 3;
    /**
     * Esta constante identifica a un nodo LSR.
     * @since 1.0
     */
    public static final int LSR = 4;
    /**
     * Esta constante identifica a un nodo LSR activo.
     * @since 1.0
     */
    public static final int LSRA = 5;

    /**
     * Esta constante identifica el ancho de los iconos de los nodos.
     * @since 1.0
     */
    public static final int ANCHO_ICONOS = 48;
    /**
     * Esta constante identifica el alto de los iconos de los nodos.
     * @since 1.0
     */
    public static final int ALTO_ICONOS = 48;

    /**
     * Esta cosntante identifica que el nodo est seleccionado.
     * @since 1.0
     */
    public static final int DESELECCIONADO = 0;
    /**
     * Esta cosntante identifica que el nodo no est seleccionado.
     * @since 1.0
     */
    public static final int SELECCIONADO = 1;

    /**
     * Esta constante identifica el nmero de puerto que tiene un emisor.
     * @since 1.0
     */
    public static final int NUM_PUERTOS_EMISOR = 1;
    /**
     * Esta constante identifica el nmero de puerto que tiene un receptor.
     * @since 1.0
     */
    public static final int NUM_PUERTOS_RECEPTOR = 1;
    /**
     * Esta constante identifica el nmero de puerto que tiene un LER.
     * @since 1.0
     */
    public static final int NUM_PUERTOS_LER = 8;
    /**
     * Esta constante identifica el nmero de puerto que tiene un LER activo.
     * @since 1.0
     */
    public static final int NUM_LERA_PORTS = 8;
    /**
     * Esta constante identifica el nmero de puerto que tiene un LSR.
     * @since 1.0
     */
    public static final int NUM_PUERTOS_LSR = 8;
    /**
     * Esta constante identifica el nmero de puerto que tiene un LSR activo.
     * @since 1.0
     */
    public static final int NUM_PUERTOS_LSRA = 8;
    /**
     * Esta constante identifica el nmero de pasos mximo que el nodo estar
     * sin emitir un paquete antes de que se muestre un reloj de arena en el
     * simulador.
     * @since 1.0
     */
    public static final int MAX_PASOS_SIN_EMITIR = 25;

    /**
     * @since 1.0
     */
    private int id;
    /**
     * @since 1.0
     */
    private int estado;
    /**
     * @since 1.0
     */
    private String nombre;
    /**
     * @since 1.0
     */
    private Point posicion;
    /**
     * @since 1.0
     */
    private boolean mostrarNombre;
    /**
     * @since 1.0
     */
    private String IP;
    /**
     * Este atributo contiene el conjunto de ports del nodo.
     * @since 1.0
     */
    protected TPortSet ports;
    /**
     * @since 1.0
     */
    private TMonitor cerrojo;
    /**
     * Este atributo almacena la topology en la que est incluido el nodo.
     * @since 1.0
     */
    protected TTopology topology;
    /**
     * @since 1.0
     */
    private boolean generarEstadisticas;
    /**
     * @since 1.0
     */
    private boolean sayCongested;

    /**
     * Este atributo almacena el nmero de nanosegundos que tiene un tic de reloj
     * asignado por el reloj principal.
     * @since 1.0
     */
    protected int nsDelTic;

    private int pasosSinEmitir = 0;

    private boolean LDP;

    private String mask;

}