Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 135 additions & 29 deletions src/main/java/shopManager/MyStockManager.java
Original file line number Diff line number Diff line change
@@ -1,91 +1,197 @@
package shopManager;
package shopmanager;
import com.hazelcast.core.*;

import exceptions.NoEnoughStock;
import exceptions.NotInStock;
import model.Product;
import persistency.ProductRepository;
import exceptions.UnknownRepo;
import exceptions.NotEmpty;

import com.hazelcast.config.*;

import java.util.Iterator;
import java.util.Optional;
import java.util.logging.*;
//va a seguir el patr�n singleton (Una instancia s�lo tiene un manager, pero puede haber varias instancias...)

/**
* @author Isabel Rom�n
* @author Daniel Neira
* @version 0.0.
* Primera versi�n de MyStockManager, clase que implementa StockManager usando el patr�n singleton
*
*/
public class MyStockManager implements StockManager{

private static Logger trazador=Logger.getLogger(MyStockManager.class.getName());
private static StockManager my_instance;
private HazelcastInstance hz_instance;
private static StockManager myInstance;
private HazelcastInstance hzInstance;
private Config cfg;
//Mapa de productos que ser� compartido por todos los stockManager que se instancien
private IMap<String, Product> mapProducts;
/**
* Repositorio para persistir el stock, los elementos del mismo ser�n productos
*/
private ProductRepository repository;

/**
* El constructor crea la instancia hazelcast, pero es privado, s�lo la propia clase puede crear una instancia (un objeto)
*/

private MyStockManager(){
cfg = new Config();

HazelcastInstance hz_instance = Hazelcast.newHazelcastInstance(cfg);
hzInstance = Hazelcast.newHazelcastInstance(cfg);
trazador.info("Acabo de crear una instancia hazelcast para el MyStockManager");
mapProducts = hz_instance.getMap("products");
mapProducts = hzInstance.getMap("products");
trazador.info("Se ha recuperado referencia al mapa products, si no se hab�a usado se ha creado");
}

public void setRepository(ProductRepository repo) {
repository=repo;
}
//Inicializa el stock en memoria a partir de un repositorio que persist�a los productos y que se pasa como par�metro
public void init(ProductRepository repo) throws NotEmpty{
repository=repo;
//Si el mapa est� vacio, recupera todos los productos del repositorio y los introduce en el stock (en memoria)
if (mapProducts.isEmpty()) {
Iterator<Product> products=repository.findAll().iterator();

while(products.hasNext()) {
addProduct(products.next());
}
}
//Si el mapa no est� vac�o avisa de que no se puede iniciar, porque ya tiene productos y los cambios en el stock se perder�an
else
throw new NotEmpty();
}
//Inicializa el stock en memoria a partir del repositorio configurado, si no se ha establecido el repositorio lanza una excepci�n advirti�ndolo
public void init() throws NotEmpty,UnknownRepo{
if(repository!=null) {
if (mapProducts.isEmpty()) {
Iterator<Product> products=repository.findAll().iterator();

while(products.hasNext()) {
addProduct(products.next());
}
}
else
throw new NotEmpty();
}
else
throw new UnknownRepo();

}
//Persiste los datos del stock en memoria en el repositorio, si el repositorio no estaba establecido lanza una excepci�n advirti�ndolo
public void save() throws UnknownRepo{
if (repository!=null)
repository.saveAll(mapProducts.values());
else
throw new UnknownRepo();
}

@Override
public StockManager getManager() {
return getInstance();
}

/**
* Borra los datos, pero primero intenta persistirlos en el repositorio
*/
@Override
public void clean() {

//Intentamos guardar los datos
try{
myInstance.save();
trazador.info("El repositorio es v�lido , persistimos los datos y luego limpiamos");
}
catch(UnknownRepo e) {

//Si el repositorio no fuera v�lido, lanza la excepci�n, que capturamos aqu�
trazador.info("El repositorio no es v�lido (null), no se puede persistir, a�n as�, limpiamos");
}
//Finalemente, limpiamos los datos
mapProducts.clear();
}
/**
* @deprecated
* @see
* java.lang.Object
* El compilador me avisa de que uso algo "deprecated" por eso a�ado la opci�n de compilaci�n en gradle, para ver m�s detalle
*/
@Override
@Deprecated(since="0,0")
protected void finalize() throws Throwable{
trazador.info("Finalizando el MyStockManager, borra la instancia hazelcast y deja a null la instancia singleton");
hz_instance.shutdown();
my_instance=null;
hz_instance=null;

trazador.info("Finalizando el MyStockManager, apaga la instancia hazelcast");
hzInstance.shutdown();
}

public static StockManager getInstance() {
if (my_instance==null){
my_instance=new MyStockManager();
if (myInstance==null){
myInstance=new MyStockManager();
}
return my_instance;
return myInstance;
}
@Override
public void addProduct(Product newProduct) {
Product productTmp;
trazador.info("El tama�o del mapa al entrar es " + mapProducts.size());
String msg="El tama�o del mapa al entrar es " + mapProducts.size();
trazador.info(msg);
if(mapProducts.containsKey(newProduct.getId())){
productTmp=searchProduct(newProduct.getId());
productTmp=searchProduct(newProduct.getId()).get();
newProduct.setNumber(productTmp.getNumber()+newProduct.getNumber());
}
mapProducts.put(newProduct.getId(), newProduct);
trazador.info("El mapa de tama�o " + mapProducts.size()+" incluye "+newProduct);
msg="El mapa de tama�o " + mapProducts.size()+" incluye "+newProduct;
trazador.info(msg);
}
@Override
public Product searchProduct(String id) {
public Optional<Product> searchProduct(String id) {
Product product=null;
String msg;
if(mapProducts.containsKey(id)){
product=mapProducts.get(id);
trazador.info("Hay "+ product);
msg="Hay "+ product;
trazador.info(msg);

}else {
trazador.info("El "+product+" no est� en el mapa");
msg="El "+product+" no est� en el mapa";
trazador.info(msg);
}
return product;
return Optional.ofNullable(product);
}
/**
* @see
* java.lang.Object
* @throws CloneNotSupportedException avisa de que no se ha podido clonar
* @see java.lang.Object
*
* El m�todo clone permite crear una instancia a partir de otra, lo que en una clase que siga el patr�n singleton no se puede permitir
*/
@Override
public MyStockManager clone() {
try {
throw new CloneNotSupportedException();
} catch (CloneNotSupportedException ex) {
System.out.println("No se puede clonar un objeto de la clase MyStockManager, sigue patr�n singleton");
}
return null;
public MyStockManager clone() throws CloneNotSupportedException {
trazador.warning("No se puede clonar un objeto de la clase MyStockManager, sigue patr�n singleton");
throw new CloneNotSupportedException();
}
@Override
/**
* <P>La clase Optional es un contenedor que dentro tendr� un producto o no (seg�n se haya encontrado o no en el stock), el m�todo isPresent permite saber si est� o no
* Puede consultar <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html">Optional en la api de Java</a></P>
*/
public Product lessProduct(Product product) throws NoEnoughStock,NotInStock {
Optional<Product> productTmp = searchProduct(product.getId());

if(productTmp.isPresent())
{
if(productTmp.get().getNumber()<product.getNumber()) {
throw new NoEnoughStock(productTmp.get().getNumber());
}
product.setNumber(productTmp.get().getNumber()-product.getNumber());
mapProducts.put(product.getId(), product);
}
//Si no est� deber�a lanzar la excepci�n no est� en stock
else throw new NotInStock(product.getId());
return product;
}

}
62 changes: 62 additions & 0 deletions src/test/java/shopManager/MyStockManagerTestClean.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package shopManager;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.BeforeEach;

import shopmanager.MyStockManager;
import shopmanager.StockManager;

import exceptions.NotInStock;
import model.MyProduct;
import model.Product;
import exceptions.NoEnoughStock;

/**
*
* @author Pablo Dominguez
* Test de MyStockManagerTestClean
*/
class MyStockManagerTestClean {

StockManager underTest;
String underTestAsString;

@BeforeEach
public void setup() {
MyStockManager.getInstance().clean();
}

/**
* Test para probar {@link shopmanager.MyStockManager#clean()}
*
*/
@Test
@Tag("integracion")
@DisplayName("Prueba para el m�todo que limpia el stock")
void testClean() {

//Creamos un producto tipo "id1" con 5 unidades y un producto tipo "id2" con 3 unidades
Product product1 = new MyProduct("id1",5);
Product product2 = new MyProduct("id2",3);

//Los a�ado al stock
MyStockManager.getInstance().addProduct(product1);
MyStockManager.getInstance().addProduct(product2);

//Comprobamos que los productos se han a�adidos
assertFalse(MyStockManager.getInstance().searchProduct("id1").isEmpty(),"No debe estar vac�o");
assertFalse(MyStockManager.getInstance().searchProduct("id2").isEmpty(),"No debe estar vac�o");

//Vaciamos el stock
MyStockManager.getInstance().clean();

//Comprobamos que no existe ninguno de los productos a�adidos
assertTrue(MyStockManager.getInstance().searchProduct("id1").isEmpty(),"Debe estar vac�o");
assertTrue(MyStockManager.getInstance().searchProduct("id2").isEmpty(),"Debe estar vac�o");
}

}