LABERINTOS DE DISCIPLINAS DEL PENTATLÓN OLÍMPICO MODERNO. Por JAVIER SOLIS NO...
Java ArrayList Iterator
1. Desarrollar un programa que simule el interfaz software de entrada a una tarjeta de red siguiendo las
siguientes especificaciones.
La entrada está implementada mediante dos tipos de buffers. Un primer buffer donde van entrando todas las
tramas según van llegando, que tiene un espacio máximo de 4 tramas. Y un segundo buffer de espacio
ilimitado que tiene tres puertos (entendiendo por puertos, zonas de almacenamiento distintas). La entrada
debe implementar un mecanismo para mostrar el contenido de sus buffers.
Cuando el primer buffer se llene, enviará al segundo buffer de forma automática las primeras 2 tramas con
mayor prioridad. Y así sucesivamente.
Existen distintos tipos de tramas, aunque de momento solo tendremos en cuenta las tramas TCP y UDP (en
el futuro puede que tengamos que soportar más). Ahora bien, todas las tramas sean del tipo que sean,
contienen el puerto al que van dirigidas (1, 2 o 3), su prioridad (de 1 a 10, siendo 1 la mayor prioridad) y el
contenido de la trama.
Nota: ante dos tramas con el mismo valor de prioridad, tendrá más prioridad aquella cuyo contenido esté por
delante siguiendo el orden del abecedario.
Por último, crearemos una clase Actividad7 donde instanciaremos el sistema de entrada a la tarjeta de red y
le enviaremos 6 tramas de distintos tipos y con puertos y prioridades aleatorias. Una vez se hayan enviado
5 tramas, se mostrará el contenido de los buffers del sistema de entrada.
Realizar previamente el Diagrama de Clases UML.
OrdenarTramaPorPrioridad.java
import java.util.Comparator;
public class OrdenarTramaPorPrioridad implements Comparator<Object>{
//Ordena las tramas primero por prioridad y después por contenido.
public int compare (Object obj1, Object obj2){
Trama trama1 = (Trama)obj1;
Trama trama2 = (Trama)obj2;
if(trama1.getPrioridad() == trama2.getPrioridad()){
return trama1.getContenido().compareToIgnoreCase(trama2.getContenido());
}else{
return trama1.getPrioridad() - trama2.getPrioridad();
}
}
}//Fin Clase
bitCoach::Juan Bautista Cascallar Lorenzo::Página 1
2. Trama.java
public class Trama {
//ATRIBUTOS
private int puerto; // 1, 2 o 3
private int prioridad; //De 1 (máx) a 10 (mín)
String contenido = "VACIO";
//Constructor
public Trama (int p, int pri, String co){
puerto = p;
prioridad = pri;
contenido = co;
}
//SETTERS
public void setPuerto(int param){
puerto = param;
}
public void setPrioridad(int param){
prioridad = param;
}
public void setContenido(String param){
contenido = param;
}
//GETTERS
public int getPuerto(){
return puerto;
}
public int getPrioridad(){
return prioridad;
}
public String getContenido(){
return contenido;
}
}
tramaUDP.java
public class tramaUDP extends Trama{
private String id = "Soy trama TCP";
//Constructor
public tramaUDP(int p, int pri, String co){
super(p,pri,co);
}
public String getId(){
return id;
}
}
tramaTCP.java
public class tramaTCP extends Trama{
private String id = "Soy trama TCP";
//Constructor
public tramaTCP(int p, int pri, String co){
super(p,pri,co);
}
public String getId(){
return id;
}
}
bitCoach::Juan Bautista Cascallar Lorenzo::Página 2
3. Buffer1.java
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Collections;
public class Buffer1 {
//Atributos
private ArrayList<Object> buffer01 = new ArrayList<Object>();
public void agregarTrama(Object trama){
buffer01.add(trama);
ordTramaPrioridad();
}
public Object extraerTramaMasPrioritaria(){
Object trama = buffer01.get(0);
buffer01.remove(0);
return trama;
}
public int getTamanio(){
return buffer01.size();
}
public void ordTramaPrioridad(){
Collections.sort(buffer01, new OrdenarTramaPorPrioridad());
}
public void mostrarContenido(){
System.out.println("===========================================================");
System.out.println("CONTENIDO DEL PRIMER BUFFER [BUFFER1]");
System.out.println("===========================================================");
Iterator<Object> it = buffer01.iterator();
while(it.hasNext()){
Object obj;
obj = it.next();
if(obj.getClass().getName().equals("tramaTCP")){
tramaTCP tcpAux;
tcpAux = (tramaTCP)obj;
System.out.println("--Trama TCP-----------------------");
System.out.println("PUERTO: " + tcpAux.getPuerto());
System.out.println("PRIORIDAD: " + tcpAux.getPrioridad());
System.out.println("CONTENIDO: " + tcpAux.getContenido());
System.out.println("--Trama TCP-----------------------");
}else{
tramaUDP udpAux;
udpAux = (tramaUDP)obj;
System.out.println("--Trama UDP-----------------------");
System.out.println("PUERTO: " + udpAux.getPuerto());
System.out.println("PRIORIDAD: " + udpAux.getPrioridad());
System.out.println("CONTENIDO: " + udpAux.getContenido());
System.out.println("--Trama UDP-----------------------");
}
}
}
}//Fin clase.
bitCoach::Juan Bautista Cascallar Lorenzo::Página 3
4. Buffer2.java
import java.util.ArrayList;
import java.util.Iterator;
public class Buffer2 {
private ArrayList<Object> puerto01 = new ArrayList<Object>();
private ArrayList<Object> puerto02 = new ArrayList<Object>();
private ArrayList<Object> puerto03 = new ArrayList<Object>();
//Otros métodos
public void agregarTrama(Object trama){
Trama obj = (Trama)trama;
switch(obj.getPuerto()){
case 1:
puerto01.add(trama);
break;
case 2:
puerto02.add(trama);
break;
case 3:
puerto03.add(trama);
break;
}
}//Fin function
public void mostrarContenido(){
System.out.println("===========================================================");
System.out.println("CONTENIDO DEL SEGUNDO BUFFER [BUFFER2]");
System.out.println("===========================================================");
System.out.println("Tramas en Puerto 01");
Iterator<Object> iterador = puerto01.iterator();
leerPuerto(iterador);
System.out.println("Tramas en Puerto 02");
iterador = puerto02.iterator();
leerPuerto(iterador);
System.out.println("Tramas en Puerto 03");
iterador = puerto03.iterator();
leerPuerto(iterador);
}
private void leerPuerto(Iterator<Object> it){
while(it.hasNext()){
Object obj;
obj = it.next();
if(obj.getClass().getName() == "tramaTCP"){
tramaTCP tcpAux;
tcpAux = (tramaTCP)obj;
System.out.println("--Trama TCP-----------------------");
System.out.println("PUERTO: " + tcpAux.getPuerto());
System.out.println("PRIORIDAD: " + tcpAux.getPrioridad());
System.out.println("CONTENIDO: " + tcpAux.getContenido());
System.out.println("--Trama TCP-----------------------");
}else{
tramaUDP udpAux;
udpAux = (tramaUDP)obj;
System.out.println("--Trama UDP-----------------------");
System.out.println("PUERTO: " + udpAux.getPuerto());
System.out.println("PRIORIDAD: " + udpAux.getPrioridad());
System.out.println("CONTENIDO: " + udpAux.getContenido());
System.out.println("--Trama UDP-----------------------");
}
}
}
}//Fin clase
bitCoach::Juan Bautista Cascallar Lorenzo::Página 4
5. InterfazRed.java
public class InterfazRed {
//Atributos
private Buffer1 bf1 = new Buffer1();
private Buffer2 bf2 = new Buffer2();
public void agregarTrama(Object trama){
if(bf1.getTamanio() < 4){
bf1.agregarTrama(trama);
}else{
//Extraer las dos primeras tramas del primer buffer.
bf2.agregarTrama(bf1.extraerTramaMasPrioritaria());
bf2.agregarTrama(bf1.extraerTramaMasPrioritaria());
bf1.agregarTrama(trama);
}
}//Fin function
public void mostrarBuffers(){
bf1.mostrarContenido();
bf2.mostrarContenido();
}
}//Fin Clase
TestTramas.java
public class TestTramas {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
InterfazRed interfaz = new InterfazRed();
//Creamos las seis tramas (puerto,prioridad 1+..10-,datos)
/*
tramaTCP TCP1 = new tramaTCP(1,1,"d");
tramaTCP TCP2 = new tramaTCP(2,1,"c");
tramaTCP TCP3 = new tramaTCP(3,2,"b");
*/
tramaTCP TCP1 = new tramaTCP((int) (Math.random()*3+1),(int)
(Math.random()*10+1),"a");
tramaTCP TCP2 = new tramaTCP((int) (Math.random()*3+1),(int)
(Math.random()*10+1),"c");
tramaTCP TCP3 = new tramaTCP((int) (Math.random()*3+1),(int)
(Math.random()*10+1),"e");
//---
/*
tramaUDP UDP1 = new tramaUDP(1,1,"a");
tramaUDP UDP2 = new tramaUDP(2,2,"b");
tramaUDP UDP3 = new tramaUDP(3,2,"a");
*/
tramaUDP UDP1 = new tramaUDP((int) (Math.random()*3+1),(int)
(Math.random()*10+1),"e");
tramaUDP UDP2 = new tramaUDP((int) (Math.random()*3+1),(int)
(Math.random()*10+1),"e");
tramaUDP UDP3 = new tramaUDP((int) (Math.random()*3+1),(int)
(Math.random()*10+1),"e");
interfaz.agregarTrama(TCP1);
interfaz.agregarTrama(TCP2);
interfaz.agregarTrama(TCP3);
interfaz.agregarTrama(UDP1);
interfaz.agregarTrama(UDP2);
interfaz.agregarTrama(UDP3);
interfaz.mostrarBuffers();
}//Fin Function
}//Fin Clase
bitCoach::Juan Bautista Cascallar Lorenzo::Página 5
6. Diagrama de Clases UML
bitCoach::Juan Bautista Cascallar Lorenzo::Página 6