package br.gov.mj.sislegis.app.service.ejbs;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.naming.CommunicationException;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import br.gov.mj.sislegis.app.model.Proposicao;
import br.gov.mj.sislegis.app.model.Usuario;
import br.gov.mj.sislegis.app.model.pautacomissao.AgendaComissao;
import br.gov.mj.sislegis.app.service.AbstractPersistence;
import br.gov.mj.sislegis.app.service.UsuarioService;
import br.gov.mj.sislegis.app.util.SislegisUtil;
@Stateless
public class UsuarioServiceEjb extends AbstractPersistence<Usuario, Long> implements UsuarioService {
@PersistenceContext
private EntityManager em;
private SearchControls controls = null;
public UsuarioServiceEjb() {
super(Usuario.class);
controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
controls.setTimeLimit(1000);// maximo 1 segundo de espera
controls.setCountLimit(20); // maximo 20 resultados
controls.setReturningAttributes(new String[] { "cn", "userPrincipalName", "displayName", "department",
"sAMAccountName" });
}
@Override
protected EntityManager getEntityManager() {
return em;
}
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public Usuario findByEmail(String email) {
TypedQuery<Usuario> findByIdQuery = em.createQuery(
"SELECT u FROM Usuario u WHERE upper(u.email) like upper(:email) ORDER BY u.email ASC", Usuario.class);
findByIdQuery.setParameter("email", email);
try {
Usuario user = findByIdQuery.getSingleResult();
return user;
} catch (javax.persistence.NoResultException e) {
// no execption just return null
return null;
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public Usuario findOrCreateByEmail(String name, String email) {
Usuario user = findByEmail(email);
if (user == null) {
user = new Usuario();
user.setEmail(email);
user.setNome(name);
save(user);
}
return user;
}
@Override
public List<Usuario> listUsuariosSeguidoresDeComissao(AgendaComissao agenda) {
TypedQuery<Usuario> findByIdQuery = em.createQuery(
"SELECT u FROM Usuario u join u.agendasSeguidas agendas where agendas.id=:idAgenda", Usuario.class);
findByIdQuery.setParameter("idAgenda", agenda.getId());
return findByIdQuery.getResultList();
}
@Override
public List<Usuario> listUsuariosSeguidoresDeProposicao(Proposicao proposicao) {
TypedQuery<Usuario> findByIdQuery = em.createQuery(
"SELECT u FROM Usuario u join u.proposicoesSeguidas prop where prop.id=:idProp", Usuario.class);
findByIdQuery.setParameter("idProp", proposicao.getId());
return findByIdQuery.getResultList();
}
@Override
public List<Usuario> findByNome(String nome) {
TypedQuery<Usuario> findByIdQuery = em.createQuery(
"SELECT u FROM Usuario u WHERE upper(u.nome) like upper(:nome) ORDER BY u.nome ASC", Usuario.class);
findByIdQuery.setParameter("nome", "%" + nome + "%");
return findByIdQuery.getResultList();
}
@Override
public List<Usuario> findByIdEquipe(Long idEquipe) {
Query query = em.createNativeQuery("SELECT u.* FROM Usuario u "
+ " inner join equipe_usuario eu on u.id = eu.usuario_id "
+ " inner join Equipe e on e.id = eu.equipe_id " + " WHERE e.id = :idEquipe ORDER BY u.nome ASC",
Usuario.class);
query.setParameter("idEquipe", idEquipe);
List<Usuario> usuarios = query.getResultList();
return usuarios;
}
/**
* Definido no xml de configuração do servidor. Da forma abaixo:<br>
*
* <pre>
* <subsystem xmlns="urn:jboss:domain:naming:2.0">
* <bindings>
* <external-context module="org.jboss.as.naming" name="java:global/federation/ldap/mjldap" class="javax.naming.directory.InitialDirC ontext" cache="true">
* <environment>
* <property name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory" />
* <property name="java.naming.provider.url" value="ldap://SERVIDOR:389/SUBTREE" />
* <property name="java.naming.security.authentication" value="simple" />
* <property name="java.naming.security.principal" value="PRINCIPAL" />
* <property name="java.naming.security.credentials" value="****" />
* </environment>
* </external-context>
* </bindings>
* </subsystem>
*
* </pre>
*/
// @Resource(lookup = "java:global/federation/ldap/mjldap")
private javax.naming.directory.InitialDirContext ldapContext;
@Override
public List<Usuario> findByNomeOnLDAP(String nome) {
List<Usuario> usuarios = new ArrayList<Usuario>();
try {
ldapContext = (InitialDirContext) InitialContext.doLookup("java:global/federation/ldap/mjldap");
NamingEnumeration<SearchResult> results = ldapContext.search("OU=SISLEGIS", "(&(objectclass=person)(cn="
+ nome + "*))", controls);
if (results.hasMoreElements()) {
while (results.hasMoreElements()) {
SearchResult searchResult = (SearchResult) results.nextElement();
Usuario ldapUser = new Usuario();
ldapUser.setEmail(String.valueOf(searchResult.getAttributes().get("userPrincipalName").get()));
ldapUser.setNome(String.valueOf(searchResult.getAttributes().get("cn").get()));
usuarios.add(ldapUser);
}
}
} catch (NamingException e) {
try {
if (e.getRootCause().getCause().getCause().getCause() instanceof CommunicationException) {
if (Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).isLoggable(Level.FINE)) {
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.SEVERE,
"Não foi possível carregar o recurso do LDAP. Sua rede pode acessar o LDAP do MJ?");
} else {
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.SEVERE,
"Não foi possível carregar o recurso do LDAP. Sua rede pode acessar o LDAP do MJ?", e);
}
} else {
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.SEVERE,
"Houve um erro consultando o LDAP", e);
}
} catch (Exception e1) {
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.SEVERE, "Houve um erro consultando o LDAP", e);
}
}
return usuarios;
}
@Override
public Usuario loadComAgendasSeguidas(Long id) {
Usuario user = findById(id);
user.getAgendasSeguidas().size();
return user;
}
@Override
public Collection<Proposicao> proposicoesSeguidas(Long id) {
Collection<Proposicao> props = (findById(id)).getProposicoesSeguidas();
props.size();
return props;
}
}