Conceito
Scripts do Interceptador: São scripts que serão aplicados a tabela indicada toda vez que houver uma operação de inclusão, alteração ou exclusão de seus registros no banco de dados, ou seja, toda vez que houver uma operação de inclusão, alteração ou exclusão, antes de se consolidar a operação no banco de dados, o interceptador irá executar o script informado para a tal tabela.
Este mecanismo dá ao usuário a liberdade de, ao afetar a base de dados, realizar duas operações:
1 - Interferir nos dados: Modificar os dados do registro que está sendo incluído ou alterado, ou interromper a operação que esta sendo realizada no banco de dados.
2 - Realizar operações administrativas: Ao afetar a base de dados, realizar alguma operação administrativa como por exemplo o envio de um eMail a alguém ou lançar em alguma tabela uma dada informação.
Exemplo
O script abaixo irá interceptar a gravação de uma CGS0160 - Operação e, atendida a uma dada condição, irá modificar o cadastro da operação e lançar no CGS0120 - Repositório de Dados um novo lançamento com o objetivo de exibir tal lançamento no CAS0280 - Painel do usuário:
1 - Estrutura da tabela de operações (Abb10):
Ordem Tp Tam Req Nome Descrição
1 L 9,0 S abb10id Identificador
2 S 6,0 S abb10codigo Código
3 S 60,0 N abb10descr Descrição
4 I 2,0 N abb10tipoCod Tipo da operação
5 S 20,0 N abb10tipoDescr Descrição do tipo da operação
2 - Estrutura da tabela de Repositório de Dados (Aba20 e Aba2001):
Ordem Tp Tam Req Nome Descrição
1 L 9,0 S aba20id Identificador
2 S 20,0 S aba20codigo Código
3 S 50,0 N aba20descr Descrição
Ordem Tp Tam Req Nome Descrição
1 L 9,0 S aba2001id Identificador
2 L 9,0 S aba2001rd Repositório de dados
3 I 4,0 S aba2001lcto Número do lançamento
4 S 20,0 N aba2001prop Propósito
5 L 9,0 N aba2001user Id do Usuário -> Aab10
11 J 0,0 N aba2001json Campos livres
3 - Condição e Intervenção nos Dados: Se ao gravar uma operação, o usuário não informar o 'Tipo da Operação' o interceptador deverá arbitrar:
no 'Código do tipo da operação' o valor '01',
na 'Descrição do tipo da operação' o termo 'Interceptador'.
4 - Realizar Operações Administrativas: Encontrar um repositório com o nome 'PAINEL', e encontrando, incluir um novo lançamento informando:
em propósito o termo 'Cadastro de Operação',
no usuário o 'Nome do usuário logado',
na mensagem o texto 'O usuário xxx em dd/mm/aaaa as hh:mm não informou o tipo da operação', e,
na data a 'Data do Sistema Operacional'.
5 - Script do interceptador: Código '.interceptor' escrito no CAS4011 - SamDev para a tabela 'Abb10 - Operação'.
package multitec.interceptor;
import java.util.List;
import br.com.multiorm.ColumnType;
import br.com.multiorm.ORMInterceptor;
import br.com.multiorm.Query;
import br.com.multiorm.Session;
import br.com.multiorm.criteria.criterion.Criterions;
import sam.model.entities.ab.Aba20;
import sam.model.entities.ab.Aba2001;
import sam.model.entities.ab.Abb10;
import sam.model.entities.aa.Aab10;
import br.com.multitec.utils.collections.TableMap;
import sam.server.samdev.utils.InterceptadorUtils;
public class Abb10Interceptador implements ORMInterceptor{
InterceptadorUtils interceptadorUtils = new InterceptadorUtils();
public Class getEntityClass() {
return Abb10.class;
}
/**
* Ação 1 - Ao gravar uma operação, se o usuário não informar o 'Tipo da Operação' (abb10tipoCod)
* o interceptador irá arbitrar o código '01' e na 'Descrição do tipo da operação' (abb10tipoDescr)
* o termo 'Interceptador'.
*
* Ação 2 - Encontrar um repositório com o nome (aba20codigo) 'PAINEL', e encontrando, incluir um novo
* lançamento (aba2001lcto) informando em propósito (aba2001prop) o termo 'Cadastro de Operação', e na
* mensagem (aba2001json, campo "texto") o texto 'O usuário nomeUsuarioLogado em dd/mm/aaaa as hh:mm não
* informou o tipo da operação'.
*/
public void prePersist(sam.model.entities.ab.Abb10 entity, Session s) {
if(entity.getAbb10tipoCod() == null) {
//Intervindo nos dados (Ação 1)
entity.setAbb10tipoCod(01);
entity.setAbb10tipoDescr("Interceptador");
//Realizando uma operação administrativa (Ação 2). Leitura do repositório (tabela Aba20) denominado 'PAINEL'
Aba20 aba20 = s.createCriteria(Aba20.class)
.addWhere(Criterions.eq("aba20codigo", "PAINEL"))
.get();
if(aba20 != null) {
//Repositório 'PAINEL' encontrado
def data = new Date();
Aab10 aab10 = interceptadorUtils.usuario();
//Composição da mensagem
def msg = "O usuário " + aab10.aab10user + " em " + data.dateString + " as " +
data.timeString + " não informou o tipo da operação";
//Obter o último lançamento feito no repositório 'PAINEL'
Query query = s.createQuery("SELECT MAX(aba2001lcto) FROM Aba2001 WHERE Aba2001rd = :idAb20");
query.setParameter("idAb20", aba20.getAba20id());
def lcto = query.getUniqueResult(ColumnType.INTEGER);
//Criando um novo lançamento
Aba2001 aba2001 = new Aba2001();
aba2001.setAba2001rd(aba20);
aba2001.setAba2001lcto(lcto == null ? 0 : lcto + 1); //Lançamento
aba2001.setAba2001prop("Cadastro de Operação"); //Propósito
aba2001.setAba2001user(aab10); //Usuário
//Campos json do novo lançamento
TableMap mapJson = new TableMap();
mapJson.put("texto", msg);
mapJson.put("data", data.format("yyyyMMdd"));
aba2001.setAba2001json(mapJson);
s.persist(aba2001);
}
}
}
public void preDelete(List ids, Session s) {
}
}
6 - SQL do painel: Instruir o CAS0280 - Painel a ler no repositório de dados o código 'PAINEL' e exibir as mensagens lá contida no campo 'texto':
Usuário: Master
Mensagem: Interceptador: $1
SQL de Consulta: SELECT aba2001json ->> 'texto' FROM Aba2001 INNER JOIN Aba20 ON aba20id = aba2001rd WHERE aba20codigo = 'PAINEL' AND aba20gc $gc(aba20)$