cdanielpy.github.io

Mi repositorio de publicaciones personales para el resto del mundo

Follow me on GitHub

Definición de la clase que hará de base de datos en memoria para los ejercicios a desarrollar

/**
 * Clase que alojará los datos de las entidades en memoria 
 * 
 * @author Cristian Garay : <a href='cdaniel.py@gmail.com'>cdaniel.py@gmail.com</a>
 *
 */
public final class BaseDatos {

	static BaseDatos instancia;

	final Set<Alumno> mapAlumnos = new HashSet<>();
	final Set<Materia> mapMaterias = new HashSet<>();
	final Set<Aula> mapAulas = new HashSet<>();

	final AtomicLong oGeneraIDAlumnos = new AtomicLong();
	final AtomicLong oGeneraIDMaterias = new AtomicLong();
	final AtomicLong oGeneraIDAulas = new AtomicLong();

	private BaseDatos() {
		super();
	}

	public static BaseDatos getInstancia() {
		if (Objects.isNull(instancia))
			instancia = new BaseDatos();
		return instancia;
	}

	public Entidad<?> persistir(Entidad<?> entidad) throws Exception {

		// evaluamos el tipo de la instancia
		if (Alumno.class.isInstance(entidad)) {
			if (Objects.isNull(entidad.getId()))
				((Alumno) entidad).setId(oGeneraIDAlumnos.incrementAndGet());

			this.mapAlumnos.add((Alumno) entidad);

			return entidad;
		}

		if (Materia.class.isInstance(entidad)) {
			if (Objects.isNull(entidad.getId()))
				((Materia) entidad).setId(oGeneraIDMaterias.incrementAndGet());

			this.mapMaterias.add((Materia) entidad);

			return entidad;
		}

		if (Aula.class.isInstance(entidad)) {
			if (Objects.isNull(entidad.getId()))
				((Aula) entidad).setId(oGeneraIDAulas.incrementAndGet());

			this.mapAulas.add((Aula) entidad);

			return entidad;
		}

		throw new Exception("Tipo de instancia no persistible!");

	}

	public boolean remover(Entidad<?> entidad) throws Exception {

		// evaluamos el tipo de la instancia
		if (Alumno.class.isInstance(entidad))
			return this.mapAlumnos.remove((Alumno) entidad);

		if (Materia.class.isInstance(entidad))
			return this.mapMaterias.remove((Materia) entidad);

		if (Aula.class.isInstance(entidad))
			return this.mapAulas.remove((Aula) entidad);

		throw new Exception("Tipo de instancia no persistible!");

	}

	public List<?> listar(Class clase) throws Exception {

		// evaluamos la clase solicitada
		if (clase == Alumno.class)
			return this.mapAlumnos.stream().collect(Collectors.toList());

		if (clase == Materia.class)
			return this.mapMaterias.stream().collect(Collectors.toList());

		if (clase == Aula.class)
			return this.mapAulas.stream().collect(Collectors.toList());

		throw new Exception("Tipo de instancia no persistible!");

	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public List<?> listar(Class<?> clase, Predicate predicado) throws Exception {

		// evaluamos la clase solicitada
		if (clase == Alumno.class)
			return (List<?>) this.mapAlumnos.stream().filter(predicado).collect(Collectors.toList());

		if (clase == Materia.class)
			return (List<?>) this.mapMaterias.stream().filter(predicado).collect(Collectors.toList());

		if (clase == Aula.class)
			return (List<?>) this.mapAulas.stream().filter(predicado).collect(Collectors.toList());

		throw new Exception("Tipo de instancia no persistible!");

	}

}