BISValidator

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

O BISValidator é um serviço do BISCore capaz de realizar validações nos BISDefaultVO a partir de suas BISMeta Annotations. Todas as BISMetaAnnotations serão lidas e analizadas, sempre que os valores de algum atributo não satisfazer as definições dos meta dados definidos nas annotations o BISValidator resultara em erros de validação.

Como Utilizar

O modo de usar é bem simples. O BISValidator oferece uma classe estática de mesmo nome, com apenas 3 métodos estáticos e públicos. São eles:

  • validateDelete(...) - Usado para validar o objeto antes de excluí-lo.
  • validateInsert(...) - Valida o objeto para inseri-lo no banco.
  • validateUpdate(...) - Valida o objeto antes de atualiza-lo no banco de dados.

Cada método deve ser chamado de acordo com a operação que o CRUD realizará com a entidade.

As validações realizadas são dividias em dois grupos: Validações de Operação e Validações da Entidade.

Validações de Operação

Validações de operação são as validações que precisam ser feitas de acordo com a operação à ser realizada (Insert/Update/Delete). De acordo com a operação temos as seguintes validações:

  • Operação de Inserir
    • Validamos se a entidade não tem um ID definido - Nenhuma entidade pode ser inserida já com um ID definido. Em geral se um ID já existe para o objeto indica um provável erro de programação, indicando que o objeto devia ser atualizado e não inserido.
    • Validamos se todas as entidades dos relacionamentos do tipo COMPOSITION' também estão sem ID - sub entidade que compõe o objeto principal não devem preexistir no banco de dados uma vez que não existem "por conta própria" muito menos são utilizadas por outras instâncias. A existência de um ID geralmente indica que o tipo de relacionamento está declarado errado.
    • Realiza as Validações da Entidade - Valida se os demais dados da entidade são válidos de acordo com seus meta dados definidos nas annotations.
  • Operação de Atualizar
    • Validamos se a entidade tem um ID definido - A entidade para ser alterada precisa de um ID definido. Caso contrário não é possível identificar a entidade correta no banco de dados.
    • Realiza as Validações da Entidade - Valida se os demais dados da entidade são válidos de acordo com seus meta dados definidos nas annotations.
Note 64.png
Não validamos IDs de relacionamentos COMPOSITION em caso de Atualização
No caso de atualização não validamos se os objetos filhos do tipo COMPOSITION pois não temos como saber se é um novo objeto ou a atualização de um. Isto é, durante a atualização de uma entidade um relacionamento pode ser desfeito, pode ser criado ou pode ser alterado, e em casos de lista podem ganhar novas entidades, alterar ou manter as mesmas.


  • Operação de Excluir
    • Validamos se o Objeto realmente existe no banco - Para evitar problemas ou mesmo detectar problemas no sistema, verificamos se o objeto com o ID especificado ainda existe no banco de dados.
    • Valida se a instância está em uso - Algumas entidades criam dependências umas com as outras, e caso a entidade tenha a marcação com a BISMeta Annotations @BISUsedBy, o BISValidator validará se a instância que deseja apagar não está em uso por alguma instância da entidade marcada na annotation.

Validações da Entidade

Validações da entidade são as validações que devem ser feitas indiferente da operação que será realizada com o objeto. Geralmente são validações da estrutura e coesão das informações da entidade. Como por exemplo as validações individuais de cada atributo e seus meta dados. As validações geram mensagens de validações padrões indicadas abaixo. Para melhorar ou personalizar a mensagem de erro, basta tratar as BISValidationException lançadas pelo BISValidator comparar o código da exception encapsular em uma nova exception. As validações realizadas automaticamente pelo BISValidator são:

Validação das BISMetaField Annotations

Todas as BISMetaField são encontradas e validadas de acordo com os meta-dados disponíveis.


BISMetaFields Comuns

São as meta annotation para os fields de acordo com o seu tipo Java.

  • BISMetaBigDecimalField
    • Tipo Suportado - Valida se a annotation está sendo usada em um attributo do tipo suportado. "BISERP_000349"
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se está preenchida. "BISERP_000344"
    • Campo Único - Se estiver marcado como único, valida se nenhum outro objeto existente está definido com o mesmo valor. "BISERP_000345"
    • Valor Máximo - O valor máximo do BigDecimal é dividido em dois atributos, já que não é possível definir um BigDecimal diretamente na annotation. Os atributos maxIntegerValue e maxFloatValue definem respectivamente o a parte inteira e a parte fracionária do maior valor aceito. Internamente os dois valores serão combinados em um BigDecimal para comparar com o valor definido na entidade. "BISERP_000352"
    • Valor Mínimo - Assim como o valor máximo, a definição do valor mínimo é dividido nos atributos minIntegerValue e minFloatValue. Os valores são combinados em um novo BigDecimal e comparados com o valor definido na entidade. "BISERP_000353"
  • BISMetaBooleanField
    • Tipo Suportado - Valida se a annotation está sendo usada em um attributo do tipo suportado. "BISERP_000349"
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se está preenchida. "BISERP_000344"
    • Campo Único - Se estiver marcado como único, valida se nenhum outro objeto existente está definido com o mesmo valor. "BISERP_000345"
  • BISMetaEnumField
    • Tipo Suportado - Valida se a annotation está sendo usada em um attributo do tipo suportado. "BISERP_000349"
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se está preenchida. "BISERP_000344"
    • Campo Único - Se estiver marcado como único, valida se nenhum outro objeto existente está definido com o mesmo valor. "BISERP_000345"
  • BISMetaIntegerField
    • Tipo Suportado - Valida se a annotation está sendo usada em um attributo do tipo suportado. "BISERP_000349"
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se está preenchida. "BISERP_000344"
    • Campo Único - Se estiver marcado como único, valida se nenhum outro objeto existente está definido com o mesmo valor. "BISERP_000345"
    • Valor Máximo - Se definido, valida se o valor do atributo não é maior que o valor definido no meta dado. "BISERP_000352".
    • Valor Mínimo - Se definido, valida se o valor do atributo não é menor que o valor definido no meta dado. "BISERP_000353".
  • BISMetaStringField
    • Tipo Suportado - Valida se a annotation está sendo usada em um attributo do tipo suportado. "BISERP_000349"
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se está preenchida. "BISERP_000344"
    • Campo Único - Se estiver marcado como único, valida se nenhum outro objeto existente está definido com o mesmo valor. "BISERP_000345"
    • Comprimento Máximo - Valida se o comprimento da String é menor que o tamanho máximo definido. "BISERP_000348"
    • Comprimento Mínimo - Valida se o comprimento da String é maior que o tamanho mínimo definido. "BISERP_000350"


Stop 256.png
Busca por BISMeta Não Suportadas
Caso alguma annotation seja encontrada no mesmo pacote das demais BISMetaAnnotations e com o mesmo prefixo "BISMeta" em seu nome uma annotation que o BISValidator não conheça ele lançará uma BISCriticalException para notificar que determinada annotation não está sendo validada. Evitando assim que "se esqueça" de validar informações do VO.


BISMetaFields Especiais

São BISMetaFields que modificam um tipo padrão do java para aceitar algum tipo específico de informação dos sistema.

  • BISMetaStringCEPField - Transforma um atributo string em um atributo de CEP
    • Tipo Suportado - Valida se a annotation está sendo usada em um attributo do tipo suportado. "BISERP_000349"
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se está preenchida. "BISERP_000344"
    • Campo Único - Se estiver marcado como único, valida se nenhum outro objeto existente está definido com o mesmo valor. "BISERP_000345"
    • Valida CEP - Valida se é um CEP Válido. Lança diferentes exceções dependendo do problema do CEP. A validação é feita pela BISCEPDataFormatter.
  • BISMetaStringCNPJField - Transforma um atributo string em um atributo de CNPJ
    • Tipo Suportado - Valida se a annotation está sendo usada em um attributo do tipo suportado. "BISERP_000349"
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se está preenchida. "BISERP_000344"
    • Campo Único - Se estiver marcado como único, valida se nenhum outro objeto existente está definido com o mesmo valor. "BISERP_000345"
    • Valida CNPJ - Valida se é um CNPJ válido. Lança diferentes exceções dependendo do problema do CNPJ. A validação é feita pela BISDocumentValidationUtils.validateCNPJ(...).
  • BISMetaStringIEField - Transforma um atributo string em um atributo de IE (Inscrição Estadual)
    • Tipo Suportado - Valida se a annotation está sendo usada em um attributo do tipo suportado. "BISERP_000349"
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se está preenchida. "BISERP_000344"
    • Campo Único - Se estiver marcado como único, valida se nenhum outro objeto existente está definido com o mesmo valor. "BISERP_000345"
    • UF - Permite definir para qual UF esta IE deverá ser validada.
    • UF Field - Permite ao invés de definir uma UF fixa no atributo UF, definir o atributo da entidade onde encontrar a UF para validação. Caso o atributo definido na UF Field esteja nulo, a IE será validada contra qualquer estado.
    • Valida IE - Valida se é uma IE válida. Lança diferentes exceções de acordo com a falha da IE.
  • BISMetaStringPhoneField - Transforma um atributo string em um atributo de Telefone no padrão do BIS: DDI|DDD|Telefone
    • Tipo Suportado - Valida se a annotation está sendo usada em um attributo do tipo suportado. "BISERP_000349"
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se está preenchida. "BISERP_000344"
    • Campo Único - Se estiver marcado como único, valida se nenhum outro objeto existente está definido com o mesmo valor. "BISERP_000345"
    • Valida Telefone - Valida se o valor encontrado satisfaz os valores do padrão BIS de telefone. As validações são feitas pela classe BISPhoneDataFormatter.


BISMetaRelationship

A BISMetaRelationship tem a finalidade de definir o relacionamento entre entidades. De acordo com o relacionamento e as definições o BISValidator faz as seguintes validações:

  • Associação - Validações para relacionamento do tipo Associação. (Veja em BISMeta_Annotations#BISMetaRelationshipField)
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se o atributo não é nulo. "BISERP_000344"
    •  : Note que verificar se o atributo não está nulo pode não significar que o relacionamento existe em casos em que o atributo é uma List ou Map. Nesses casos convêm declarar o tamanho mínimo da lista.
    • Verifica se o Objeto tem um ID - Para relacionamentos do tipo Associação é obrigatório que o objeto já exista no banco. A validação verifica se o objeto tem um ID definido e em seguinda busca no banco para garantir que o objeto exista de verdade e não apenas que o ID tenha sido definido.
      Há casos em que o objeto sendo validado para inserção (ou mesmo novos objetos dentro de uma atualização) tem um relacionamento bi-direcional. Nestes casos o objeto principal pode ter um relacionamento do tipo composição, forçando a validação do objeto relacionado, enquanto que o objeto do relacionamento tem um relacionamento do tipo Associação. Nestes casos do relacionamento de Associação com objeto sem ID não falha, pois ela detecta que o relacionamento referencia um objeto que será inserido na mesma transação.
    • Ocorrências Mínimas - Em caso de Lista ou Maps, o BISValidator pode verificar se a coleção contém o mínimo de ocorrências dentro deles. Para isso é obrigatório definir o atributo minSize no relacionamento.
    • Unicidade - Quando um relacionamento Associação é marcado como único o BISValidator procura no banco para ver se algum outro objeto já está "se relacionando" com esse mesmo objeto (ou com algum dos objetos em caso de coleção). BISERP_000345
      Em caso de coleções, O BISValidator também procura se o não há relacionamentos múltiplos com o mesmo objeto dentro da coleção. BISERP_000412
  • Composição - Validações para relacionamento do tipo Composição. (Veja em BISMeta_Annotations#BISMetaRelationshipField)
    • Campo Obrigatório - Se estiver definida como obrigatória (required = true), valida se o atributo não é nulo. "BISERP_000344"
      Note que verificar se o atributo não está nulo pode não significar que o relacionamento existe em casos em que o atributo é uma List ou Map. Nesses casos convêm declarar o tamanho mínimo da lista.
    • Validação Recursiva - Para os objetos em um relacionamento do tipo Composição o BISValidator validará campo a campo dos objetos presentes no relaciomento recursivamente. Isto quer dizer que o objeto será validado completamente como se a validação tivesse sido chamada para ele. Mesmo para relacionamentos em coleções, a validação será feita em cada um dos objetos.

BISAttributeRelation

Caso a entidade tenha uma ou mais anotações de BISAttributeRelation o BISValidator validará as relações dos atributos conforme indicado e caso falhe, lançará a exceção definida no atributo exceptioncode.


Note 64.png
Atributos do Mesmo Tipo
A comparação deve ser feita entre atributos do mesmo tipo, caso contrário sempre falhará. E para operações diferente de EQUALS e NOTEQUALS, ambos os atributos devem implementar a interface Comparable<?>.

BISUniqueConstraint

Entidades que definem a BISUniqueConstraint são validadas de forma que a unicidade do conjunto de atributos da entidade não se repita em nenhuma outra instância da mesma entidade.

Note 64.png
Exclusão do Próprio Objeto
Embora seja uma validação da entidade, quando o objeto já têm um ID este objeto é automaticamente ignorado ao fazer a busca no banco de dados para evitar uma "falsa validação" contra o próprio objeto.


Stop 256.png
Duplicidade Interna
Apesar de validar a unicidade do objeto contra cadastros no banco, o BISValidator ainda não suporta validar duplicidade dentro do próprio objeto. Isto é, se um objeto tiver uma lista de objetos com a BISMeta Annotations de Unique Contraint, e este tiver valores duplicados dentro da própria lista, o BISValidator deixa passar, causando erro de SQL.

Por enquanto é necessário realizar essa validação dentro da classe do validator específico do objeto.