package br.com.ecodetech.alunoweb.mb;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.Conversation;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.primefaces.model.LazyDataModel;
import br.com.ecodetech.alunoweb.interceptor.Transactional;
import br.com.ecodetech.alunoweb.lazydatamodel.GenericLazyList;
import br.com.ecodetech.alunoweb.model.bean.AbstractEntityBean;
import br.com.ecodetech.alunoweb.model.dao.GenericDAO;
@SuppressWarnings("serial")
public abstract class GenericMB<T extends AbstractEntityBean, E extends GenericDAO<T>>
implements Serializable {
@Inject
private E dao;
@Inject
private Conversation conversa;
@Inject
private transient Logger logger;
private T entidade;
private String valorFiltro = "";
private List<T> listaEntidades = new ArrayList<T>();
private String paginaListagem;
private String paginaDados;
private LazyDataModel<T> listaEntidadesPaginada = null;
/**
* Metodo abstrado usado para inicializar a lista de entidades
*/
public abstract void carregarLista();
/**
* Inicia a lista paginada
*/
public void carregarListaPaginada() {
listaEntidadesPaginada = new GenericLazyList<T>(getDao(),
listaEntidades);
}
/**
* @return lista paginada
*/
public LazyDataModel<T> getListaEntidadesPaginada() {
if (listaEntidadesPaginada == null) {
carregarListaPaginada();
}
return listaEntidadesPaginada;
}
/**
* Metodo que inicia a conversacao
*/
public void iniciarConversa() {
if (!FacesContext.getCurrentInstance().isPostback()
&& conversa.isTransient()) {
conversa.begin();
logger.debug("iniciarConversa()INICIANDO:" + conversa.getId());
}
logger.debug("iniciarConversa():" + conversa.getId());
}
/**
* Metodo que encerra a conversa
*
* @return String com a url da pagina de listagem
*/
public String encerrarConversa() {
logger.debug("encerrarConversa().ID:" + conversa.getId());
logger.debug("encerrarConversa().isTransient:" + conversa.isTransient());
if (!conversa.isTransient()) {
conversa.end();
}
return paginaListagem;
}
/**
* Metodo que exibe a tela de cadastro
*
* @return String com a url da pagina de cadastro
*/
public String exibirCadastrar() {
criarEntidade();
return paginaDados;
}
/**
* Metodo que exibe a tela de edicao de dados
*
* @return String com a url da tela de edicao
*/
public String exibirAlterar() {
// carregarEntidade();
return paginaDados;
}
/**
* Metodo usado para o cancelamento da conversacao
*
* @return String com a url da tela de listagem
*/
public String cancelar() {
return encerrarConversa();
}
/**
* Metodo usado para cadastrar ou alterar dados de uma entidade
*
* @return String com a url da pagina de listagem
*/
@Transactional
public String salvar() {
try {
if (entidade.getId() == null) {
dao.cadastrar(entidade);
} else {
dao.alterar(entidade);
}
/*
* ECodeTechUtil.setMessageView(FacesContext.getCurrentInstance(),
* ChaveMensagemEnum.ALERTA_OPERACAO_RESULTADO,
* ChaveMensagemEnum.ALERTA_OPERACAO_SUCESSO,
* FacesMessage.SEVERITY_INFO);
*/
} catch (Exception e) {
/*
* ECodeTechUtil.setMessageView(FacesContext.getCurrentInstance(),
* ChaveMensagemEnum.ALERTA_OPERACAO_RESULTADO,
* ChaveMensagemEnum.ALERTA_OPERACAO_FALHA,
* FacesMessage.SEVERITY_ERROR);
*/
e.printStackTrace();
} finally {
encerrarConversa();
}
return paginaListagem;
}
@Transactional
public void excluir() {
try {
getDao().excluir(entidade);
// carregarLista();
listaEntidades.remove(entidade);
((GenericLazyList<T>) listaEntidadesPaginada)
.setAtualizaTotal(true);
/*
* ECodeTechUtil.setMessageView(FacesContext.getCurrentInstance(),
* ChaveMensagemEnum.ALERTA_OPERACAO_RESULTADO,
* ChaveMensagemEnum.ALERTA_OPERACAO_SUCESSO,
* FacesMessage.SEVERITY_INFO);
*/
logger.info("excluir(): sucesso");
} catch (Exception e) {
/*
* ECodeTechUtil.setMessageView(FacesContext.getCurrentInstance(),
* ChaveMensagemEnum.ALERTA_OPERACAO_RESULTADO,
* ChaveMensagemEnum.ALERTA_OPERACAO_FALHA,
* FacesMessage.SEVERITY_ERROR);
*/
logger.error("excluir(): falha" + e.getMessage());
}
}
public String getValorFiltro() {
return valorFiltro;
}
public void setValorFiltro(String valorFiltro) {
this.valorFiltro = valorFiltro;
}
public void filtrar() {
GenericLazyList<T> list = (GenericLazyList<T>) getListaEntidadesPaginada();
list.setValorFiltro(valorFiltro);
list.setCampoFiltro("nome");
list.setAtualizaTotal(true);
}
/**
* @return a conversa atual
*/
public Conversation getConversa() {
return conversa;
}
/**
* Metodo que cria novas entidades
*/
public void criarEntidade() {
try {
entidade = getClassType().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Metodo que carrega entidades do BD, baseado no id
*/
public void carregarEntidade() {
entidade = dao.consultar(entidade.getId());
}
/**
* Devolve o tipo da classe informada como parametro T
**/
@SuppressWarnings("unchecked")
private Class<T> getClassType() {
/*System.out.println("getClass(): " + getClass());
System.out.println("getClass().getGenericSuperclass(): "
+ getClass().getGenericSuperclass());
System.out.println("getClass().getSuperclass(): "
+ getClass().getSuperclass());
System.out
.println("getClass().getSuperclass().getGenericSuperclass(): "
+ getClass().getSuperclass().getGenericSuperclass());*/
// Class<?> superClass = getClass().getSuperclass();
// ParameterizedType parameterizedType = (ParameterizedType)
// superClass.getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) getClass().getSuperclass()
.getGenericSuperclass();
return (Class<T>) parameterizedType.getActualTypeArguments()[0];
}
/**
* @return entidade atual
*/
public T getEntidade() {
if (entidade == null) {
criarEntidade();
}
return entidade;
}
/**
* Metodo usado para alterar a entidade atual
*
* @param entidade
*/
public void setEntidade(T entidade) {
this.entidade = entidade;
}
/**
* Metodo que retorna a instancia atual do DAO
*
* @return GenericDAO<E>
*/
public E getDao() {
return dao;
}
/**
* @return Lista de entidades <T>
*/
public List<T> getListaEntidades() {
return listaEntidades;
}
/**
* Atualiza a lista de entidades atual
*
* @param listaEntidades
*/
public void setListaEntidades(List<T> listaEntidades) {
this.listaEntidades = listaEntidades;
}
/**
* @return pagina de listagem de entidades
*/
public String getPaginaListagem() {
return paginaListagem;
}
/**
* Atualiza a pagina de listagem das entidades
*
* @param paginaListagem
*/
public void setPaginaListagem(String paginaListagem) {
this.paginaListagem = paginaListagem + "?faces-redirect=true";
}
/**
* @return pagina para edicao ou cadastro de entidades
*/
public String getPaginaDados() {
return paginaDados;
}
/**
* Metodo que atualiza a pagina de dados
*
* @param paginaDados
*/
public void setPaginaDados(String paginaDados) {
this.paginaDados = paginaDados + "?faces-redirect=true";
}
}