Validação semântica de XML usando Schematron no Oracle Mediator 11g
O Oracle Mediator permite o uso da tecnologia Schematron para realizar a validação semântica de documentos XML.
Conforme consta na Wikipedia: “Em linguagens de markup, Schematron é uma linguagem de validação baseada em regras para realizar afirmações sobre a presença ou não de padrões em árvores XML”. O schematron se baseia em regras na forma de expressões ao invés de utilizar gramáticas pré-definidas para validação das árvores XML, o que permite criar regras mais flexíveis e sensíveis ao contexto do XML.
Nesse exemplo veremos como forçar que para um XML representando uma pessoa física seja informado o CPF e para um XML representando uma pessoa jurídica seja informado o CNPJ.
Esse problema poderia ser facilmente resolvido com o estabelecimento de dois tipos XSD, um para cada tipo de pessoa, mas às vezes não temos a liberdade de modificar os tipos XSD e necessitamos de uma validação que leve em consideração o contexto em que se está trabalhando no momento.
Com o uso de Schematron podemos implementar outros casos de uso interessantes, além do que veremos como exemplo nesse post. A seguir, alguns exemplos:
- Validações simples da existência de elementos ou atributos;
- Validar a obrigatoriedade da presença de elementos ou atributos em decorrência da presença e/ou valorização de outros elementos ou atributos;
- Validações envolvendo data e hora em relação à data e hora atual: forçar que a data e hora estejam no passado ou no futuro, garantir que a idade informada seja compatível com a data de nascimento;
- Conteúdos obrigatórios ou proibidos em elementos e atributos;
Para a criação do projeto, onde veremos o uso do Schematron na prática, crie uma aplicação conforme pode ser visto a seguir:

Solicite a criação do projeto do tipo SOA e nomeie-o CadastroPessoa, conforme vemos a seguir e na tela seguinte entre com “Empty Composite” e clique em Finish.
Crie um XML Schema na pasta XSD de seu projeto com o seguinte conteúdo:
<schema attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/CadPessoa"
xmlns:tns="http://xmlns.oracle.com/CadPessoa"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="Pessoa" type="tns:PessoaType"/>
<complexType name="PessoaType">
<sequence>
<element name="Nome" type="string"/>
<element name="Tipo">
<simpleType>
<restriction base="string">
<enumeration value="PF"/>
<enumeration value="PJ"/>
</restriction>
</simpleType>
</element>
<choice>
<element name="CPF" type="string"/>
<element name="CNPJ" type="string"/>
</choice>
</sequence>
</complexType>
</schema>
Esse XSD especifica um tipo para definir uma pessoa e depois um elemento de tal tipo.
O problema: esse tipo PessoaType define um tipo genérico tanto para pessoas físicas quanto para pessoas jurídicas. O grande problema é que temos que garantir que para pessoas físicas é especificado um CPF e para pessoa jurídica um CNPJ, o que não é possível via XSD (poderíamos usar herança e especialização, porém não é o caso). Usaremos schematron para isso.
Após isso, criaremos nosso serviço no mediator, que servirá de porta de entrada. Arraste um objeto do tipo Mediator para o centro da composite. Defina seu nome como “CadastroPessoa”, o template como “One-Way Interface” e como o tipo de dados de input selecione no XSD recém-criado o elemento Pessoa. A figura a seguir ilustra a configuração do mediator:
Dê um duplo clique no mediator, abrindo a tela de edição das regras de roteamento. Como é apenas um exemplo, rotearemos para um processo BPEL que efetuará um log no console.
Arraste um componente do tipo BPEL process para a composite, nomeie-o como CadastroPessoaProcess, use One-Way como template e indique que ele também recebe um elemento Pessoa como entrada. A imagem a seguir ilustra isso:
Após isso, na tela de configuração da composite ligue o mediator ao BPEL, conforme apresentado a seguir:
Edite seu processo BPEL e arraste uma ação do tipo Java Embedded. Dentro dessa ação, efetue um logging conforme a seguir:
System.out.println("Pessoa Cadastrada!");
O que irá imprimir no console a mensagem "Pessoa Cadastrada!".
Volte à edição da composite, efetue um duplo clique no mediator e marque o checkbox “Validate Syntax (XSD)”. Crie também uma transformação para o envio do tipo pessoa para o processo BPEL. O Mediator deve ficar assim:
Efetuando o deployment de seu processo agora, você verá que ele já funciona. Experimente cadastrar uma pessoa física com um CNPJ ou uma jurídica com CPF. Isso é possível, porém é uma falha. Veremos agora como barrar isso via schematron.
Crie um novo arquivo parar armazenarmos as regras em formato schematron na pasta SOA Content do Jdeveloper denominado validaTipoPessoa.sch.
Dentro desse arquivo, entre com:
<schema xmlns="http://www.ascc.net/xml/schematron" >
<ns uri="http://xmlns.oracle.com/CadPessoa" prefix="ns"/>
<pattern name="Valida Documento">
<rule context="ns:Pessoa">
<assert test="(ns:Tipo = 'PF' and ns:CPF) or (ns:Tipo = 'PJ' and ns:CNPJ)">
O documento nao casa com o tipo da pessoa.
</assert>
</rule>
</pattern>
</schema>
Veja que o teste realizado verifica se o tipo da pessoa casa com a presença do documento correto.
Volte à tela de edição das regras de roteamento do mediator e na seção “Validate Semantic” clique em “Select schematron validation file” na tela Validations clique em Add, mantenha request selecionado em Part e localize o arquivo validaTipoPessoa.sch. A configuração do mediator deve ficar conforme apresentado a seguir:
Efetue deploy novamente e veja que agora não é possível informar o documento que não esteja de acordo com o tipo da pessoa. Ao testar o serviço com um documento que não casa com o tipo da pessoa, a seguinte mensagem pode ser observada na console de testes:
oracle.sysman.emSDK.webservices.wsdlapi.SoapTestException:
oracle.tip.mediator.infra.exception.MediatorException: ORAMED-01301:[Payload custom validation]Schematron validation fails with error O documento nao casa com o tipo da pessoa. Possible Fix:Fix the payload.
Fecho aqui o post sobre schematron. Se você trabalha ou se interessa por tecnologias envolvendo XML ou Web Services, fique atento a esse padrão emergente. Ele traz uma série de benefícios e funcionalidades únicas.















