diff --git a/src/es/markse/Muelle.java b/src/es/markse/Muelle.java index 74ed1c31aa8dcc989e6af95cd8165ae3de7e9376..c8e01da4c83b72ebae257c8ef8ca477bb952fa72 100644 --- a/src/es/markse/Muelle.java +++ b/src/es/markse/Muelle.java @@ -5,6 +5,7 @@ package es.markse; import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; import es.uva.inf.poo.maps.GPSCoordinate; @@ -14,17 +15,18 @@ import es.uva.inf.poo.maps.GPSCoordinate; * @author victorm */ public class Muelle { - private Plaza[] plazas; - private String identificador; - private boolean operativo; - private GPSCoordinate cord; - private int plazasVacias; - private int plazasLlenas = 0; - private int plazasSemillenas = 0; + private final Plaza[] plazas; + private final String identificador; + private enum estado{ + OPERATIVO, FUERA_DE_SERVICIO + } + private estado estadoActual; + private final GPSCoordinate cord; + private final Pattern IDENTIFICADOR_REGUEX = Pattern.compile("^\\d{2}$"); private static class Plaza { private int altura; - private List<Contenedor> contenedores = new ArrayList<>(); + private final List<Contenedor> contenedores = new ArrayList<>(); /** * Constructor del objeto Plaza @@ -40,7 +42,7 @@ public class Muelle { * @return true si contiene ese contenedor en la Plaza o false si no lo tiene */ public boolean contieneContenedor(String codigo) { - return this.contenedores.stream().anyMatch(c -> c.getCodigo().equals(codigo)); + return (this.nivelContenedor(codigo)!=-1) ? true : false; } /** @@ -57,7 +59,6 @@ public class Muelle { return -1; } - /** *Metodo que sirve para colar el contenedor en una plaza (apilarlo si esppsible) * @param codigo: Codigo del contenedor @@ -117,6 +118,22 @@ public class Muelle { public int altura() { return this.altura; } + + /** + * Metodo que devuelve si una plaza esta vacia o no + * @return true si esta vacia o false si no lo esta + */ + public boolean plazaVacia() { + return (this.contenedores.size() == 0) ? true : false; + } + + /** + * Metodo que devuelve si una plaza esta llena o no + * @return true si la plaza esta llena o si no lo esta + */ + public boolean plazaLlena() { + return (this.contenedores.size() == this.altura || this.ultimoContenedor().tieneTecho()) ? true : false; + } } /** @@ -127,14 +144,19 @@ public class Muelle { * @param plazas Numero de plazas totales que tiene el Muelle * @param altura numero maximo de contenedores que se pueden apilar encima de otro */ + //CHANGE BOOLEAN OPERATIVO FOR AN STATE OF ESTADO public Muelle (String identificador, GPSCoordinate cord, boolean operativo, int plazas, int altura) { - comprobarValoresNulos(identificador, cord); - comprobarValoresMuelle(identificador, plazas, altura); + if(!comprobarValoresNulos(identificador, cord)) + throw new IllegalArgumentException("Los valores del identificador y coordenada no pueden ser nulos"); + if(!comprobarTamanyoAlturaPlazas(plazas, altura)) + throw new IllegalArgumentException("Los tamaños (altura y plaza) no puedne ser menores a 1"); + if (!comprobarIdentificador(identificador)) + throw new IllegalArgumentException("El formato del identificador es incorrecto"); + this.identificador = identificador; this.cord = cord; - this.plazasVacias = plazas; this.plazas = new Plaza[plazas]; - this.operativo = operativo; + this.estadoActual = operativo ? estado.OPERATIVO : estado.FUERA_DE_SERVICIO; //Inicializamos el array de las plazas for (int i = 0; i < plazas; i++) { @@ -144,64 +166,38 @@ public class Muelle { } /** - * Metodo para comporbar que los valores no sean nulos a la hora de crear un Objeto de tipo Muelle + * Metodo para comporbar que los valores no sean nulos * @param identificador Identificador del muelle * @param cord Coordenadas de muelle (clase GPSCoordinate) - * @throws IllegalArgumentException si el identificador o la coordenada son nulos + * @return true si los valores son nulos o false si no lo son */ - private void comprobarValoresNulos(String identificador, GPSCoordinate cord) { - if (identificador == null) throw new IllegalArgumentException("Identificador no puede ser nulo"); - if (cord == null) throw new IllegalArgumentException("Identificador no puede ser nulo"); + private boolean comprobarValoresNulos(String identificador, GPSCoordinate cord) { + if (identificador == null || cord == null) return true; + else return false; } /** - * Metodo que comprueba si el identificador es correcto (2 digitos) - * @param identificador identificador del muelle - * @throws IllegalArgumentException si la altura o la plaza son menores que 1, o si el identificador - * no es correcto + * Metodo que sirve para comprobar si son correctas el tamaño de las plazas + * @param plazas El numero de plazas del muelle + * @param altura El tamaño de la altura del muelle + * @return true si el tamaño es correcto, false si no lo es */ - private void comprobarValoresMuelle(String identificador, int plazas, int altura) { - if (plazas<1) throw new IllegalArgumentException("Numero de plazas debe ser 1 o mas"); - if (altura<1) throw new IllegalArgumentException("La altura debe ser 1 o mayor"); - if (identificador.length() != 2 || !identificador.matches("\\d{2}")) { - throw new IllegalArgumentException("Formato incorrecto. Debe ser un entero de 2 dÃgitos numéricos (por ejemplo, 04, 15, 65)"); - } + private boolean comprobarTamanyoAlturaPlazas (int plazas, int altura) { + return (plazas<1 || altura <1)? false : true; } /** - * Metodo que sirve para si un codigo de contenedor es correcto - * @param codigo Codigo del contenedor que se comprueba - * @throws IllegalArgumentException si el codigo es nulo o no corresponde a un codigo correcto - */ - private void comprobarCodigoContenedor(String codigo) { - if (codigo == null) throw new IllegalArgumentException("Codigo no puede ser nulo"); - if (!codigo.matches("[A-Z]{4}\\d{7}")) throw new IllegalArgumentException("El codigo no pertenece a un codigo de contenedor"); - } - - /** - * Metodo que devuelve el identificador de un muelle. Este identificador sera de 2 digitos. - * @return identificador del muelle - */ - public String getIdentificador() { - return this.identificador; - } - - /** - * Metodo que indica si el Muelle esta operativo o no - * @return Si esta operativo (true) o no (false) + * Metodo que comprueba si el identificador es correcto + * @param identificador Identificador del muelle + * @return true si es correcto o false si no lo es */ - public boolean estaOperativo() { - return this.operativo; + private boolean comprobarIdentificador(String identificador) { + return (IDENTIFICADOR_REGUEX.matcher(identificador).matches()) ? true : false; } - /** - * Metodo que devuelve el punto de coordenadas del muelle - * Este punto pertenece a la clase GPSCoordinate - * @return coordenadas del muelle; - */ - public GPSCoordinate getGPSCoordinate() { - return this.cord; - } + /*************************************** + * EMPLEACION DE LOS METODOS QUE PIDEN * + ****************************************/ /** * 1.1.7 Metodo que devuelve el numero de plazas totales que tiene el muelle @@ -217,26 +213,35 @@ public class Muelle { * @return numero de plazas vacias. */ public int plazasVacias() { - return this.plazasVacias; + int c = 0; + for (Plaza p : this.plazas) + if(p.plazaVacia()) c++; + return c; } /** * 1.1.8 Metodo que devuelve el numero de plazas llenas. Una plaza llena es la que: * - Se encuentran con el numero máximo de contenedores apilados en la plaza * - El contenedor o el ultimo contenedor apilado no tiene techo, lo que no se peden colocar más. - * @return plazasLlenas + * @return numero de plazas llenas */ public int plazasLlenas() { - return this.plazasLlenas; + int c = 0; + for (Plaza p: this.plazas) + if (p.plazaLlena()) c++; + return c; } /** * 1.1.8 Metodo que devuelve el numero de plazas semillenas. Las plazas semillenas son aquellas que * contienen un contenedor y se puede apilar mas encima de el (tiene techo) - * @return plazasSemillenas + * @return numero de plazas semillenas */ public int plazasSemillenas() { - return this.plazasSemillenas; + int c = 0; + for (Plaza p: this.plazas) + if (!p.plazaLlena() && !p.plazaVacia()) c++; + return c; } /** @@ -292,14 +297,9 @@ public class Muelle { throw new IllegalArgumentException("El Contenedor esta en transito, no se puede colocar"); } - Contenedor ultimo = this.plazas[plaza].ultimoContenedor(); // Verificar si hay un último contenedor y si tiene techo - boolean teniaTecho = (ultimo != null && ultimo.tieneTecho()); if (this.plazas[plaza].colocarContenedor(contenedor)) { contenedor.cambiarEstadoApilado(); - int plazasDespues = this.plazas[plaza].numeroContenedores(); - int plazasAntes = plazasDespues - 1; - this.actualizarPlazas(plazasAntes, plazasDespues, this.plazas[plaza], teniaTecho); } else { if (!this.plazas[plaza].ultimoContenedor().tieneTecho()) @@ -314,7 +314,6 @@ public class Muelle { * @throws IllegalArgumentException si el contenedor es nulo, si no se encuentra apilado en ningun sitio o * si el contenedor no se encuentra en la ultima posicion (no se podria desapilar) */ - public void sacarContenedorDePlaza(Contenedor contenedor) { if (contenedor == null) throw new IllegalArgumentException("El Ccontenedor no puede ser nulo"); if (!contenedor.estadoApilado()) throw new IllegalArgumentException("El Contenedor no esta en ninguna plaza. Se encuentra en transito o en recogida"); @@ -322,12 +321,8 @@ public class Muelle { for (Plaza plaza : this.plazas) { if (plaza.contieneContenedor(contenedor.getCodigo())) { if (plaza.estaEnUltimoNivel(contenedor.getCodigo())) { - int plazasAntes = plaza.numeroContenedores(); - boolean teniaTecho = plaza.ultimoContenedor().tieneTecho(); plaza.desapilarContenedor(); contenedor.cambiarEstadoDesapilado(); - int plazasDespues = plaza.numeroContenedores(); - this.actualizarPlazas(plazasAntes, plazasDespues, plaza, teniaTecho); } else { throw new IllegalArgumentException("El Contenedor No esta en el ultimo nivel"); @@ -337,123 +332,45 @@ public class Muelle { } /** - * Metodo que cambia el techo a un contenedor comprobando que este sea el ultimo de la plaza para evitar - * problemas, ya que no se puede cambiar el techo a un contenedor que tenga apilado otro encima - * @param contenedor Contenedor que se cambia el techo - * @throws IllegalArgumentException si el contenedero es nulo, si el contenedor no se encuentra en la ultima - * plaza (no se puede cambiar el techo) o si el contenedor no se encuentra en el muelle + * Metodo para alternar si esta operativo o no (Test) */ - public void alternarTechoContenedor(Contenedor contenedor) { - if (contenedor == null) throw new IllegalArgumentException("El contenedor no puede ser nulo"); - String codigo = contenedor.getCodigo(); - boolean encontrado = false; - for (Plaza plaza: this.plazas) { - if (plaza.contieneContenedor(codigo)) { - encontrado = true; - //Si el contenedor esta en el ultimo nivel de una plaza se puede cambiar el techo - if (plaza.estaEnUltimoNivel(codigo)) { - plaza.ultimoContenedor().alternarTecho(); - //Si la cantidad de contenedores es menor a la altura, hay cambios en el numero de plazas - if (plaza.numeroContenedores() < plaza.altura()) { - //Si ahora tiene techo, las llenas son uno mas y semillenas uno menos - if (plaza.ultimoContenedor().tieneTecho()) { - this.plazasLlenas--; - this.plazasSemillenas++; - } - //Si ahora no lo tiene, las llenas son una mas y semillenas uno menos - else { - this.plazasLlenas++; - this.plazasSemillenas--; - } - } - } - //No se encuentra en la ultima plaza - else { - throw new IllegalArgumentException("El contenedor no esta en la ultima plaza (no se puede cambiar el techo"); - } - } - } - if(!encontrado) throw new IllegalArgumentException("No se en cuentra el contenedor"); + public void alternarOperativo() { + this.estadoActual = (this.estadoActual == estado.OPERATIVO) ? estado.FUERA_DE_SERVICIO : estado.OPERATIVO; + } + + /** + * Metodo que sirve para si un codigo de contenedor es correcto + * @param codigo Codigo del contenedor que se comprueba + * @throws IllegalArgumentException si el codigo es nulo o no corresponde a un codigo correcto + */ + private void comprobarCodigoContenedor(String codigo) { + if (codigo == null) throw new IllegalArgumentException("Codigo no puede ser nulo"); + if (!codigo.matches("[A-Z]{4}\\d{7}")) throw new IllegalArgumentException("El codigo no pertenece a un codigo de contenedor"); } /** - * Metodo para alternar si esta operativo o no (Test) + * Metodo que devuelve el identificador de un muelle. Este identificador sera de 2 digitos. + * @return identificador del muelle */ - public void alternarOperativo() { - this.operativo = !this.operativo; - } + public String getIdentificador() { + return this.identificador; + } /** - * Metodo que actualiza el numero de plazas (vacias, llenas, semillenas) al añadir o eliminar un contenedor - * @param plazasAntes El numero de plazas antes de añadir o eliminar un contenedor - * @param plazasDespues El numero despues - * @param plaza La plaza donde se ha realizado una de esas 2 acciones (eliminar/añadir) + * Metodo que indica si el Muelle esta operativo o no + * @return Si esta operativo (true) o no (false) */ - private void actualizarPlazas(int plazasAntes, int plazasDespues, Plaza plaza, boolean teniaTecho) { - int alturaMaxima = plaza.altura(); - boolean esVacio = plazasDespues == 0; - boolean esPrimerContenedor = plazasDespues == 1; - boolean esPenultimoContenedor = plazasDespues == (alturaMaxima - 1); - boolean esLleno = plazasDespues == alturaMaxima; - - // Eliminación de contenedor - if (plazasDespues < plazasAntes) { - //Plaza queda vacia - if (esVacio) { - if (alturaMaxima == 1 || !teniaTecho) { - this.plazasLlenas--; - this.plazasVacias++; - } - else { - this.plazasSemillenas--; - this.plazasVacias++; - } - } - //Se queda con el penultimo contenedor - else if (esPenultimoContenedor) { - this.plazasLlenas--; - this.plazasSemillenas++; - } - - //Se elimina un contenedor que no sea ni el primero ni el ultimo - else { - //Si el contenedor eliminado tenia no techo Llenas a Semillenas - if (!teniaTecho) { - this.plazasLlenas--; - this.plazasSemillenas++; - } - } - - } - // Adición de contenedor - else { - //Si coloca el ultimo contenedor - if (esLleno) { - if (alturaMaxima == 1) { - plazasVacias--; - plazasLlenas++; - } - else { - plazasSemillenas--; - plazasLlenas++; - } - } - //Si coloca el primer contenedor - else if (esPrimerContenedor) { - if (plaza.ultimoContenedor().tieneTecho()) { - plazasVacias--; - plazasSemillenas++; - } - else { - plazasVacias--; - plazasLlenas++; - } - } - //Resto de contenedores sin ser el primero ni el ultimo - else if (!plaza.ultimoContenedor().tieneTecho()) { - plazasSemillenas--; - plazasLlenas++; - } - } - } -} \ No newline at end of file + public boolean estaOperativo() { + return this.estadoActual == estado.OPERATIVO; + } + + /** + * Metodo que devuelve el punto de coordenadas del muelle + * Este punto pertenece a la clase GPSCoordinate + * @return coordenadas del muelle; + */ + public GPSCoordinate getGPSCoordinate() { + return this.cord; + } +} + diff --git a/src/es/markse/Puerto.java b/src/es/markse/Puerto.java index 8eea05d957d5c3420f58f8092d67b51391137a9b..f90506a6be70a2044c1832150d66970460743f62 100644 --- a/src/es/markse/Puerto.java +++ b/src/es/markse/Puerto.java @@ -20,8 +20,8 @@ public class Puerto { private final String pais; private final String ciudad; private final List<Muelle> muelles = new ArrayList<>(); - private final String PAIS_REGUEX ="[A-Za-z]{2}"; - private final String CIUDAD_REGUEX ="[A-Za-z]{3}"; + private final Pattern PAIS_REGUEX = Pattern.compile("[A-Za-z]{2}"); + private final Pattern CIUDAD_REGUEX = Pattern.compile("[A-Za-z]{2}"); /** @@ -55,9 +55,7 @@ public class Puerto { * @return true si es el formto correcto o false si no lo es */ private boolean comprobarIdentifiadores(String pais, String ciudad) { - Pattern paisPattern = Pattern.compile(this.PAIS_REGUEX); - Pattern ciudadPattern = Pattern.compile(this.CIUDAD_REGUEX); - return (paisPattern.matcher(pais).matches() && ciudadPattern.matcher(ciudad).matches()) ? true: false; + return (PAIS_REGUEX.matcher(pais).matches() && CIUDAD_REGUEX.matcher(ciudad).matches()) ? true: false; } /** @@ -75,7 +73,7 @@ public class Puerto { } /** - * 1.1.2 Método que elimina un muelle del puerto. + * 1.1.2 Método que elimina un muelle del puerto. Si encuentra uno con el mismo ID, lo elimina * @param id : Identificador del muelle que se elimina * @return true si se ha eliminado el muelle y false si no se ha eliminado ninguno (n) */ @@ -85,15 +83,15 @@ public class Puerto { } /** - * Metodo para comprobar si un muelle esta en ese puerto o no, para agregarle, ya que solo puede haber un muelle con el mismo - * identificador para cada puerto. + * Metodo para comprobar si un muelle esta en ese puerto o no, para agregarle, + * ya que solo puede haber un muelle con el mismo identificador para cada puerto. * @param m obtejo Muelle * @return true si esta, y false si no se encuentra en el puerto */ public boolean comprobarMuelleEnPuerto(Muelle m) { String id = m.getIdentificador(); GPSCoordinate cord = m.getGPSCoordinate(); - //Para daca muelle comprobamos si ya esta entro de este puerto + //Para daca muelle comprobamos si hay alguno con el mismo id o las mismas coordenadas for (Muelle muelle : this.muelles) { if (id.equals(muelle.getIdentificador())|| (cord.getDistanceTo(muelle.getGPSCoordinate())==0)) { return true;