Well my question is about some tests I'm doing (studying) JSF and Generics, come on:
I would like to know how dangerous (if there is such a possibility) or how wrong / right my idea below might be valid,
I happen to like to create a LazyDataModel (Primefaces 5.3) where all the logic attached to it would be generic and at the same time it would not be necessary to create a class for each LazyDataModel that I would use in my presentation layers which is quite common), with this I got to create the following code:
Facade Class
@Named
@ViewScoped
public class PessoaBean extends AbstractBean<Pessoa, PessoaVO> {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Valor correspondente ao componente de mensagens
* adicionando no xhtml deste Bean
*/
private static final String idComponenteMensagensFormCadastro = "mensagensFormCadastro";
/**
* Instância de Logger
*/
private static final ILoggerSCV LOGGER = LoggerFactory.getInstance().getLogger(PessoaBean.class);
/**
* Delegate para chamada de CRUDs referente a entidade Pessoa
*/
@Inject
private transient PessoaDelegate delegate;
/**
* Pessoa em edição / selecionada
*/
private PessoaVO pessoaSelecionadaVO;
/**
* Valor que representa o que o usuário
* está digitando para que possa servir como filtro.
*
*/
private String valorFiltroSelecionarPessoa;
/**
* Value Object
*/
@Inject
private PessoaVO pessoaVO;
/**
* @return
*/
public List<Pessoa> listarPessoas(){
return delegate.listar();
}
/**
* Pessoa em edição pela DataTable
*/
public void pessoaEmEdicao(final RowEditEvent event) {
delegate.alterar(UtilObjeto.parsePara(event.getObject(), Pessoa.class));
}
/**
* Pessoa em edição pela DataTable
* @param event
*/
public void pessoaEmEdicaoCancelar(final RowEditEvent event) {
LOGGER.info(event.toString());
}
/**
* @param event
*/
public void onItemComboAlterarPessoaSelecionado(final SelectEvent event) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Item Selected", event.getObject().toString()));
}
/**
* @param valorParaFiltro
* @return
*/
public List<Pessoa> listarOpcoesComboAlterarPessoa(final String valorParaFiltro){
return delegate.listarOpcoesComboAlterarPessoa(valorParaFiltro);
}
/**
* @return
*/
public PessoaVO getPessoaVO() {
return this.pessoaVO;
}
/**
* @param pessoa
*/
public void setPessoaVO(final PessoaVO pessoaVO) {
this.pessoaVO = pessoaVO;
}
/**
* @return
*/
public String getValorFiltroSelecionarPessoa() {
return valorFiltroSelecionarPessoa;
}
/**
* @param valorFiltroSelecionarPessoa
*/
public void setValorFiltroSelecionarPessoa(final String valorFiltroSelecionarPessoa) {
this.valorFiltroSelecionarPessoa = valorFiltroSelecionarPessoa;
}
/**
* @return
*/
public LazyDataModel<?> getPessoasDataTableLazy() {
return this;
}
/**
* @return
*/
public PessoaVO getPessoaSelecionadaVO() {
return pessoaSelecionadaVO;
}
/**
* @param pessoaSelecionada
*/
public void setPessoaSelecionadaVO(final PessoaVO pessoaSelecionadaVO) {
this.pessoaSelecionadaVO = pessoaSelecionadaVO;
}
/**
* @see br.com.sistema.gerenciador.vendas.controller.abstracts.AbstractBean#getLogger()
*/
@Override
public ILoggerSCV getLogger() {
return LOGGER;
}
/**
* @see br.com.sistema.gerenciador.vendas.controller.abstracts.AbstractBean#getDelegate()
*/
@Override
protected PessoaDelegate getDelegate() {
return this.delegate;
}
/**
* @see br.com.sistema.gerenciador.vendas.controller.abstracts.AbstractBean#limpar()
*/
@Override
public void limpar() {
this.pessoaVO = CDIServiceLocator.getBean(PessoaVO.class);
}
/**
* @see br.com.sistema.gerenciador.vendas.controller.abstracts.AbstractBean#getIdComponenteErroMessage()
*/
@Override
public String getIdComponenteErroMessage() {
return idComponenteMensagensFormCadastro;
}
}
AbstractBean class
public abstract class AbstractBean<E extends IEntidadeComum<? extends Serializable>, V extends IEntidadeComumVO<? extends Serializable>> extends AbstractLazySCVDataModel2<E, V> {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Classes do Bean Atual
*/
private transient final List<Class<?>> classes = UtilReflection.recuperarClassesParametrizada(this);
/**
* Efetua o parse da classe parametrizada para Entity
* @param valueObject
* @return
*/
@SuppressWarnings("unchecked")
public E parseToEntity(final V valueObject) {
return (E) UtilObjeto.parseWithDozer(valueObject, classes.get(ConstantesNumero.VALOR_ZERO));
}
/**
* Efetua o parse da classe parametrizada para VO
* @param valueObject
* @return
*/
@SuppressWarnings("unchecked")
public Set<V> parseToVO(final Set<E> valueObject) {
return (Set<V>) UtilObjeto.parseWithDozer(valueObject, getClasseParameterVO());
}
/**
* Recupera a instância de logger
* que está sendo utilizada no bean
* @param logger
*/
public abstract ILoggerSCV getLogger();
/**
* @see br.com.sistema.gerenciador.vendas.controller.abstracts.AbstractBean#incluir()
*/
public void incluir(final V valueObject) {
try {
getDelegate().incluir(parseToEntity(valueObject));
limpar();
} catch (ValidacaoNegocioException e) {
UtilJSF.addErrorMessage(getIdComponenteErroMessage(), e);
}
}
/**
* Excluir um Bean / Entidade
*/
public void excluir(final V valueObject) {
getDelegate().excluir(parseToEntity(valueObject));
}
/**
* Altera um Bean / Entidade
* @param event
*/
@SuppressWarnings("unchecked")
public void alterar(final RowEditEvent event) {
final V valueObject = (V) UtilObjeto.parsePara(event.getObject(), getClasseParameterVO());
getDelegate().alterar(parseToEntity(valueObject));
}
/**
* Em edição pela DataTable
* @param event
*/
public void alterarCancelar(final RowEditEvent event) {
getLogger().info(event.toString());
}
/**
* Classe represent Value Object
* @return
*/
private Class<?> getClasseParameterVO() {
return this.classes.get(ConstantesNumero.VALOR_UM);
}
/**
* Devolve o Delegate em questão
* @return
*/
protected abstract CrudServico<E, ?> getDelegate();
/**
* Limpar Bean
*/
public abstract void limpar();
/**
* ID do componente que receberá
* a mensagem de retorno do erro
*/
public abstract String getIdComponenteErroMessage();
Class AbstractLazySCVDataModel2 The two at the end is for testing purposes only ...
public abstract class AbstractLazySCVDataModel2<E extends IEntidadeComum<? extends Serializable>, V extends IEntidadeComumVO<? extends Serializable>>
extends AbstractLazySCVDataModel<E, V> {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Recupera a instância de logger
* que está sendo utilizada no bean
* @param logger
*/
public abstract ILoggerSCV getLogger();
/**
* Devolve o Delegate em questão
* @return
*/
protected abstract CrudServico<E, ?> getDelegate();
/**
* Limpar Bean
*/
public abstract void limpar();
/**
* ID do componente que receberá
* a mensagem de retorno do erro
*/
public abstract String getIdComponenteErroMessage();
/**
* @see org.primefaces.model.LazyDataModel#load(int, int, java.lang.String,
* org.primefaces.model.SortOrder, java.util.Map)
*/
@Override
public List<V> load(final int primeiroRegistro, final int quantidadeRegistros, final String campoFiltro,
final SortOrder modoOrdenacao, final Map<String, Object> filtros) {
return efetuarPesquisaLazy(primeiroRegistro, quantidadeRegistros, campoFiltro, modoOrdenacao, filtros);
}
}
With the context above you can see that when my JSF / PrimeFaces page calls a LazyDataModel (method on the facade getPessoasDataTableLazy)
<p:dataTable id="tabelaPessoas"
var="pessoa" value="#{pessoaBean.pessoasDataTableLazy}" >
I would simply return this because my own " Bean " is a LazyDataModel and this way I would not need to create a class for each existing Entity in my project in exceptional cases) using LazyDataModel-specific.
I looked in several forums for something similar to my idea and unfortunately I did not succeed.
It is worth mentioning that I have already done the test and it worked normally, but it is not enough, I thank you for the interest and I am waiting for questions, ideas or comments that may help me on this journey in order to leave something of the extremely generic type .