//**************************************************************** // TRABAJO ISBC : INTEGRACION JAVA-JESS. CASO DEL ELEVADOR //**************************************************************** // // Fichero: Pasajero.java // Autor: // Modificado por: Daniel Urieta Lopez // Proposito: Contiene la clase Pasajero que es un thread que // simula el comportamiento de un usuario del // ascensor. // //**************************************************************** import Edificio; import Direccion; import Piso; import Ascensor; public class Pasajero implements Runnable { final int LlegaAPiso = 0, Esperando = 1, EnAscensor = 2; //Atributos propios de la clase private int id_pasajero; private int estado; private Piso piso_inicial; private Piso piso_destino; //Atributos de las relaciones private Edificio edificio; private Ascensor ascensor; //Atributo de la relacion con el interfaz grafico private VentanaAscensores VA; //Atributo de proceso private Thread pasajero_thread; public Pasajero(int id,Edificio E,VentanaAscensores va) { edificio=E; VA=va; id_pasajero=id; estado=LlegaAPiso; LlegaAPiso(edificio.SeleccionarPisoAleatorio()); QuiereIrAPiso(edificio.SeleccionarPisoAleatorio(piso_inicial)); edificio.controlador.InsertaPersona(id,GetPisoInicial().GetIdPiso(), GetPisoDestino().GetIdPiso(),0); pasajero_thread=new Thread(edificio.grupo(),this); pasajero_thread.start(); } public int GetIdPasajero() { return id_pasajero; } public Piso GetPisoInicial() { return piso_inicial; } public Piso GetPisoDestino() { return piso_destino; } public void LlegaAPiso( Piso P ) { piso_inicial = P; VA.A¤adirPasajeroEnEspera(this); } public void QuiereIrAPiso( Piso P ) { piso_destino = P; } public int GetDireccion() { if (piso_inicial.GetIdPiso() > piso_destino.GetIdPiso() ) return (Direccion.DOWN); else return (Direccion.UP); } public void EmbarcarEnAscensor( Ascensor A ) { ascensor = A; VA.BorrarPasajeroEnEspera(this); A.EmbarcaPasajero(this); edificio.controlador.ModificaPersona(id_pasajero,1); edificio.controlador.RelacionaPersonaAscensor(A.GetIdAscensor(),id_pasajero); A.panel_destino.PulsarDestino(piso_destino); } public void Desembarcar() { ascensor.DesembarcaPasajero(this); edificio.controlador.EliminaPersona(id_pasajero); if ( Math.random()<0.0 ) { LlegaAPiso(piso_destino); QuiereIrAPiso(edificio.SeleccionarPisoAleatorio(piso_destino)); estado=LlegaAPiso; } else pasajero_thread.stop(); } public void run() { Ascensor A; Piso P; while (true) { switch (estado) { case LlegaAPiso: piso_inicial.panel_llamada.LlamarAlAscensor(GetDireccion()); estado = Esperando; break; case Esperando: A=piso_inicial.HayAscensorLibre(GetDireccion()); if ((A!=null) && ( A.EstaElAscensorAbierto() )) { EmbarcarEnAscensor(A); estado=EnAscensor; } break; case EnAscensor: if ( Math.random()<0.000 ) { P = edificio.SeleccionarPisoAleatorio(ascensor.GetPisoActual()); ascensor.panel_destino.PulsarDestino(P); } if ((ascensor.EstaElAscensorAbierto() ) && (ascensor.GetPisoActual()==piso_destino)) Desembarcar(); break; } try { pasajero_thread.sleep(300); } catch (InterruptedException e){} } } }