diff --git a/01-lecture/quemepongo/src/main/java/quemepongo/excepcion/usuario/UsuarioSinAccesoAGuardarropaException.java b/01-lecture/quemepongo/src/main/java/quemepongo/excepcion/usuario/UsuarioSinAccesoAGuardarropaException.java new file mode 100644 index 0000000..3c9c515 --- /dev/null +++ b/01-lecture/quemepongo/src/main/java/quemepongo/excepcion/usuario/UsuarioSinAccesoAGuardarropaException.java @@ -0,0 +1,20 @@ +package quemepongo.excepcion.usuario; + +/** + * Usuario no posee acceso al gurdarropa. + * + * @since 05.27.2021 + * @version 1.0 + */ +public class UsuarioSinAccesoAGuardarropaException extends RuntimeException { + + /** + * Lanza una excepcion. + * + * @throws RuntimeException si el usuario no posee acceso al gurdarropa. + * @since Iteracion V + */ + public UsuarioSinAccesoAGuardarropaException() { + super("El usuario no posee acceso al guardarropas"); + } +} diff --git a/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/Usuario.java b/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/Usuario.java index e6bb624..11f340e 100644 --- a/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/Usuario.java +++ b/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/Usuario.java @@ -2,7 +2,12 @@ import java.util.HashMap; import java.util.Map; +import quemepongo.excepcion.usuario.UsuarioSinAccesoAGuardarropaException; +import quemepongo.model.prenda.Prenda; import quemepongo.model.usuario.guardarropa.Guardarropa; +import quemepongo.model.usuario.guardarropa.SugerenciaAgregar; +import quemepongo.model.usuario.guardarropa.SugerenciaGuardarropa; +import quemepongo.model.usuario.guardarropa.SugerenciaQuitar; /** * Usuario de Que me Pongo. @@ -69,6 +74,54 @@ public Usuario agregarGuardarropaAjeno(Usuario usuario, String criterio) { return this; } + /** + * Sugiere aceptar una prenda + * + * @param guardarropa el guardarropas el cual sugerir. + * @param prenda la prenda sugerida + * @since Iteración V + */ + public void sugerirAgregar(Guardarropa guardarropa, Prenda prenda) { + sugerir(guardarropa, new SugerenciaAgregar(prenda)); + } + + /** + * Sugiere quitar una prenda + * + * @param guardarropa el guardarropas el cual sugerir. + * @param prenda la prenda sugerida + * @since Iteración V + */ + public void sugerirQuitar(Guardarropa guardarropa, Prenda prenda) { + sugerir(guardarropa, new SugerenciaQuitar(prenda)); + } + + /** + * Realiza una sugerencia. + * + * @param guardarropa el guardarropas el cual sugerir. + * @param prenda la prenda sugerida + * @since Iteración V + */ + private void sugerir(Guardarropa guardarropa, SugerenciaGuardarropa sugerencia) { + verificarAcceso(guardarropa); + guardarropa.recibirSugerencia(sugerencia); + } + + /** + * Valida si se puede accedes al guardarropas. + * + * @param guardarropa el guardarropas el cuial validar. + * @throws UsuarioSinAccesoAGuardarropaException si no se le compartio el guardarropa + * @since Iteración V + */ + private void verificarAcceso(Guardarropa guardarropa) { + if (!guardarropasDeOtros.values().stream() + .anyMatch(guardarropas -> guardarropas.containsValue(guardarropa))) { + throw new UsuarioSinAccesoAGuardarropaException(); + } + } + /** * De no existir entrada para el usuario, la crea. * diff --git a/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/guardarropa/Guardarropa.java b/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/guardarropa/Guardarropa.java index 6465601..8e1ead2 100644 --- a/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/guardarropa/Guardarropa.java +++ b/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/guardarropa/Guardarropa.java @@ -20,19 +20,23 @@ public class Guardarropa { * * @since Iteración V */ - Map> prendas = new HashMap>(); + private Map> prendas = new HashMap>(); /** * ModificacionesAceptadas. + * + * @since Iteración V */ - Set sugerenciasAceptadas = new LinkedHashSet(); + private Set sugerenciasAceptadas = + new LinkedHashSet(); /** * Prendas Sugeridas. * * @since Iteración V */ - Set sugerenciasPendientes = new LinkedHashSet(); + private Set sugerenciasPendientes = + new LinkedHashSet(); public Guardarropa() { @@ -43,6 +47,47 @@ public Guardarropa() { } } + public Set getSugerencias() { + return this.sugerenciasPendientes; + } + + /** + * Deshace las sugerencias aceptadas. + * + * @since Iteración V + */ + public void deshacerCambios() { + sugerenciasAceptadas.forEach( + sugerencia -> sugerencia.deshacerSugerencia(getPrendas(sugerencia.categoria()))); + sugerenciasAceptadas.clear(); + } + + /** + * Acepta un cambio sugerido. + * + * @param sugerencia el cambio sugerido. + */ + public void aceptarSugerencia(SugerenciaGuardarropa sugerencia) { + + sugerenciasPendientes.remove(sugerencia); + sugerencia.aceptarSugerencia(getPrendas(sugerencia.categoria())); + } + + public Guardarropa recibirSugerencia(SugerenciaGuardarropa sugerencia) { + sugerenciasPendientes.add(sugerencia); + return this; + } + + /** + * Obtiene las pendas de una categoria. + * + * @param categoria la categoria de la cual obtener + * @return una lista de prendas + */ + public Set getPrendas(Categoria categoria) { + return this.prendas.get(categoria); + } + /** * Agrega una prenda al guardarropas. * @@ -52,7 +97,7 @@ public Guardarropa() { */ public Guardarropa agregarPrenda(Prenda prenda) { - Set prendasDeCategoria = prendas.get(prenda.categoria()); + Set prendasDeCategoria = getPrendas(prenda.categoria()); prendasDeCategoria.add(prenda); return this; diff --git a/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/guardarropa/SugerenciaGuardarropa.java b/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/guardarropa/SugerenciaGuardarropa.java index 40db0f9..9521ea5 100644 --- a/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/guardarropa/SugerenciaGuardarropa.java +++ b/01-lecture/quemepongo/src/main/java/quemepongo/model/usuario/guardarropa/SugerenciaGuardarropa.java @@ -1,6 +1,7 @@ package quemepongo.model.usuario.guardarropa; import java.util.Set; +import quemepongo.model.prenda.Categoria; import quemepongo.model.prenda.Prenda; /** @@ -30,6 +31,10 @@ public void setCambioSugerido(Prenda cambioSugerido) { this.cambioSugerido = cambioSugerido; } + public Categoria categoria() { + return this.cambioSugerido.categoria(); + } + /** * Acepta los cambios de una sugerencia. *