Correto pelo que percebi este é o início e estou estudando para entender mais.
Bom vou tentar explicar o que estou fazendo.
Minha ideia é deixar em memória o usuário logado, as entidades do usuário, as empresas do usuário e os grupos do usuário. Isto para no ter que ficar fazendo consulta toda hora em banco.
Minha classe de usuário logado que acho que é o singleton que entendi.
package org.desif.singleton;
import java.io.Serializable;
import java.util.Set;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.desif.model.desif.EmpresaEntity;
import org.desif.model.desif.EntidadeEntity;
import org.desif.model.publico.UsuarioEntity;
import org.desif.repository.desif.EmpresaRepository;
import org.desif.repository.desif.EntidadeRepository;
/**
* Deve carregado ao entrar no sistema;
*/
@ManagedBean(name = "usuariologadocontroller")
@SessionScoped
public final class UsuarioLogado implements Serializable {
private static final long serialVersionUID = 2189498240202823230L;
private static final UsuarioLogado INSTANCE = new UsuarioLogado();
private static UsuarioEntity usuarioLogado;
private static Set<EntidadeEntity> usuariosLogadoEntidades;
private static Set<EmpresaEntity> usuariosLogadoEmpresas;
@EJB
EntidadeRepository entidadeRepository = new EntidadeRepository();
public static UsuarioEntity getUsuarioLogado() {
return usuarioLogado;
}
private static void setUsuarioLogado(UsuarioEntity usuarioLogado) {
UsuarioLogado.usuarioLogado = usuarioLogado;
}
public static Set<EntidadeEntity> getUsuariosLogadoEntidades() {
return usuariosLogadoEntidades;
}
private static void setUsuariosLogadoEntidades(Set<EntidadeEntity> usuariosLogadoEntidades) {
UsuarioLogado.usuariosLogadoEntidades = usuariosLogadoEntidades;
}
public static Set<EmpresaEntity> getUsuariosLogadoEmpresas() {
return usuariosLogadoEmpresas;
}
private static void setUsuariosLogadoEmpresas(Set<EmpresaEntity> usuariosLogadoEmpresas) {
UsuarioLogado.usuariosLogadoEmpresas = usuariosLogadoEmpresas;
}
private UsuarioLogado() {
usuarioLogado();
municipioUsuarioLogado();
}
public static UsuarioLogado getInstante() {
return INSTANCE;
}
/**
* Buscar o usuário logado, deve ser carregado ao entrar no sistema;
*/
private void usuarioLogado() {
// FacesContext contexto = FacesContext.getCurrentInstance();
// UsuarioEntity usuarioLogado = (UsuarioEntity)
// contexto.getExternalContext().getSessionMap()
// .get("usuarioLogadoSistema");
UsuarioEntity usuarioLogado = new UsuarioEntity();
usuarioLogado.setId(1l);
setUsuarioLogado(usuarioLogado);
}
/**
* Entodades do usuário logado, deve ser carregado ao entrar no sistema;
*/
private void municipioUsuarioLogado() {
Set<EntidadeEntity> municipiosUsuarioLogado = entidadeRepository.municipiosUsuariosLogadoEmpresaEntidade(getUsuarioLogado());
setUsuariosLogadoEntidades(municipiosUsuarioLogado);
}
/**
* Contribuintes do usuário logado, deve ser carregado ao entrar no sistema;
*/
@SuppressWarnings("unused")
private static void contribuinteUsuarioLogado() {
Set<EmpresaEntity> municipiosUsuarioLogado = EmpresaRepository
.entidadesUsuariosLogadoEmpresaEntidade(getUsuarioLogado());
setUsuariosLogadoEmpresas(municipiosUsuarioLogado);
}
}
Minha classe que faz a consulta para guardar as informações no singlebean
package org.desif.repository.desif;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.desif.model.desif.EntidadeEntity;
import org.desif.model.publico.UsuarioEntity;
@Stateless
public class EntidadeRepository implements Serializable {
private static final long serialVersionUID = -4105245812731304728L;
@PersistenceContext
private EntityManager em;
/**
* Busca as entidades do usuário logado
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public Set<EntidadeEntity> municipiosUsuariosLogadoEmpresaEntidade(UsuarioEntity usuario) {
/**
* Busca as entidades do usuário logado, vinculado a entidade somente
*/
StringBuilder hqlSelectEntidade = new StringBuilder("e FROM UsuarioEntidadeEntity ue ");
hqlSelectEntidade.append("\n JOIN ue.entidade e ");
hqlSelectEntidade.append("\n WHERE ue.usuario = :usuario ");
final String queryEntidade = "SELECT " + hqlSelectEntidade;
Query querySelectEntidade = em.createQuery(queryEntidade);
querySelectEntidade.setParameter("usuario", usuario);
Set<EntidadeEntity> resultSetEntidade = new HashSet(querySelectEntidade.getResultList());
/**
* Busca as entidades do usuário logado, vinculado a entidade e empresa
* somente
*/
StringBuilder hqlSelectEmpresa = new StringBuilder("e FROM UsuarioEntidadeEmpresaEntity ue ");
hqlSelectEmpresa.append("\n JOIN ue.entidade e ");
hqlSelectEmpresa.append("\n WHERE ue.usuario = :usuario ");
final String queryEmpresa = "SELECT " + hqlSelectEmpresa;
Query querySelectEmpresa = em.createQuery(queryEmpresa);
querySelectEmpresa.setParameter("usuario", usuario);
Set<EntidadeEntity> resultSetEmpresa = new HashSet(querySelectEmpresa.getResultList());
/**
* Adiciona o retorno de usuário por empresa e entidade com usuário por
* empresa
*/
resultSetEntidade.add((EntidadeEntity) resultSetEmpresa);
return resultSetEntidade;
}
}
Por fim meu controler que chama a classe UsuarioLogado, que é a singleton
package org.desif.controller;
import java.io.Serializable;
import java.util.Set;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.desif.model.desif.EmpresaEntity;
import org.desif.singleton.UsuarioLogado;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ManagedBean(name = "declaracaocontroller")
@SessionScoped
public class DeclaracaoController implements Serializable {
private static final long serialVersionUID = -2671687805649005424L;
private final static Logger logger = LoggerFactory.getLogger(DeclaracaoController.class);
private static UsuarioLogado instancia;
private Set<EmpresaEntity> entidades;
/**
* Metodo construtor da classe, chama a usuario logado
*/
public DeclaracaoController() {
getInstance();
}
public static synchronized UsuarioLogado getInstance() {
logger.info("Instaciou usuário logado.");
if (instancia == null) {
instancia = UsuarioLogado.getInstante();
}
return instancia;
}
@SuppressWarnings("static-access")
public Set<EmpresaEntity> getBuscaEntidadesUsuarioLogado() {
logger.info("Busca todas entidades.");
if (this.entidades == null) {
this.entidades = instancia.getUsuariosLogadoEmpresas();
}
return entidades;
}
}
A primeira vez ele chega até esta linha Query querySelectEntidade = em.createQuery(queryEntidade);, e da exceção pois disse que o metodo em está nulo.
O que está de errado ?