diff --git a/src/es/markse/Muelle.java b/src/es/markse/Muelle.java index e187462545095ebbf529b9f80f368295aec279ae..ffc5a90ecaa49ad3504315bd87e26ca9b57e7554 100644 --- a/src/es/markse/Muelle.java +++ b/src/es/markse/Muelle.java @@ -49,12 +49,16 @@ public class Muelle { } /** - * 1.1.8 Metodo que devuelve si una plaza esta llena o no + * 1.1.8 Metodo que devuelve si una plaza esta llena o no. + * - Si la cantidad de contenedores es la maxima + * - Si el ultimo contenedor no tiene techo + * - O si el contenedor es un FlatRack * @return true si la plaza esta llena o si no lo esta */ public boolean plazaLlena() { - return (this.contenedores.size() == this.altura - || (!this.contenedores.isEmpty() && !this.ultimoContenedor().tieneTecho())) ? true : false; + return (this.contenedores.size() == this.altura() + || (!this.contenedores.isEmpty() && !this.ultimoContenedor().tieneTecho()) + || this.contenedores.get(0) instanceof FlatRack) ? true : false; } /** @@ -85,18 +89,24 @@ public class Muelle { if (contenedor == null) throw new IllegalArgumentException("El contenedor no puede ser nulo"); + //Si el contenedor esta en transito if (contenedor.contenedorEnTransito()) throw new IllegalStateException("El Contenedor esta en transito, no se puede colocar"); - if(this.contenedores.size() == this.altura) + //Si la plaza esta llena + if(this.plazaLlena()) throw new IllegalStateException("La plaza está llena"); - if(!this.contenedores.isEmpty() && !this.contenedores.get(this.contenedores.size()-1).tieneTecho()) - throw new IllegalStateException("El ultimo contenedor no tiene techo"); - - if (this.contenedores.isEmpty() || (this.ultimoContenedor().tieneTecho() && this.contenedores.size() < this.altura)) { - this.contenedores.add(contenedor); - } + //Comprobamos si estan vacias o no para un tipo de contenedores + if ((contenedor instanceof FlatRack || contenedor instanceof Refrigerado) && this.plazaVacia()) { + this.contenedores.add(contenedor); + } + + else { + this.contenedores.add(contenedor); + } + + } /** @@ -300,8 +310,8 @@ public class Muelle { * @throws IllegalStateException si el muelle no esta operativo * @throws IllegalStateException si ese contenedor ya esta apilado * @throws IllegalStateException si ese contenedor esta en transito, - * @throws IllegalStateException si el contenedor donde se coloca encima no tiene techo * @throws IllegalStateException si la plaza esta llena + * @throws IllegalStateException si la plaza no esta vacia y queremos colocar un contenedor Regrigerado */ public void colocarContenedorEnPlaza(Contenedor contenedor, int plaza) { //Comprobamos si el contenedor es nulo o la plaza no pertenece al rango @@ -326,15 +336,71 @@ public class Muelle { //Verificar si la plaza esta llena Plaza p = this.plazas[plaza]; - if(p.contenedores.size() == p.altura()) - throw new IllegalStateException("La plaza está llena"); + if(p.plazaLlena()) + throw new IllegalStateException("La plaza está llena."); + + + //Contenedor FlatRack + if(contenedor instanceof FlatRack) { + this.colocarContenedorFlatRack(contenedor, plaza); + } - //Verificamos si el ultimo contenedor tiene techo - if(p.contenedores.size() > 0 && !p.ultimoContenedor().tieneTecho()) - throw new IllegalStateException("El contenedor no tiene techo"); - else{ + //Contenedor Refrigerado + else if (contenedor instanceof Refrigerado) { + //Comprobamos si la plaza esta vacia + if (!this.plazas[plaza].plazaVacia()) + throw new IllegalStateException("La plaza no esta vacÃa. No podemos colocar el contenedor Refrigerado en el suelo"); + else { + this.plazas[plaza].colocarContenedor(contenedor); + } + } + + //Contenedor Estandar + else { this.plazas[plaza].colocarContenedor(contenedor); } + + } + + /** + * Metodo para colocar un contenedor de tipo FlatRack + * @param contenedor Contenedor a colocar + * @param plaza numero de plaza a colocar + * @throws IllegalStateException Si el numero de plazas totales de este muelle es demasiado pequeño + * @throws IllegalStateException Si la plaza no esta vacia, no podemos colocar el FlatRack. + * @throws IllegalStateException Si las plazas de la izquierda y derecha estan ocupadas + */ + private void colocarContenedorFlatRack(Contenedor contenedor, int plaza) { + if(this.plazas.length < 2) + throw new IllegalStateException("El numero de plazas totales de este muelle es demasiado pequeño"); + + if (!this.plazas[plaza].plazaVacia()) + throw new IllegalStateException("La plaza no esta vacia, no podemos colocar el FlatRack"); + boolean sePuedeColocar = false; + //Comprobamos la plaza de la izquierda + if ((plaza-1) >= 0) { + //Si la plaza de la izquierda esta vacia, se coloca el contenedor + if (this.plazas[plaza-1].plazaVacia()) { + sePuedeColocar = true; + this.plazas[plaza].colocarContenedor(contenedor); + this.plazas[plaza-1].colocarContenedor(contenedor); + } + } + + //La plaza de la derecha + if((plaza+1) <= this.plazas.length && !sePuedeColocar) { + if (this.plazas[plaza+1].plazaVacia()) { + sePuedeColocar = true; + this.plazas[plaza].colocarContenedor(contenedor); + this.plazas[plaza+1].colocarContenedor(contenedor); + } + } + + //Si no se ha colocado (izquierda y derecha ocupadas) + if(!sePuedeColocar) { + throw new IllegalStateException("Las plazas de la izquierda y derecha estan ocupadas"); + } + } /** @@ -351,6 +417,7 @@ public class Muelle { throw new IllegalArgumentException("El Contenedor no puede ser nulo"); if (contenedor.contenedorEnTransito()) throw new IllegalStateException("El Contenedor se encuentra en transito"); + //Comprobar si se encuentra en funcionamiento if(!this.estaOperativo()) throw new IllegalStateException("El muelle se encuentra fuera de servicio"); @@ -359,11 +426,28 @@ public class Muelle { //Buscamos que el contenedor este en el muelle if (plazaActual(c) == -1) throw new IllegalStateException("El contenedor no se encuentra apilado en este muelle"); + //Buscamos el contenedor y desapilamos el contenedor si se encuentra en el ultimo nivel - for (Plaza plaza : this.plazas) { - if (plaza.contieneContenedor(c)) { - if (plaza.estaEnUltimoNivel(c)) - plaza.desapilarContenedor(); + for (int i = 0; i<this.plazas.length; i++) { + if (this.plazas[i].contieneContenedor(c)) { + if (this.plazas[i].estaEnUltimoNivel(c)) + //Desapilamos el contenedor + this.plazas[i].desapilarContenedor(); + + //Comparamos si es un FlatRack (Desapilarlo por completo) + if (contenedor instanceof FlatRack) { + boolean desapilado = false; + if (i-1>=0) { + if(this.plazas[i].ultimoContenedor().getCodigo().equals(this.plazas[i-1].ultimoContenedor().getCodigo())) { + this.plazas[i-1].desapilarContenedor(); + desapilado = true; + } + } + if (!desapilado) { + this.plazas[i+1].desapilarContenedor(); + } + + } else throw new IllegalStateException("El Contenedor no esta en el ultimo nivel, no se puede desapilar"); }