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.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import br.com.ufrj.msi2.netuno.modelo.entidades.Atraque; import br.com.ufrj.msi2.netuno.modelo.entidades.Navio; import br.com.ufrj.msi2.netuno.modelo.entidades.Porto; @Stateless public class AtraqueServiceImpl implements AtraqueService { private static final long serialVersionUID = -4048074913764741373L; @PersistenceContext EntityManager em; @Override public Atraque obterPorId(Integer idAtraque){ if(idAtraque==null) return null; else return em.find(Atraque.class, idAtraque); } @Override public List<Atraque> obterAtraquesPorto(Integer idPorto) { Atraque atraque = new Atraque(); Porto porto = new Porto(); porto.setId(idPorto); atraque.setPorto(porto); return this.filtrar(atraque); } @Override public List<Atraque> obterAtraquesNavio(Integer idNavio) { Atraque atraque = new Atraque(); Navio navio = new Navio(); navio.setId(idNavio); atraque.setNavio(navio); return this.filtrar(atraque); } @Override public void incluir(Atraque atraque) throws Exception { try{ this.em.persist(atraque); } catch (Exception e){ throw new Exception("Ocorreu um erro ao agendar o atraque.", e.getCause()); } } @Override public void alterar(Atraque atraque) throws Exception { try{ this.em.merge(atraque); } catch (Exception e){ throw new Exception("Ocorreu um erro ao alterar o atraque.", e.getCause()); } } @Override public void excluir(Integer idAtraque) throws Exception { try{ Atraque atraque = this.obterPorId(idAtraque); em.remove(atraque); } catch(Exception e){ throw new Exception("N�o foi poss�vel excluir o atraque selecionado.", e.getCause()); } } @Override public List<Atraque> filtrar(Atraque atraque) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Atraque> consulta = cb.createQuery(Atraque.class); Root<Atraque> atraqueRoot = consulta.from(Atraque.class); ArrayList<Predicate> predicados = new ArrayList<Predicate>(); if(atraque!=null){ //Cada atributo setado em porto � um filtro e portanto � colocado numa lista de predicados if(atraque.getPorto()!=null && atraque.getPorto().getId()!=null){ predicados.add(cb.equal(atraqueRoot.get("porto"), atraque.getPorto().getId())); } if(atraque.getNavio()!=null && atraque.getNavio().getId()!=null){ predicados.add(cb.equal(atraqueRoot.get("navio"), atraque.getNavio().getId())); } } consulta.select(atraqueRoot).where(predicados.toArray(new Predicate[]{})); consulta.orderBy(cb.asc((atraqueRoot.get("data_previsao_chegada")))); return this.em.createQuery(consulta).getResultList(); } }