package br.com.ufrj.msi2.netuno.modelo.servicos; import java.util.ArrayList; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import br.com.ufrj.msi2.netuno.modelo.entidades.AgenteCarga; import br.com.ufrj.msi2.netuno.modelo.entidades.Navio; import br.com.ufrj.msi2.netuno.modelo.entidades.Porto; @Stateless public class NavioServiceImpl implements NavioService { private static final long serialVersionUID = 260372791711386635L; @PersistenceContext EntityManager em; public EntityManager getEm() { return em; } @Override public CriteriaBuilder getCriteriaBuilder() { return this.em.getCriteriaBuilder(); } @Override public List<Navio> filtrar(CriteriaQuery<Navio> consulta) { List<Navio> list = em.createQuery(consulta).getResultList(); return list; } public void salvar(Navio navio) throws Exception { Navio filtroNavio = new Navio(); filtroNavio.setNome(navio.getNome()); List<Navio> valida = filtrar(filtroNavio); if(valida!=null && !valida.isEmpty()) throw new Exception("J� existe um navio com o mesmo nome."); try{ em.persist(navio); } catch (Exception e){ throw new Exception("Ocorreu um erro ao incluir o navio", e.getCause()); } } @Override public Navio obterPorId(Integer idNavio){ return this.em.find(Navio.class, idNavio); } @SuppressWarnings("unchecked") @Override public List<Navio> recuperaTodos() { Query query = em.createNamedQuery("Navio.recuperarTodos"); return (List<Navio>) query.getResultList(); } @Override public void alterar(Navio navio) throws Exception{ Navio filtroNavio = new Navio(); filtroNavio.setNome(navio.getNome()); List<Navio> valida = filtrar(filtroNavio); if(valida!=null && !valida.isEmpty() && !navio.getId().equals(valida.get(0).getId())) throw new Exception("J� existe um navio com o mesmo nome."); try{ em.merge(navio); } catch (Exception e){ throw new Exception("Ocorreu um erro ao alterar o navio", e.getCause()); } } @Override public void excluir(Integer idNavio) throws Exception { try{ Navio navio = this.em.find(Navio.class, idNavio); this.em.remove(navio); } catch (Exception e){ throw new Exception("Ocorreu um erro ao excluir o navio selecionado.", e.getCause()); } } @Override public List<Navio> filtrar(Navio navio) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Navio> consulta = cb.createQuery(Navio.class); Root<Navio> navioRoot = consulta.from(Navio.class); ArrayList<Predicate> predicados = new ArrayList<Predicate>(); if(navio!=null){ if(navio.getNome()!=null && !navio.getNome().equals("")){ Expression<String> nome = navioRoot.get("nome"); predicados.add(cb.like(cb.lower(nome), navio.getNome().toLowerCase()+"%")); } } consulta.select(navioRoot).where(predicados.toArray(new Predicate[]{})); consulta.orderBy(cb.asc((navioRoot.get("nome")))); return em.createQuery(consulta).getResultList(); } @SuppressWarnings("unchecked") @Override public List<Navio> recuperarNaviosAtracadosEmPorto(Porto porto) { Query query = em.createNamedQuery("Navio.recuperarNaviosAtracadosEmPorto"); query.setParameter("porto", porto); return query.getResultList(); } @SuppressWarnings("unchecked") @Override public List<Navio> recuperarNaviosPorAgenteAtracadosEmPorto(AgenteCarga agente) { Query query = em.createNamedQuery("Navio.recuperarNaviosPorAgenteAtracadosEmPorto"); query.setParameter("porto", agente.getPertence()); query.setParameter("agente", agente); return query.getResultList(); } }