tad.grupo7.ccamistadeslargas.DAO.EventoDAO.java Source code

Java tutorial

Introduction

Here is the source code for tad.grupo7.ccamistadeslargas.DAO.EventoDAO.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package tad.grupo7.ccamistadeslargas.DAO;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.bson.types.ObjectId;
import tad.grupo7.ccamistadeslargas.modelo.Evento;
import tad.grupo7.ccamistadeslargas.modelo.Gasto;
import tad.grupo7.ccamistadeslargas.modelo.Participante;
import tad.grupo7.ccamistadeslargas.modelo.ResumenPagoPorPersona;
import tad.grupo7.ccamistadeslargas.modelo.ResumenPlusvalia;
import tad.grupo7.ccamistadeslargas.modelo.Tupla;
import tad.grupo7.ccamistadeslargas.modelo.Usuario;

/**
 *
 * @author cayetano
 */
public class EventoDAO {

    private static DB dataBase = new MongoClient("localhost", 27017).getDB("CC");
    private static DBCollection eventos = dataBase.getCollection("Evento");

    /**
     * Crea un evento en la BD.
     *
     * @param nombre String nombre del evento.
     * @param divisa String divisa.
     * @param creador Usuario creador.
     */
    public static void create(String nombre, String divisa, Usuario creador) {
        BasicDBObject document = new BasicDBObject();
        document.append("nombre", nombre);
        document.append("divisa", divisa);
        document.append("idCreador", creador.getId());
        eventos.insert(document);
        ObjectId o = ParticipanteDAO.readDBObject(creador.getAmigos().get(0).getId()).getObjectId("_id");
        addParticipante(readDBObject(nombre, creador.getId()).getObjectId("_id"), o);
    }

    /**
     * Aade un participante al evento
     *
     * @param idEvento ObjectId del evento.
     * @param idParticipante ObjectId del participante.
     */
    public static void addParticipante(ObjectId idEvento, ObjectId idParticipante) {
        BasicDBList participantes = null;
        BasicDBObject participante = ParticipanteDAO.readDBObject(idParticipante);
        participantes = (BasicDBList) readDBObject(idEvento).get("participantes");
        if (participantes == null) { //Si es la primera vez
            participantes = new BasicDBList();
        }
        participantes.add(participante);
        BasicDBObject newEvento = new BasicDBObject();
        newEvento.append("$set", new BasicDBObject().append("participantes", participantes));
        BasicDBObject oldEvento = new BasicDBObject().append("_id", idEvento);
        eventos.update(oldEvento, newEvento);
    }

    /**
     * Devuelve un Evento que coincida con un ID.
     *
     * @param id ObjectId del evento.
     * @return Evento
     */
    public static Evento read(ObjectId id) {
        BasicDBObject whereQuery = new BasicDBObject();
        whereQuery.put("_id", id);
        BasicDBObject document = (BasicDBObject) eventos.findOne(whereQuery);
        String nombre = document.getString("nombre");
        String divisa = document.getString("divisa");
        ObjectId idCreador = document.getObjectId("idCreador");
        Evento e = new Evento(id, nombre, divisa, idCreador, ParticipanteDAO.readAllFromEvento(id));
        return e;
    }

    /**
     * Actualiza un evento en la BD.
     *
     * @param id ObjectId del evento a actualizar.
     * @param nombre String nuevo nombre del evento.
     * @param divisa String nueva divisa del evento.
     */
    public static void update(ObjectId id, String nombre, String divisa) {
        BasicDBObject newEvento = new BasicDBObject();
        BasicDBObject atributos = new BasicDBObject();
        atributos.append("nombre", nombre);
        atributos.append("divisa", divisa);
        newEvento.append("$set", atributos);
        BasicDBObject oldEvento = new BasicDBObject().append("_id", id);
        eventos.update(oldEvento, newEvento);
    }

    /**
     * Devuelve un listado con todos los eventos del usuario.
     *
     * @param idUsuario ObjectId del usuario.
     * @return List
     */
    public static List<Evento> readAll(ObjectId idUsuario) {
        BasicDBObject whereQuery = new BasicDBObject();
        whereQuery.put("idCreador", idUsuario);
        DBCursor cursor = eventos.find(whereQuery);
        List<Evento> eventos = new ArrayList<>();
        while (cursor.hasNext()) {
            BasicDBObject e = (BasicDBObject) cursor.next();
            eventos.add(new Evento(e.getObjectId("_id"), e.getString("nombre"), e.getString("divisa"),
                    e.getObjectId("idCreador"), ParticipanteDAO.readAllFromEvento(e.getObjectId("_id"))));
        }
        return eventos;
    }

    /**
     * Elimina de la BD un evento.
     *
     * @param id ObjectId del evento a eliminar.
     */
    public static void delete(ObjectId id) {
        eventos.remove(new BasicDBObject().append("_id", id));
    }

    /**
     * Devuelve un BasicDBObject de la BD.
     *
     * @param id ObjectId del evento a devolver.
     * @return BasicDBObject
     */
    public static BasicDBObject readDBObject(ObjectId id) {
        BasicDBObject whereQuery = new BasicDBObject();
        whereQuery.put("_id", id);
        return (BasicDBObject) eventos.findOne(whereQuery);
    }

    /**
     * Devuelve un BasicDBObject de la BD.
     *
     * @param nombre String nombre del evento.
     * @param idCreador ObjectId del creador del evento.
     * @return BasicDBObject
     */
    public static BasicDBObject readDBObject(String nombre, ObjectId idCreador) {
        BasicDBObject andQuery = new BasicDBObject();
        List<BasicDBObject> obj = new ArrayList<BasicDBObject>();
        obj.add(new BasicDBObject("nombre", nombre));
        obj.add(new BasicDBObject("idCreador", idCreador));
        andQuery.put("$and", obj);
        return (BasicDBObject) eventos.findOne(andQuery);
    }

    /**
     * Indica si el participante es deudor del pago
     * 
     * @param nombre String nombre del participante
     * @param deudores List lista de deudores de un pago
     * @return Boolean
     */
    private static Boolean esDeudor(String nombre, List<Participante> deudores) {
        for (Participante d : deudores) {
            if (nombre.equals(d.getNombre())) {
                return true;
            }
        }
        return false;
    }

    /**
     * Obtiene un listado que se mostrar en forma de tabla acerca de las deudas de los participantes.
     * 
     * @param e Evento
     * @return List
     */
    public static List<ResumenPlusvalia> getResumenPlusvalia(Evento e) {
        Double plusvalia = 0.0;
        int hePagado = 0, heParticipado = 0;
        List<ResumenPlusvalia> resumen = new ArrayList<>();
        List<Gasto> gastos = GastoDAO.readAll(e.getId());
        List<Participante> participantes = ParticipanteDAO.readAllFromEvento(e.getId());
        List<Tupla> positivo = new ArrayList<>();
        List<Tupla> negativo = new ArrayList<>();
        for (Participante p : participantes) {
            for (Gasto g : gastos) {
                if (g.getIdPagador().equals(p.getId()) && esDeudor(p.getNombre(), g.getDeudores())) { //pertenezco a los dos
                    plusvalia += g.getPrecio() - (g.getPrecio() / g.getDeudores().size());
                    hePagado++;
                    heParticipado++;
                } else if ((g.getIdPagador().equals(p.getId()) && !esDeudor(p.getNombre(), g.getDeudores()))) { //he pagado pero no participo
                    plusvalia += g.getPrecio();
                    hePagado++;
                } else if ((!g.getIdPagador().equals(p.getId()) && esDeudor(p.getNombre(), g.getDeudores()))) { //no he pagado y participo
                    plusvalia -= (g.getPrecio() / g.getDeudores().size());
                    heParticipado++;
                }
            }
            if (plusvalia > 0) {

                positivo.add(new Tupla(Math.floor(plusvalia * 100) / 100, p.getNombre()));
            } else if (plusvalia < 0) {
                negativo.add(new Tupla(Math.floor(plusvalia * 100) / 100, p.getNombre()));
            }

            resumen.add(new ResumenPlusvalia(p.getNombre(), "", "", hePagado, heParticipado));
            plusvalia = 0.0;
            hePagado = 0;
            heParticipado = 0;
        }
        Iterator<Tupla> itPos = positivo.iterator();
        Iterator<Tupla> itNeg = negativo.iterator();

        Tupla pos = null;
        Tupla neg = null;
        int flag = 0; //0: aumentar los dos, 1: aumentar Pos, 2: aumentar Neg
        int posicion;
        ResumenPlusvalia persona;
        while (itPos.hasNext() || itNeg.hasNext()) {
            switch (flag) {
            case 0:
                pos = itPos.next();
                neg = itNeg.next();
                break;
            case 1:
                pos = itPos.next();
                break;
            case 2:
                neg = itNeg.next();
                break;
            }
            if (pos.getX() > Math.abs(neg.getX())) {
                posicion = estaIncluida(pos.getY(), resumen);

                persona = resumen.get(posicion);
                persona.setDebeRecibir(persona.getDebeRecibir() + " " + neg.getY() + " " + Math.abs(neg.getX())
                        + " " + e.getDivisa());
                resumen.set(posicion, persona);

                posicion = estaIncluida(neg.getY(), resumen);

                persona = resumen.get(posicion);
                persona.setDebePoner(persona.getDebePoner() + " " + pos.getY() + " " + Math.abs(neg.getX()) + " "
                        + e.getDivisa());
                resumen.set(posicion, persona);

                flag = 2;
                pos.setX(Math.floor((pos.getX() + neg.getX()) * 100) / 100);
            } else if (pos.getX() == Math.abs(neg.getX())) {
                posicion = estaIncluida(pos.getY(), resumen);

                persona = resumen.get(posicion);
                persona.setDebeRecibir(
                        persona.getDebeRecibir() + " " + neg.getY() + " " + pos.getX() + " " + e.getDivisa());
                resumen.set(posicion, persona);

                posicion = estaIncluida(neg.getY(), resumen);

                persona = resumen.get(posicion);
                persona.setDebePoner(
                        persona.getDebePoner() + " " + pos.getY() + " " + pos.getX() + " " + e.getDivisa());
                resumen.set(posicion, persona);

                flag = 0;
                pos.setX(Math.floor((pos.getX() + neg.getX()) * 100) / 100);
                neg.setX(Math.floor((pos.getX() + neg.getX()) * 100) / 100);
            } else {
                posicion = estaIncluida(pos.getY(), resumen);

                persona = resumen.get(posicion);
                persona.setDebeRecibir(
                        persona.getDebeRecibir() + " " + neg.getY() + " " + pos.getX() + " " + e.getDivisa());
                resumen.set(posicion, persona);

                posicion = estaIncluida(neg.getY(), resumen);
                persona = resumen.get(posicion);
                persona.setDebePoner(
                        persona.getDebePoner() + " " + pos.getY() + " " + pos.getX() + " " + e.getDivisa());
                resumen.set(posicion, persona);

                flag = 1;
                neg.setX(Math.floor((pos.getX() + neg.getX()) * 100) / 100);
            }
        }

        return resumen;
    }

    /**
     * Indica en qu posicin est el participante en la lista resumen.
     * Si no se encuentra, devuelve -1.
     * 
     * @param nombre String nombre de la persona
     * @param resumen List
     * @return Int
     */
    private static int estaIncluida(String nombre, List<ResumenPlusvalia> resumen) {
        Iterator<ResumenPlusvalia> it = resumen.iterator();
        ResumenPlusvalia resu;
        int i = 0;
        while (it.hasNext()) {
            resu = it.next();
            if (resu.getNombreParticipante().equals(nombre)) {
                return i;
            }
            i++;
        }
        return -1;
    }

    /**
     * Mtodo que devuelve un listado que se presentar en forma de tabla del resumen gasto a gasto por persona.
     * @param e Evento
     * @param p Participante
     * @return List
     */
    public static List<ResumenPagoPorPersona> getResumenGastosPorPersona(Evento e, Participante p) {
        List<ResumenPagoPorPersona> resumen = new ArrayList<>();
        List<String> haPagado = new ArrayList<>();
        List<String> haGastado = new ArrayList<>();
        Gasto g;
        ResumenPagoPorPersona rppp;

        List<Gasto> gastos = GastoDAO.readAll(e.getId());
        Iterator<Gasto> it = gastos.iterator();
        while (it.hasNext()) {
            g = it.next();
            if (p.getId().equals(g.getIdPagador())) {
                haPagado.add(g.getPrecio() + " EUR - " + g.getNombre());
            } else if (esDeudor(p.getNombre(), g.getDeudores())) {
                haGastado.add(
                        Math.floor(g.getPrecio() / g.getDeudores().size() * 100) / 100 + " EUR - " + g.getNombre());
            }
        }

        Iterator<String> it2 = haPagado.iterator();
        Iterator<String> it3 = haGastado.iterator();

        while (it2.hasNext() || it3.hasNext()) {
            if (it2.hasNext() && it3.hasNext()) {
                rppp = new ResumenPagoPorPersona(it2.next(), it3.next());
                resumen.add(rppp);
            } else if (it2.hasNext()) {
                rppp = new ResumenPagoPorPersona(it2.next(), "");
                resumen.add(rppp);
            } else {
                rppp = new ResumenPagoPorPersona("", it3.next());
                resumen.add(rppp);
            }

        }
        return resumen;
    }

    /**
     * Indica si el amigo es participante de un evento.
     * 
     * @param evento Evento
     * @param participante Participante
     * @return Boolean
     */
    public static boolean esParticipante(Evento evento, Participante participante) {
        for (Participante p : evento.getParticipantes()) {
            if (p.getNombre().equals(participante.getNombre())) {
                return true;
            }
        }
        return false;
    }

    /**
     * Lee todos los eventos de la BD
     * @return List
     */
    public static List<Evento> readAll() {
        DBCursor cursor = eventos.find();
        List<Evento> eventos = new ArrayList<>();
        while (cursor.hasNext()) {
            BasicDBObject e = (BasicDBObject) cursor.next();
            eventos.add(new Evento(e.getObjectId("_id"), e.getString("nombre"), e.getString("divisa"),
                    e.getObjectId("idCreador"), ParticipanteDAO.readAllFromEvento(e.getObjectId("_id"))));
        }
        return eventos;
    }

}