Java tutorial
/* * 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; } }