LazyDataModel Generic on the Facade

0

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 .

    
asked by anonymous 18.02.2018 / 03:33

0 answers