Skip to content
Snippets Groups Projects
Commit 02e889ae authored by Javier Calvo's avatar Javier Calvo
Browse files

Muelle casi arreglado. Falta mejoras

parent c2b08cc8
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
}
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment