package br.com.dextra.dextranet.usuario; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import br.com.dextra.dextranet.grupo.Grupo; import br.com.dextra.dextranet.grupo.GrupoJSON; import br.com.dextra.dextranet.grupo.GrupoRepository; import br.com.dextra.dextranet.grupo.Membro; import br.com.dextra.dextranet.grupo.MembroRepository; import br.com.dextra.dextranet.persistencia.EntidadeNaoEncontradaException; import br.com.dextra.dextranet.persistencia.EntidadeOrdenacao; import br.com.dextra.dextranet.persistencia.EntidadeRepository; import br.com.dextra.dextranet.persistencia.adapter.ParametrosAdapter; import br.com.dextra.dextranet.seguranca.AutenticacaoService; 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 UsuarioRepository extends EntidadeRepository { GrupoRepository repositorio = new GrupoRepository(); MembroRepository repositorioMembro = new MembroRepository(); public Usuario persiste(Usuario usuario) { return super.persiste(usuario); } public Usuario obtemPorId(String id) throws EntityNotFoundException { Entity usuarioEntity = this.obtemPorId(id, Usuario.class); return new Usuario(usuarioEntity); } public void remove(String id) { this.remove(id, Usuario.class); } public List<Usuario> listaPor(Boolean isInfra) throws EntityNotFoundException { List<Usuario> usuarios = new ArrayList<Usuario>(); EntidadeOrdenacao ordenacao = new EntidadeOrdenacao(UsuarioFields.username.name(), SortDirection.ASCENDING); EntidadeOrdenacao[] ordenacoes = { ordenacao }; ParametrosAdapter<Usuario> parametros = new ParametrosAdapter<Usuario>(); parametros.comEntidade(Usuario.class); parametros.comOrdenacao(ordenacoes); if (!isInfra) { List<String> campos = new ArrayList<String>(); campos.add(UsuarioFields.ativo.name()); parametros.comCampos(campos); List<Object> valores = new ArrayList<Object>(); valores.add(true); parametros.comValores(valores); } Iterable<Entity> entidades = super.lista(parametros); for (Entity entidade : entidades) { Usuario usuario = getUsuario(entidade); if (usuario.isAtivo() == null) { usuario.setAtivo(Boolean.TRUE); } usuarios.add(usuario); } return usuarios; } public List<Usuario> lista() throws EntityNotFoundException { EntidadeOrdenacao ordenacaoPorUsername = new EntidadeOrdenacao(UsuarioFields.username.name(), SortDirection.ASCENDING); List<Usuario> usuarios = new ArrayList<Usuario>(); Iterable<Entity> entidades = super.lista(Usuario.class, ordenacaoPorUsername); for (Entity entidade : entidades) { Usuario usuario = getUsuario(entidade); usuarios.add(usuario); } return usuarios; } private Usuario getUsuario(Entity entidade) throws EntityNotFoundException { Usuario usuario = new Usuario(entidade); Grupo grupo = new Grupo(); List<GrupoJSON> grupoJSONs = new ArrayList<GrupoJSON>(); List<Membro> grupos = repositorioMembro.obtemPorIdUsuario(usuario.getId()); Iterator<Membro> membro = grupos.iterator(); while (membro.hasNext()) { GrupoJSON grupoJSON = new GrupoJSON(); grupo = repositorio.obtemPorId(membro.next().getIdGrupo()); grupoJSON.setId(grupo.getId()); grupoJSON.setNome(grupo.getNome()); grupoJSON.setProprietario(grupo.getProprietario()); grupoJSONs.add(grupoJSON); } usuario.setGrupos(grupoJSONs); return usuario; } public Usuario obtemPorUsername(String username) { Query query = new Query(Usuario.class.getName()); query.setFilter(new FilterPredicate(UsuarioFields.username.name(), FilterOperator.EQUAL, username)); PreparedQuery pquery = this.datastore.prepare(query); Entity entityEncontrada = pquery.asSingleEntity(); if (entityEncontrada == null) { throw new EntidadeNaoEncontradaException(Usuario.class.getName(), "username", username); } return new Usuario(entityEncontrada); } public Usuario obtemUsuarioLogado() { return obtemPorUsername(AutenticacaoService.identificacaoDoUsuarioLogado()); } public Usuario getByGithub(String githubLogin) throws EntityNotFoundException { Query query = new Query(Usuario.class.getName()); query.setFilter(new FilterPredicate(UsuarioFields.gitHub.name(), FilterOperator.EQUAL, githubLogin)); PreparedQuery pquery = this.datastore.prepare(query); Entity entityEncontrada = pquery.asSingleEntity(); if (entityEncontrada == null) { return null; } return getUsuario(entityEncontrada); } }