package br.com.dextra.dextranet.grupo; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import br.com.dextra.dextranet.persistencia.EntidadeOrdenacao; import br.com.dextra.dextranet.persistencia.EntidadeRepository; import br.com.dextra.dextranet.usuario.Usuario; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.EntityNotFoundException; import com.google.appengine.api.datastore.PreparedQuery; import com.google.appengine.api.datastore.Query; import com.google.appengine.api.datastore.Query.FilterOperator; import com.google.appengine.api.datastore.Query.FilterPredicate; import com.google.appengine.api.datastore.Query.SortDirection; public class GrupoRepository extends EntidadeRepository { MembroRepository membroRepository = new MembroRepository(); ServicoGrupoRepository servicoGrupoRepository = new ServicoGrupoRepository(); public Grupo persiste(Grupo grupo) { return super.persiste(grupo); } public Grupo obtemPorId(String id) throws EntityNotFoundException { Entity grupoEntity = this.obtemPorId(id, Grupo.class); return new Grupo(grupoEntity); } public List<Grupo> obtemPorNickProprietario(String proprietario) throws EntityNotFoundException { Query query = new Query(Grupo.class.getName()); query.setFilter(new FilterPredicate(GrupoFields.proprietario.name(), FilterOperator.EQUAL, proprietario)); PreparedQuery pquery = this.datastore.prepare(query); List<Grupo> grupos = new ArrayList<Grupo>(); Iterable<Entity> entidades = pquery.asIterable(); for (Entity entidade : entidades) { grupos.add(new Grupo(entidade)); } return grupos; } public List<Grupo> obtemPorListaId(List<String> idGrupos) throws EntityNotFoundException { List<Grupo> grupos = new ArrayList<Grupo>(); if (!idGrupos.isEmpty()) { Query query = new Query(Grupo.class.getName()); query.setFilter(new FilterPredicate(GrupoFields.id.name(), FilterOperator.IN, idGrupos)); PreparedQuery pquery = this.datastore.prepare(query); Iterable<Entity> entidades = pquery.asIterable(); for (Entity entidade : entidades) { Grupo grupo = new Grupo(entidade); List<Membro> membros = membroRepository.obtemPorIdGrupo(grupo.getId()); List<ServicoGrupo> servicoGrupos = servicoGrupoRepository.obtemPorIdGrupo(grupo.getId()); grupo.setServicoGrupos(servicoGrupos); grupo.setMembros(membros); grupos.add(grupo); } } return grupos; } public List<Grupo> obtemPorIdIntegrante(String idUsuario) throws EntityNotFoundException { List<Membro> relacoesUsuarioGrupo = membroRepository.obtemPorIdUsuario(idUsuario); List<String> idGrupos = new ArrayList<String>(); for (Membro relUsuarioGrupo : relacoesUsuarioGrupo) { idGrupos.add(relUsuarioGrupo.getIdGrupo()); } List<Grupo> grupos = obtemPorListaId(idGrupos); return grupos; } public void remove(String id) { this.remove(id, Grupo.class); } public List<Grupo> lista() { EntidadeOrdenacao ordenacaoPorNome = new EntidadeOrdenacao(GrupoFields.nome.name(), SortDirection.ASCENDING); List<Grupo> grupos = new ArrayList<Grupo>(); Iterable<Entity> entidades = super.lista(Grupo.class, ordenacaoPorNome); for (Entity entidade : entidades) { grupos.add(new Grupo(entidade)); } return grupos; } public void ajustarProprietarioGrupo(Usuario usuario) throws EntityNotFoundException { List<Grupo> grupos = obtemPorIdIntegrante(usuario.getId()); for (Grupo grupo : grupos) { if (grupo.getProprietario().equals(usuario.getUsername())) { List<Membro> membros = grupo.getMembros(); String usernamedeOutroMembro = getUsernameOutroMembro(usuario, membros); if (!StringUtils.isEmpty(usernamedeOutroMembro)) { grupo.comProprietario(usernamedeOutroMembro); persiste(grupo); } } } } private String getUsernameOutroMembro(Usuario usuario, List<Membro> membros) { for (Membro membro : membros) { String username = membro.getEmail(); if (!username.equals(usuario.getUsername())) { return username; } } return null; } }