Java tutorial
/* * 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; }