Pessoal estou com uma dúvida de arquitetura em jsf, gostaria da opinião de vocês de como devo proceder, é o seguinte tenho uma entidade Licitacao, a entidade licitação por sua vez faz referência às entidades Modalidade,Tipo Objeto e Tipo Licitação(que serão representadas com comboboxes na view), estou usando EJB, com minhas entidades e meus sessions beans que fazem a persistencia dos dados.
Na view tenho meus managed Beans e minhas classes service,onde os managed beans apenas capturam ações dos usuários e passam para a service tratar e a camada service comunica com os sessions beans.
A dúvida é a seguinte,pra essa view vou precisar carregar esses 3 combobox,como fica isso no service? crio uma LicitacaoService e nela coloco a lista de modalidades,tipos objeto e tipos licitação? ou então crio um ModalidadeService, TipoLicitaçãoService,TipoObjetoService para cada um retornar suas devidas listas? é comum chamar várias services do meu managed bean? como vocês trabalham nesses casos onde em uma view eu vou precisar de várias listas para preencher várias combos,datatables etc…?
LicitacaoService
@Stateless
public class LicitacaoService {
@EJB
private LicitacaoFacadeLocal licitacaoFacadeLocal ;
@EJB
private ModalidadeLicitacaoFacadeLocal modalidadeLicitacaoFacadeLocal;
@EJB
private TipoLicitacaoFacadeLocal tipoLicitacaoFacadeLocal;
@EJB
private ItemLoteFacadeLocal itemLoteFacadeLocal ;
@EJB
private TipoObjetoFacadeLocal tipoObjetoFacadeLocal;
@EJB
private OrigemRecursoFacadeLocal origemRecursoFacadeLocal;
@EJB
private StatusFacadeLocal statusFacadeLocal;
@EJB
private OrgaoFacadeLocal orgaoFacadeLocal;
@EJB
private RevisaoFacadeLocal revisaoFacadeLocal;
public static final String URI ="java:global/licitacaoEAR/licitacao_server/br.com.lrxsistemas.server.licitacao.LicitacaoService";
public void salvarOuAtualizar(Licitacao licitacao) throws BusinessException,InfraException{
try{
validaLicitacao(licitacao);
if(licitacao.getLicitacaoId() != null ){
licitacaoFacadeLocal.create(licitacao);
}else{
if(licitacao.getStatus().getNome().equalsIgnoreCase("CONCLUIDA") || licitacao.getStatus().getNome().equalsIgnoreCase("EM REVISÃO")){
throw new BusinessException("Não é possível editar licitações concluidas ou em revisão");
}
licitacaoFacadeLocal.edit(licitacao);
}
}catch(Exception e){
throw new InfraException("Ocorreu um erro de persistência",e);
}
}
private void validaLicitacao(Licitacao licitacao) throws BusinessException{
try{
if(licitacao.getNumeroProcesso()== null || licitacao.getNumeroProcesso().equals("") || licitacao.getAnoProcesso()== null || licitacao.getAnoProcesso().equals("")){
throw new BusinessException("Preencha o campo n�mero do processo administrativo!");
}
if(licitacao.getNumeroInstrumentoConvocatorio()== null || licitacao.getNumeroInstrumentoConvocatorio().length()== 0){
throw new BusinessException("Preencha o campo n�mero do n�mero do instrumento convocat�rio!");
}
if(licitacao.getModalidadeLicitacao()== null || licitacao.getModalidadeLicitacao().getModalidadeLicitacaoId()== 0){
throw new BusinessException("Preencha o campo modalidade da licita��o!");
}
if(licitacao.getTipoLicitacao()== null || licitacao.getTipoLicitacao().getTipoLicitacaoId()==null){
throw new BusinessException("Preencha o campo tipo da licita��o!");
}
if(licitacao.getTipoObjeto()== null || licitacao.getTipoObjeto().getTipoObjetoId()== null){
throw new BusinessException("Preencha o campo tipo do objeto!");
}
if(licitacao.getOrigemRecurso()== null || licitacao.getOrigemRecurso().getOrigemRecursoId()==null){
throw new BusinessException("Preencha o campo origem recurso!");
}
}catch(NullPointerException e){
throw new BusinessException("referência nula para o objeto licitação",e);
}
}
public void salvarEnviar(Licitacao licitacao) throws BusinessException,InfraException{
try {
if(licitacao.getStatus().getNome().equalsIgnoreCase("CONCLUIDA") || licitacao.getStatus().getNome().equalsIgnoreCase("EM REVISÃO")){
throw new BusinessException("Não é possível editar licitações concluidas ou em revisão");
}
validaLicitacao(licitacao);
Status status = statusFacadeLocal.find(2);
licitacao.setStatus(status);
licitacaoFacadeLocal.edit(licitacao);
} catch (Exception e) {
throw new InfraException("Ocorreu um erro de persistência",e);
}
}
public Licitacao find(int licitacaoId)throws BusinessException,InfraException{
try {
Licitacao licitacao = licitacaoFacadeLocal.find(licitacaoId);
return licitacao;
} catch (NullPointerException e) {
throw new BusinessException("Erro ao recuperar licitação",e);
}catch(Exception e){
throw new InfraException("Erro na busca",e);
}
}
public void carregarRevisoesLicitacao(Licitacao licitacao){
List<Revisao> revisaoList = revisaoFacadeLocal.findRevisaoByLicitacao(licitacao.getLicitacaoId(),'S');
licitacao.setRevisaoList(revisaoList);
}
public void removerLicitacao(Licitacao licitacao) throws BusinessException,InfraException{
try{
if(licitacao.getStatus().getNome().equalsIgnoreCase("CONCLUIDA") || licitacao.getStatus().getNome().equalsIgnoreCase("EM REVISÃO")){
throw new BusinessException("Não é possível remover licitações concluidas ou em revisão ");
}
licitacaoFacadeLocal.delete(licitacao.getLicitacaoId());
}catch(Exception e){
throw new InfraException("Ocorreu um erro de persistência",e);
}
}
public List<Licitacao>pesquisarLicitacao(Orgao orgao,TipoLicitacao tipo,ModalidadeLicitacao modalidade,Status status,String objeto) throws InfraException{
return licitacaoFacadeLocal.buscarLicitacoes(orgao, tipo, modalidade,status, objeto);
}
public List<Licitacao> pesquisarLicitacaoProcesso(Orgao orgao,String numeroProcesso,String anoProcesso)throws BusinessException, InfraException{
try{
if(orgao == null ){
throw new BusinessException("Informe o Órgão");
}
if(numeroProcesso == null || numeroProcesso.equalsIgnoreCase("")){
throw new BusinessException("Informe o número do processo");
}
if(anoProcesso == null || anoProcesso.equalsIgnoreCase("")){
throw new BusinessException("Informe o ano do processo");
}
return licitacaoFacadeLocal.buscarLicitacaoPorProcesso(orgao,numeroProcesso, anoProcesso);
}catch(Exception e){
throw new InfraException("Ocorreu um erro na busca",e);
}
}
public List<Licitacao>pesquisarLicitacaoProcedimento(Orgao orgao,String numeroInstrumento,String anoInstrumento) throws BusinessException, InfraException{
try {
if(orgao == null ){
throw new BusinessException("Informe o Órgão");
}
if(numeroInstrumento == null || numeroInstrumento.equalsIgnoreCase("")){
throw new BusinessException("Informe o número do instrumento convocatório");
}
if(anoInstrumento == null || anoInstrumento.equalsIgnoreCase("")){
throw new BusinessException("Informe o ano do instrumento convocatório");
}
return licitacaoFacadeLocal.buscarLicitacaoPorNumeroInstrumentoConvocatorio(orgao,numeroInstrumento, anoInstrumento);
} catch (Exception e) {
throw new InfraException("Ocorreu um erro na busca",e);
}
}
public List<ModalidadeLicitacao> carregarModalidadesLicitacoes(){
return modalidadeLicitacaoFacadeLocal.findAll();
}
public List<TipoLicitacao> carregarTiposLicitacao(){
return tipoLicitacaoFacadeLocal.findAll();
}
public List<ItemLote>carregarItensLote(){
return itemLoteFacadeLocal.findAll();
}
public List<TipoObjeto>carregarTiposObjeto(){
return tipoObjetoFacadeLocal.findAll();
}
public List<OrigemRecurso> carregarOrigensRecurso(){
return origemRecursoFacadeLocal.findAll();
}
public List<Status> carregarStatus(){
return statusFacadeLocal.findAll();
}
}
LicitacaoFacade
@Stateless
public class LicitacaoFacade extends AbstractFacade<Licitacao> implements LicitacaoFacadeLocal {
@PersistenceContext(unitName = "licitacao_server1PU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public LicitacaoFacade() {
super(Licitacao.class);
}
@SuppressWarnings("unchecked")
public List<Licitacao> buscarLicitacaoPorNumeroInstrumentoConvocatorio(Orgao orgao,String numeroInstrumento,String anoInstrumento){
Query q = em.createQuery("select l from Licitacao l where l.numeroInstrumentoConvocatorio =:arg0 and l.anoInstrumentoConvocatorio =:arg3 and l.orgao.orgaoId =:arg1")
.setParameter("arg0",numeroInstrumento)
.setParameter("arg3",anoInstrumento)
.setParameter("arg1",orgao.getOrgaoId());
return (ArrayList<Licitacao>)q.getResultList();
}
public void delete(int id){
Licitacao licitacaoToRemove = em.find(Licitacao.class, id);
em.remove(licitacaoToRemove);
}
public List<Licitacao> buscarLicitacaoPorProcesso(Orgao orgao,String numero,String ano){
Licitacao licitacao= null;
Query q = em.createQuery("select l from Licitacao l where l.numeroProcesso =:arg0 and l.anoProcesso=:arg1 and l.orgao.orgaoId =:arg2 ")
.setParameter("arg0",numero)
.setParameter("arg1",ano)
.setParameter("arg2",orgao.getOrgaoId());
return q.getResultList();
}
public List<Licitacao> buscarLicitacoes(Orgao orgao,TipoLicitacao tipoLicitacao,ModalidadeLicitacao modalidadeLicitacao,
Status status, String objeto){
List<Licitacao> licitacoes = new ArrayList<Licitacao>();
HashMap<String, Object> params = new HashMap<String, Object>();
StringBuffer hql = new StringBuffer("select new Licitacao(licitacaoId,numeroInstrumentoConvocatorio,anoInstrumentoConvocatorio,objeto,valorDespesa,modalidadeLicitacao) from Licitacao l where 1=1 ");
if(orgao!= null){
hql.append("and l.orgao.orgaoId =:orgaoId ");
params.put("orgaoId",orgao.getOrgaoId());
}
if(status!= null){
hql.append("and l.status.statusId =:statusId ");
params.put("statusId",status.getStatusId());
}
if(tipoLicitacao!=null && tipoLicitacao.getTipoLicitacaoId()!=null){
hql.append("and l.tipoLicitacao.tipoLicitacaoId =:tipoLicitacaoId ");
params.put("tipoLicitacaoId",tipoLicitacao.getTipoLicitacaoId());
}
if(modalidadeLicitacao!=null && modalidadeLicitacao.getModalidadeLicitacaoId()!=null){
hql.append("and l.modalidadeLicitacao.modalidadeLicitacaoId =:modalidadeLicitacaoId ");
params.put("modalidadeLicitacaoId",modalidadeLicitacao.getModalidadeLicitacaoId());
}
if(objeto!=null && !objeto.equals("")){
hql.append("and upper(l.objeto) like :obj ");
params.put("obj","%"+objeto.toUpperCase()+"%");
}
hql.append(" order by l.numeroProcesso desc,l.anoProcesso desc");
Query q = em.createQuery(hql.toString());
for (Entry<String, Object> param : params.entrySet()) {
q.setParameter(param.getKey(),param.getValue());
}
licitacoes = q.getResultList();
return licitacoes;
}
}