ec.edu.chyc.manejopersonal.controller.PersonaJpaController.java Source code

Java tutorial

Introduction

Here is the source code for ec.edu.chyc.manejopersonal.controller.PersonaJpaController.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 ec.edu.chyc.manejopersonal.controller;

import ec.edu.chyc.manejopersonal.controller.PersonaJpaController.Incluir;
import ec.edu.chyc.manejopersonal.controller.interfaces.GenericJpaController;
import ec.edu.chyc.manejopersonal.entity.Contrato;
import ec.edu.chyc.manejopersonal.entity.Firma;
import java.io.Serializable;
import ec.edu.chyc.manejopersonal.entity.Persona;
import ec.edu.chyc.manejopersonal.entity.PersonaArticulo;
import ec.edu.chyc.manejopersonal.entity.PersonaFirma;
import ec.edu.chyc.manejopersonal.entity.PersonaTitulo;
import ec.edu.chyc.manejopersonal.entity.Titulo;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Hibernate;

public class PersonaJpaController extends GenericJpaController<Persona> implements Serializable {

    public enum Incluir {
        INC_ARTICULOS(0b000001), INC_CONTRATOS(0b000010), INC_TITULOS(0b000100), INC_TESIS(0b001000), INC_PASANTIAS(
                0b010000), INC_FIRMAS(0b100000), INC_TODOS(0b111111);

        private final int mask;

        private Incluir(int mask) {
            this.mask = mask;
        }

        public int value() {
            return mask;
        }
    }

    //public Persona findPersona(Long id, boolean incluirArticulos, boolean incluirContratos, boolean incluirTitulos, boolean incluirTesis, boolean incluirPasantias, boolean incluirFirmas) {    
    public PersonaJpaController() {
        setClassRef(Persona.class);
    }

    public PersonaFirma findPersonaFirma(Long idPersona, Long idFirma) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery(
                    "select distinct pf from PersonaFirma pf where pf.persona.id=:idPersona and pf.firma.id=:idFirma");
            q.setParameter("idPersona", idPersona);
            q.setParameter("idFirma", idFirma);
            List<PersonaFirma> list = q.getResultList();
            if (list != null && list.size() > 0) {
                return list.get(0);
            }
            return null;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    private Firma findFirma(EntityManager em, String strFirma) {
        Query q = em.createQuery("select distinct f from Firma f where f.nombre=:nombre");
        q.setParameter("nombre", strFirma);
        List<Firma> list = q.getResultList();
        if (list != null && list.size() > 0) {
            return list.get(0);
        }
        return null;
    }

    public Firma findFirma(Long idFirma) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery(
                    "select distinct f from Firma f left join fetch f.personasFirmaCollection where f.id=:id");
            q.setParameter("id", idFirma);
            List<Firma> list = q.getResultList();
            if (list != null && list.size() > 0) {
                return list.get(0);
            }
            return null;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public Persona obtenerPersonaVacia() {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery(
                    "select distinct p from Persona p left join fetch p.personaFirmasCollection where p.id=1");
            List<Persona> list = q.getResultList();
            if (list != null && list.size() > 0) {
                Persona persona = list.get(0);
                Hibernate.initialize(persona.getPersonaFirmasCollection());
                return persona;
            }
            return null;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public PersonaFirma findPersonaFirma(Long idPersona, String firma) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery(
                    "select distinct pf from PersonaFirma pf where pf.persona.id=:idPersona and pf.firma.nombre=:firma");
            q.setParameter("idPersona", idPersona);
            q.setParameter("firma", firma);
            List<PersonaFirma> list = q.getResultList();
            if (list != null && list.size() > 0) {
                return list.get(0);
            }
            return null;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Persona> listPersonas() throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery(
                    "select distinct p from Persona p left join fetch p.personaFirmasCollection where p.activo is not null");
            List<Persona> list = q.getResultList();
            return list;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Persona> listTodasPersonas() throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery(
                    "select distinct p from Persona p left join fetch p.personaFirmasCollection where p.id<>1 order by p.activo desc, p.apellidos asc ");
            List<Persona> list = q.getResultList();
            return list;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Persona> listPersonasConContrato() throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery("select p from Persona p where p.contratosCollection is not empty");
            List<Persona> list = q.getResultList();
            return list;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Persona> findPersonaConFirma(List<String> firmasAutores) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery(
                    "select distinct p from Persona p join fetch p.personaFirmasCollection pf where pf.firma.nombre in :firmas order by pf.firma.nombre asc");
            q.setParameter("firmas", firmasAutores);
            List<Persona> list = q.getResultList();
            return list;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Firma> findFirmas(List<String> firmasAutores) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery(
                    "select distinct f from Firma f left join fetch f.personasFirmaCollection where f.nombre in :firmas order by f.nombre asc");
            q.setParameter("firmas", firmasAutores);
            List<Firma> list = q.getResultList();
            return list;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public Persona findPersona(Long id) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery(
                    "select p from Persona p left join fetch p.personaTitulosCollection where p.id=:id");
            q.setParameter("id", id);
            List<Persona> list = q.getResultList();
            if (list != null && !list.isEmpty()) {
                return list.get(0);
            } else {
                return null;
            }
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public Persona findPersona(Long id, int incluir) {
        //public Persona findPersona(Long id, boolean incluirArticulos, boolean incluirContratos, boolean incluirTitulos, boolean incluirTesis, boolean incluirPasantias, boolean incluirFirmas) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            //String incluir = "";
            ArrayList<String> listaFetchs = new ArrayList<>();
            /*int totalFetchs = 0;
            if (incluirContratos) {
            listaFetchs.add(" left join fetch p.contratosCollection ");
            totalFetchs++;
            }            
            if (incluirArticulos) {
            listaFetchs.add(" left join fetch p.personaArticulosCollection ");
            totalFetchs++;
            }            
            if (incluirTitulos) {
            listaFetchs.add(" left join fetch p.personaTitulosCollection ");
            totalFetchs++;
            }
            if (incluirTesis) {
            listaFetchs.add(" left join fetch p.tesisCollection ");
            totalFetchs++;                
            }
            if (incluirPasantias) {
            listaFetchs.add(" left join fetch p.tesisCollection ");
            totalFetchs++;                
            }
            if (incluirFirmas) {
            listaFetchs.add(" left join fetch p.personaFirmasCollection ");
            totalFetchs++;                
            }            
            if (listaFetchs.size() > 1) {
            incluir = listaFetchs.get(0);
            }*/

            TypedQuery<Persona> q = em.createQuery("select p from Persona p where p.id=:id", Persona.class);
            q.setParameter("id", id);
            Persona p = q.getSingleResult();

            if ((incluir & Incluir.INC_CONTRATOS.value()) != 0) {
                for (Contrato contrato : p.getContratosCollection()) {
                    Hibernate.initialize(contrato.getProyectosCollection());
                }
            }
            if ((incluir & Incluir.INC_ARTICULOS.value()) != 0) {
                //if (incluirArticulos) {
                //Hibernate.initialize(p.getPersonaArticulosCollection());
                //Hibernate.initialize(p.getPersonaArticulosCollection());
                p.getListaPersonaArticulos().clear();
                for (PersonaFirma perFirma : p.getPersonaFirmasCollection()) {
                    for (PersonaArticulo perArticulo : perFirma.getPersonasArticulosCollection()) {
                        p.getListaPersonaArticulos().add(perArticulo);
                    }
                }
            }
            if ((incluir & Incluir.INC_TITULOS.value()) != 0) {
                //if (incluirTitulos) {
                Hibernate.initialize(p.getPersonaTitulosCollection());
            }
            if ((incluir & Incluir.INC_TESIS.value()) != 0) {
                //if (incluirTesis) {
                Hibernate.initialize(p.getTesisCollection());
            }
            if ((incluir & Incluir.INC_PASANTIAS.value()) != 0) {
                //if (incluirPasantias) {
                Hibernate.initialize(p.getPasantiasCollection());
            }
            if ((incluir & Incluir.INC_FIRMAS.value()) != 0) {
                //if (incluirFirmas) {
                Hibernate.initialize(p.getPersonaFirmasCollection());
            }
            return p;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public Persona getPersona(Persona persona) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Query q = em.createQuery("select p from Persona p where p.id=:id");
            q.setParameter("id", persona.getId());
            List<Persona> list = q.getResultList();
            if (list != null && !list.isEmpty()) {
                return list.get(0);
            } else {
                return null;
            }
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void create(Persona persona/*, Contratado contratado, Tesista tesista, Pasante pasante*/)
            throws Exception {
        EntityManager em = null;

        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(persona);
            /*            
                        if (contratado != null) {
            contratado.setId(persona.getId());
            em.persist(contratado);
                        }
                        if (tesista != null) {
            tesista.setId(persona.getId());
            em.persist(tesista);
                        }
                        if (pasante != null) {
            pasante.setId(persona.getId());
            em.persist(pasante);
                        }
              */
            for (PersonaTitulo personaTitulo : persona.getPersonaTitulosCollection()) {
                personaTitulo.setPersona(persona);
                Titulo titulo = personaTitulo.getTitulo();
                if (titulo.getId() == null || titulo.getId() < 0) {
                    titulo.setId(null);
                    em.persist(titulo);
                }

                if (personaTitulo.getUniversidad().getId() == null || personaTitulo.getUniversidad().getId() < 0) {
                    personaTitulo.getUniversidad().setId(null);
                    em.persist(personaTitulo.getUniversidad());
                }

                if (personaTitulo.getId() == null || personaTitulo.getId() < 0) {
                    personaTitulo.setId(null);
                    em.persist(personaTitulo);
                }
            }
            /*for (PersonaFirma personaFirma : persona.getPersonaFirmasCollection()) {
            personaFirma.setPersona(persona);
            Firma firma = personaFirma.getFirma();                
            if (firma.getId() == null || firma.getId() < 0) {
                firma.setId(null);
                em.persist(firma);
            }
            if (personaFirma.getId() == null || personaFirma.getId() < 0) {
                personaFirma.setId(null);
                em.persist(personaFirma);
            }
            }*/
            guardarPersonaFirma(em, persona);

            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Persona persona) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();

            Persona personaAntigua = em.find(Persona.class, persona.getId());
            Hibernate.initialize(personaAntigua.getPersonaFirmasCollection());

            //quitar los personaTitulo que no existan en la nueva persona editada
            for (PersonaTitulo perTituloAntiguo : personaAntigua.getPersonaTitulosCollection()) {
                if (!persona.getPersonaTitulosCollection().contains(perTituloAntiguo)) {
                    em.remove(perTituloAntiguo);
                }
            }
            //poner en null los ids negativos para que se puedan crear
            for (PersonaTitulo perTitulo : persona.getPersonaTitulosCollection()) {
                if (perTitulo.getId() != null && perTitulo.getId() < 0) {
                    perTitulo.setId(null);
                }
                if (perTitulo.getPersona() == null) {
                    perTitulo.setPersona(persona);
                }
                Titulo titulo = perTitulo.getTitulo();
                if (titulo.getId() == null || titulo.getId() < 0) {
                    titulo.setId(null);
                    em.persist(titulo);
                }
                if (perTitulo.getUniversidad().getId() == null || perTitulo.getUniversidad().getId() < 0) {
                    perTitulo.getUniversidad().setId(null);
                    em.persist(perTitulo.getUniversidad());
                }
                em.merge(perTitulo);
            }

            for (PersonaFirma perFirmaAntiguo : personaAntigua.getPersonaFirmasCollection()) {
                //revisar las firmas que estn en el antigua persona pero ya no en el nuevo editado,
                // por lo tanto si ya no estn en el nuevo editado, hay que borrar las relaciones PersonaFirma
                // pero solo si no tiene PersonaArticulo relacionado (significara que esa firma est actualmente 
                // siendo usada en un artculo, por lo tanto no de debe borrar)
                boolean firmaEnEditado = false;

                //primero revisar si la firma que existia antes de la persona, existe en el nuevo editado
                for (PersonaFirma perFirma : persona.getPersonaFirmasCollection()) {
                    if (StringUtils.equalsIgnoreCase(perFirmaAntiguo.getFirma().getNombre(),
                            perFirma.getFirma().getNombre())) {
                        firmaEnEditado = true;
                        break;
                    }
                }
                if (!firmaEnEditado) {
                    //si es que la firma de la persona sin editar ya no existe en la persona editada, quitar la relacin PersonaFirma

                    //primero verificar que la firma no sea usada en ninguna PersonaArticulo
                    if (perFirmaAntiguo.getPersonasArticulosCollection().isEmpty()) {
                        Firma firmaBorrar = null;
                        if (perFirmaAntiguo.getFirma().getPersonasFirmaCollection().size() == 1) {
                            //si la firma a borrar esta asignada a solo una persona (que sera la persona actual, variable: persona),
                            // colocarla a la variable para borrarla
                            //Siempre las firmas van a estar asignadas al menos a una persona, caso contrario deben ser borradas
                            //Las firmas de personas desconocidas estn ligadas a una persona: la persona con id=0
                            firmaBorrar = perFirmaAntiguo.getFirma();
                        }
                        //borrar la relacin PersonaFirma
                        em.remove(perFirmaAntiguo);
                        if (firmaBorrar != null) {
                            //borrar la firma solo si estaba asignada a una sola persona
                            firmaBorrar.getPersonasFirmaCollection().clear();
                            em.remove(firmaBorrar);
                        }
                    }
                }
                /*
                if (!persona.getPersonaFirmasCollection().contains(perFirmaAntiguo)) {
                if (perFirmaAntiguo.getPersonasArticulosCollection().isEmpty()) {
                    em.remove(em);
                }
                }*/
            }
            guardarPersonaFirma(em, persona);

            em.merge(persona);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /**
     * Guarda las nuevas firmas de la persona, integrando las relaciones PersonaFirma de acuerdo a si las
     * firmas existen o no en la base de datos. 
     * NO borra las firmas que ahora no estn y antes si estaban.
     * NO deben existir firmas repetidas en la lista que se va a guardar.
     * @param em EntityManager a usar, debe estar ya dentro de un EntityManager.begin();
     * @param persona Persona del que se almacenar las firmas, NO debe tener firmas repetidas
     */
    private void guardarPersonaFirma(EntityManager em, Persona persona) {
        for (PersonaFirma perFirma : persona.getPersonaFirmasCollection()) {
            //Firma firmaExistente = findFirma(em, perFirma.getFirma().getNombre());
            PersonaFirma perFirmaExistente = findPersonaFirma(persona.getId(), perFirma.getFirma().getNombre());
            Firma firmaExistente = findFirma(em, perFirma.getFirma().getNombre());

            if (firmaExistente != null) {
                if (perFirmaExistente != null) {
                    //significa que ya existe la firma en la db y tambin ya existe una relacin entre la firma y la persona que se modifica
                    // por lo tanto no hay que realizar modificacin alguna
                    //En caso de PersonaFirma tenga campos adicionales, aqu se los debera editar, mientras tanto sigue comentado el cdigo
                    //perFirma.setId(perFirmaExistente.getId());
                    //em.merge(perfirma);
                } else {
                    //si la firma existe pero no hay relacin entre la firma y la persona, entonces significa que la persona que se est editando
                    // va a tener una firma que es usado por varias personas, por lo tanto hay que agrega una nueva PersonaFirma indicando 
                    // la relacin entre la persona que se est editanto y la firma que ya existe
                    perFirma.setId(null);
                    perFirma.setPersona(persona);
                    perFirma.setFirma(firmaExistente);
                    em.persist(perFirma);
                }
            } else {
                //si no existe la firma, se debe crear tanto la PersonaFirma como la Firma, independientemente de los ids que tengan
                perFirma.getFirma().setId(null);
                perFirma.setPersona(persona);
                em.persist(perFirma.getFirma());

                perFirma.setId(null);
                em.persist(perFirma);
            }
        }
    }

    public void destroy(Long id) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.remove(id);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

}