com.r3bl.dao.UsuarioDaoImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.r3bl.dao.UsuarioDaoImpl.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 com.r3bl.dao;

import com.r3bl.model.Medico;
import com.r3bl.model.Paciente;
import com.r3bl.model.Triagem;
import com.r3bl.model.UserInfo;
import com.r3bl.model.Usuario;
import com.r3bl.util.EmailUtil;
import com.r3bl.util.SecurityUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Rafael Soares Pinto <rafaelsp.93@gmail.com>
 */
public class UsuarioDaoImpl implements UsuarioDao {

    private static final Logger logger = LoggerFactory.getLogger(UsuarioDaoImpl.class);

    private SessionFactory sessionFactory;

    private SecurityUtils sec = new SecurityUtils();

    private EmailUtil mail = new EmailUtil();

    public void setSessionFactory(SessionFactory sf) {
        this.sessionFactory = sf;
    }

    @Override
    public void addUsuario(Usuario u, String identificacao, String hospital) {
        try {
            Session session = this.sessionFactory.getCurrentSession();

            // Salva nome do usurio pois ser diferente dependendo do tipo
            u.setAlias(u.getNome());

            // Encripta a senha
            String senhaEncriptada = sec.createHash(u.getSenha());
            u.setSenha(senhaEncriptada);
            u.setNome(identificacao);

            session.persist(u);

            if (u.getTipo().toUpperCase().equals("MEDICO")) {
                Medico m = new Medico();
                m.setNome(u.getAlias());
                m.setCrm(identificacao);
                m.setHospital(hospital);
                m.setUsuario(u);
                session.persist(m);
            } else if (u.getTipo().toUpperCase().equals("TRIAGEM")) {
                Triagem t = new Triagem();
                t.setNome(u.getAlias());
                t.setMatricula(identificacao);
                t.setHospital(hospital);
                t.setUsuario(u);
                session.persist(t);
            }

            logger.info("Usurio salvo com sucesso, Detalhes=" + u);
        } catch (Exception ex) {
            java.util.logging.Logger.getLogger(UsuarioDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void updateUsuario(String alias, String identificacao, String hospital, int id) {
        Session session = this.sessionFactory.getCurrentSession();
        Usuario u = getUsuarioById(id);
        boolean editar = verificarIdentificacaoEmOutroUsuario(u, identificacao);

        if (editar) {
            persistUsuario(u, alias, identificacao, session);
            if (u.getTipo().toUpperCase().equals("MEDICO")) {
                persistMedico(u, alias, identificacao, hospital, session);
            } else if (u.getTipo().toUpperCase().equals("TRIAGEM")) {
                persistTriagem(u, alias, identificacao, hospital, session);
            }
        }
        logger.info("Usurio atualizado com sucesso, Detalhes=" + u);
    }

    @Override
    public boolean updateUsuario(String alias, String cpf, String email, int idade, int id) {
        Session session = this.sessionFactory.getCurrentSession();

        Usuario u = getUsuarioById(id);

        boolean editar = verificarIdentificacaoEmOutroUsuario(u, cpf);
        if (editar) {
            persistUsuario(u, alias, cpf, session);

            persistPaciente(u, alias, cpf, email, idade, session);
            logger.info("Usurio atualizado com sucesso, Detalhes=" + u);
            return true;
        } else {
            logger.info(
                    "Usurio no foi inserido pois j existe um outro usurio com o mesmo CPF na base, Detalhes="
                            + u);
            return false;
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<UserInfo> listUsuarios() {
        Session session = this.sessionFactory.getCurrentSession();

        String sql = "select new com.r3bl.model.UserInfo(u.id_usuario as id, \n" + "       case u.tipo \n"
                + "      WHEN 'MEDICO' then m.nome \n" + "      when 'ADM' then u.nome end as nome,\n"
                + "      case u.tipo \n" + "      when 'MEDICO' then m.crm \n"
                + "      when 'ADM' then '---'end as identificacao,\n" + "      u.tipo as tipo)\n"
                + "from medico m join m.usuario u";

        String sql2 = "select new com.r3bl.model.UserInfo(u.id_usuario as id, \n" + "       case u.tipo \n"
                + "      WHEN 'PACIENTE' then p.nome \n" + "      when 'ADM' then u.nome end as nome,\n"
                + "      case u.tipo \n" + "      when 'PACIENTE' then p.cpf \n"
                + "      when 'ADM' then '---'end as identificacao,\n" + "      u.tipo as tipo)\n"
                + "from paciente p join p.usuario u";

        String sql3 = "select new com.r3bl.model.UserInfo(u.id_usuario as id, \n" + "       case u.tipo \n"
                + "      WHEN 'TRIAGEM' then t.nome \n" + "      when 'ADM' then u.nome end as nome,\n"
                + "      case u.tipo \n" + "      when 'TRIAGEM' then t.matricula \n"
                + "      when 'ADM' then '---'end as identificacao,\n" + "      u.tipo as tipo)\n"
                + "from triagem t join t.usuario u";

        Query query = session.createQuery(sql);
        Query query2 = session.createQuery(sql2);
        Query query3 = session.createQuery(sql3);
        List<UserInfo> usuarioList = query.list();
        usuarioList.addAll(query2.list());
        usuarioList.addAll(query3.list());

        return usuarioList;
    }

    @Override
    public List<UserInfo> listTriagem() {
        Session session = this.sessionFactory.getCurrentSession();

        String sql = "select new com.r3bl.model.UserInfo(u.id_usuario as id, \n" + "        t.nome as nome, \n"
                + "      t.matricula as identificacao,\n" + "      u.tipo as tipo)\n"
                + "from triagem t join t.usuario u where u.tipo = 'TRIAGEM'";

        Query query = session.createQuery(sql);
        List<UserInfo> triagemList = query.list();
        return triagemList;
    }

    @Override
    public List<UserInfo> listMedico() {
        Session session = this.sessionFactory.getCurrentSession();

        String sql = "select new com.r3bl.model.UserInfo(u.id_usuario as id, \n" + "        m.nome as nome, \n"
                + "      m.crm as identificacao,\n" + "      u.tipo as tipo)\n"
                + "from medico m join m.usuario u where u.tipo = 'MEDICO'";

        Query query = session.createQuery(sql);
        List<UserInfo> medicoList = query.list();
        return medicoList;
    }

    @Override
    public List<UserInfo> listPaciente() {
        Session session = this.sessionFactory.getCurrentSession();

        String sql = "select new com.r3bl.model.UserInfo(u.id_usuario as id, \n" + "        p.nome as nome, \n"
                + "      p.cpf as identificacao,\n" + "      u.tipo as tipo)\n"
                + "from paciente p join p.usuario u where u.tipo = 'PACIENTE'";

        Query query = session.createQuery(sql);
        List<UserInfo> pacienteList = query.list();
        return pacienteList;
    }

    @SuppressWarnings("unchecked")
    @Override
    public Usuario getUsuarioById(int id) {
        Session session = this.sessionFactory.getCurrentSession();
        String sqlUsuario = "from usuario u where u.id = :id";
        Query query = session.createQuery(sqlUsuario);
        query.setParameter("id", id);
        Usuario u = (Usuario) query.uniqueResult();
        logger.info("Usurio encontrado, Detalhes=" + u);
        return u;
    }

    @Override
    public Usuario getUsuarioByName(String name) {
        Session session = this.sessionFactory.getCurrentSession();
        Query query = session.createQuery("from usuario where nome= :name");
        query.setParameter("name", name);
        Usuario u = (Usuario) query.uniqueResult();
        return u;
    }

    @Override
    public void removeUsuario(int id) {
        Session session = this.sessionFactory.getCurrentSession();
        Usuario u = (Usuario) session.load(Usuario.class, new Integer(id));
        String tipo = u.getTipo();
        if (null != u) {
            session.delete(u);
            if (tipo.toUpperCase().equals("MEDICO")) {
                Query query = session.createQuery("delete medico m where m.usuario = :usuario");
                query.setParameter("usuario", u);
                int b = query.executeUpdate();

                if (b > 0) {
                    System.out.println("Deletado da tabela medico");
                }
            } else if (tipo.toUpperCase().equals("TRIAGEM")) {
                Query query = session.createQuery("delete triagem t where t.usuario = :usuario");
                query.setParameter("usuario", u);
                int b = query.executeUpdate();

                if (b > 0) {
                    System.out.println("Deletado da tabela triagem");
                }
            }
        }
        logger.info("Usurio deletado com sucesso, Detalhes=" + u);
    }

    @Override
    public boolean userExists(String nome, String senha) {
        Session session = this.sessionFactory.getCurrentSession();
        Query query = session.createQuery("from usuario where nome = :nome and senha = :senha");
        query.setParameter("nome", nome);
        query.setParameter("senha", senha);
        if (query.uniqueResult() == null) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public List<UserInfo> listByName(String name) {
        Session session = this.sessionFactory.getCurrentSession();

        String sql = "select new com.r3bl.model.UserInfo(u.id_usuario as id, \n" + "       case u.tipo \n"
                + "      WHEN 'MEDICO' then m.nome \n" + "      when 'ADM' then u.nome end as nome,\n"
                + "      case u.tipo \n" + "      when 'MEDICO' then m.crm \n"
                + "      when 'ADM' then '---'end as identificacao,\n" + "      u.tipo as tipo)\n"
                + "from medico m join m.usuario u where m.nome like :nome";

        String sql2 = "select new com.r3bl.model.UserInfo(u.id_usuario as id, \n" + "       case u.tipo \n"
                + "      WHEN 'PACIENTE' then p.nome \n" + "      when 'ADM' then u.nome end as nome,\n"
                + "      case u.tipo \n" + "      when 'PACIENTE' then p.cpf \n"
                + "      when 'ADM' then '---'end as identificacao,\n" + "      u.tipo as tipo)\n"
                + "from paciente p join p.usuario u where p.nome like :nome";

        String sql3 = "select new com.r3bl.model.UserInfo(u.id_usuario as id, \n" + "       case u.tipo \n"
                + "      WHEN 'TRIAGEM' then t.nome \n" + "      when 'ADM' then u.nome end as nome,\n"
                + "      case u.tipo \n" + "      when 'TRIAGEM' then t.matricula \n"
                + "      when 'ADM' then '---'end as identificacao,\n" + "      u.tipo as tipo)\n"
                + "from triagem t join t.usuario u where t.nome like :nome";

        Query query = session.createQuery(sql);
        query.setParameter("nome", "%" + name + "%");
        Query query2 = session.createQuery(sql2);
        query2.setParameter("nome", "%" + name + "%");
        Query query3 = session.createQuery(sql3);
        query3.setParameter("nome", "%" + name + "%");
        List<UserInfo> list = query.list();
        list.addAll(query2.list());
        list.addAll(query3.list());
        return list;

    }

    @Override
    public void addPaciente(Usuario u, String email, String cpf, String ts, int idade) {
        try {
            Session session = this.sessionFactory.getCurrentSession();

            // Gera uma senha aleatoria
            String senhaAleatoria = sec.randomPassword();
            u.setSenha(senhaAleatoria);
            // Salva o nome pois para o login ser usado o cpf
            u.setAlias(u.getNome());

            //Envia e-mail com a senha em claro
            mail.generateAndSendEmail(email, u.getAlias(), cpf, senhaAleatoria);
            // Encripta a senha
            String senhaEncriptada = sec.createHash(u.getSenha());
            System.out.println(senhaEncriptada);
            u.setSenha(senhaEncriptada);

            u.setNome(cpf);

            // Persiste usuario na base
            session.persist(u);

            // Cria paciente para persistir na tabela de dados
            Paciente p = new Paciente();
            p.setNome(u.getAlias());
            p.setUsuario(u);
            p.setEmail(email);
            p.setCpf(cpf);
            p.setIdade(idade);
            p.setTs(ts);

            //Persiste paciente na base
            session.persist(p);

            logger.info("Usurio salvo com sucesso, Detalhes=" + u);
        } catch (Exception ex) {
            java.util.logging.Logger.getLogger(UsuarioDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public Medico getMedico(Usuario u) {
        Session session = this.sessionFactory.getCurrentSession();
        String sql = "from medico m where m.usuario.id_usuario = :id";
        Query query = session.createQuery(sql);
        query.setParameter("id", u.getId_usuario());
        Medico m = (Medico) query.uniqueResult();

        return m;
    }

    @Override
    public Triagem getTriagem(Usuario u) {
        Session session = this.sessionFactory.getCurrentSession();
        String sql = "from triagem t where t.usuario.id_usuario = :id";
        Query query = session.createQuery(sql);
        query.setParameter("id", u.getId_usuario());
        Triagem t = (Triagem) query.uniqueResult();

        return t;
    }

    @Override
    public Paciente getPaciente(Usuario u) {
        Session session = this.sessionFactory.getCurrentSession();
        String sql = "from paciente p where p.usuario.id_usuario = :id";
        Query query = session.createQuery(sql);
        query.setParameter("id", u.getId_usuario());
        Paciente p = (Paciente) query.uniqueResult();

        return p;
    }

    // METODOS AUXILIARES
    private void persistTriagem(Usuario u, String alias, String identificacao, String hospital, Session session) {
        Triagem triagem = getTriagem(u);
        triagem.setNome(alias);
        triagem.setMatricula(identificacao);
        triagem.setHospital(hospital);
        session.update(triagem);
    }

    private void persistMedico(Usuario u, String alias, String identificacao, String hospital, Session session) {
        Medico medico = getMedico(u);
        medico.setNome(alias);
        medico.setCrm(identificacao);
        medico.setHospital(hospital);
        session.update(medico);
    }

    private void persistUsuario(Usuario u, String alias, String identificacao, Session session) {
        u.setAlias(alias);
        u.setNome(identificacao);
        session.update(u);
    }

    private void persistPaciente(Usuario u, String alias, String cpf, String email, int idade, Session session) {
        Paciente paciente = getPaciente(u);
        paciente.setNome(alias);
        paciente.setCpf(cpf);
        paciente.setEmail(email);
        paciente.setIdade(idade);
        session.update(paciente);
    }

    private boolean verificarIdentificacaoEmOutroUsuario(Usuario u, String identificacao) {
        boolean editar = true;
        List<UserInfo> listUsuario = new ArrayList<UserInfo>();
        if (u.getTipo().equals("MEDICO")) {
            listUsuario = listMedico();
        } else if (u.getTipo().equals("TRIAGEM")) {
            listUsuario = listTriagem();
        } else if (u.getTipo().equals("PACIENTE")) {
            listUsuario = listPaciente();
        }
        for (UserInfo uInfo : listUsuario) {
            if (uInfo.getIdentificacao().equalsIgnoreCase(identificacao)
                    && !uInfo.getIdentificacao().equalsIgnoreCase(u.getNome())) {
                editar = false;
            }
        }
        return editar;
    }
}