Fachada do CRUD

De BIS Wiki
Ir para navegação Ir para pesquisar

A fachada do Crud é a maneira que o CRUD se "expõe" para ser acessado. A fachada utiliza o pattern de Facade do java, através de JNDI.

Cada plugin terá sua fachada que expõe seus métodos e serviços para serem usados. Cada plugin deve ter apenas uma fachada, e seus métodos redirecionam as chamadas para os CRUDs! Os métodos da fachada simplesmente fazem as chamadas dos métodos do CRUD. Nunca devem ter lógica ou fazer mais de uma chamada. Inicialmente esta camada tem apenas a função de definir o que será exposto para fora do módulo e proteger o que é privado ou métodos de uso interno.

O BISInterceptor

Nas fachadas JNDI devem sempre ser inseridas o interceptador padrão do BIS (BISDefaultFacadeInterceptor), pois ele é responsável por gerenciar algumas das funções fornecidas pelo BISCore como transações, logs, autorizações, etc..

Transações

Atualmente as transações são controladas por CMT (Container-Managed Transactions). Ao realizar a chamada da fachada o servidor de aplicações se encarrega de criar as transações conforme for definido para cada fachada. Essas definições são feitas por annotations de classe na classe de fachada.

Padrões de Desenvolvimento

As fachadas do sistema devem seguir as seguintes regras:

  1. Todos os métodos devem ser públicos, inclusive sua declaração na fachada remota.
  2. Seus métodos não são estáticos, ou não poderiam estar na interface.
  3. Todos os métodos devem lançar apenas a exceção: 'BISException' e/ou 'BISValidationGroupException' quando cabível.

Bean Facade Modelo

O modelo abaixo é uma classe de fachada vazia. Pois cada plugin deve ter uma única fachada que repassa as chamadas para os CRUDs adequados. Como padrão de nome o BIS sugere que a classe de fachada deve receber o nome do plugin, enquanto que os métodos tem os nomes dos VOs que ela manipula (obrigatório para os métodos padrões como insert, update, delete, finds, count, etc. conforme descrito em Formatação e Escrita de Código).

Para começar uma nova fachada copie o modelo abaixo e faça as seguintes substituições com a ferramenta replace all:

  • <pluginame> - Nome do módulo.
Exemplo de Classe de Fachada
@Stateless(name = "<pluginname>Facade", mappedName = "ejb/<pluginname>Facade")
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Interceptors(BISDefaultFacadeInterceptor.class)
public class <pluginname>Facade implements <pluginname>FacadeRemote {

  // Inserir aqui os modelos de métodos de fachada

}


Para cada VO tratado pelo módulo, a fachada expõe os métodos do seu crud. Copie o modelo abaixo e cole no local indicado no modelo de classe para fazer os métodos padrões. Para usa-lo faça as seguintes substituições com a ferramenta replace all:

  • <beanname> - Substitua esta tag pelo nome do bean a ser persistido. Ex: 'Balance' para o 'BalanceVO', 'ItemCode' para o 'ItemCodeVO'.
Exemplo de Métodos Padrão de Fachada
  @Override
  public <beanname>VO insert<beanname>(<beanname>VO vo) throws BISException {
    return <beanname>Crud.insert<beanname>(vo);
  }

  @Override
  public void update<beanname>(<beanname>VO vo) throws BISException {
    <beanname>Crud.update<beanname>(vo);
  }

  @Override
  public void delete<beanname>(Long id) throws BISException {
    <beanname>Crud.delete<beanname>(id);
  }

  @Override
  public void delete<beanname>(Collection<Long> ids) throws BISException {
    <beanname>Crud.delete<beanname>(ids);
  }

  @Override
  public Long count<beanname>(<beanname>MO mo) throws BISException {
    return <beanname>Crud.count<beanname>(mo);
  }

  @Override
  public List<Long> find<beanname>IDs(<beanname>MO mo, BISOrderBy orderby) throws BISException {
    return <beanname>Crud.find<beanname>IDs(mo, orderby);
  }

  @Override
  public <beanname>VO find<beanname>(Long id, String[] attributes) throws BISException {
    return <beanname>Crud.find<beanname>(id, attributes);
  }

  @Override
  public List<<beanname>VO> find<beanname>List(<beanname>MO mo, BISOrderBy orderby, String[] attributes) throws BISException {
    return <beanname>Crud.find<beanname>List(mo, orderby, attributes);
  }

  @Override
  public <beanname>VO find<beanname>UniqueMatch(<beanname>MO mo, String[] attributes) throws BISException {
    return <beanname>Crud.find<beanname>UniqueMatch(mo, attributes);
  }

Remote/Local Interface

Toda fachada deve ter uma interface Remota ou Local que deve ser fornecida no client para que outros módulos possam acessa-la. É uma interface simples, só tem que ser implementada pela fachada. Abaixo há um modelo dos métodos padrões do BIS, basta fazer as mesmas substituições feitas na fachada e as declarações dos métodos estarão prontas.

Exemplo de Métodos Padrão de Fachada
  public <beanname>VO insert<beanname>(<beanname>VO vo) throws BISException;

  public void update<beanname>(<beanname>VO vo) throws BISException;

  public void delete<beanname>(Long id) throws BISException;

  public void delete<beanname>(Collection<Long> ids) throws BISException;

  public Long count<beanname>(<beanname>MO mo) throws BISException;

  public List<Long> find<beanname>IDs(<beanname>MO mo, BISOrderBy orderby) throws BISException;

  public <beanname>VO find<beanname>(Long id, String[] attributes) throws BISException;

  public List<<beanname>VO> find<beanname>List(<beanname>MO mo, BISOrderBy orderby, String[] attributes) throws BISException;

  public <beanname>VO find<beanname>UniqueMatch(<beanname>MO mo, String[] attributes) throws BISException;