O SOA Suite tem um componente muito bom para trabalhar com regras de negócios: o Oracle Business Rules. Ele permite a gente criar regras de maneira simples, utilizando estruturas IF/THEN ou tabelas de decisões que podem ser manipuladas em tempo de execução. O foco desse post é mostrar como utilizar esses componentes dentro de um BPEL, mas ele pode ser utilizado em conjunto com outros componentes ou como um serviço standalone inclusive.
Crie um projeto com um BPEL síncrono, conforme descrito neste post, mas sem o For Each. Altere o xsd do BPEL para que o input, seja do tipo integer. Entre o elemento receiveInput e replyOutput, arraste um componente de Business Rules. Dê dois cliques para editar e clique no "+" para adicionar um novo dicionário. Especifique um nome (IdadeOracleRules), clique em "+" e Add Input Variable, para adicionar uma variável de entrada. Selecione o nó Variables e clique em "+". Informe o nome "idade". Clique na lupa, selecione o xsd dentro de Project Schema Files e escolha o variável de entrada do processo (process). Na aba initialize, informe o seguinte XPath: $inputVariable.payload para inicializar a variável de entrada com o valor de entrada do processo. Clique OK e faça o mesmo para a variável de saída (output), mas sem a necessidade de inicializar, crie a variável com o nome mensagem. Você deverá obter o seguinte resultado:
Clique OK. Na próxima tela você terá a opção de criar uma tabela de decisão ou gerar as regras utilizando IF/THEN. Para o nosso primeiro conjunto de regras (ruleset) iremos utilizar IF/THEN. Clique em Create Rule.
Renomeie o Ruleset1 para IdadeRuleset (é só clicar em cima do nome para renomear). Renomeie o Rule1 para MaiorIdadeRule e preencha as regras para que se a idade for maior ou igual à 18 ele atribua (assert new) a string "Você é maior de Idade" para a variável mensagem. Você deverá o seguinte código:
Repare que além do que estamos fazendo nesse post, há a opção de definir a validade da regra e ativar/desativar ela. Faça o mesmo, só que agora para idade menor que 18.
Volte para o BPEL, dê dois cliques na regra criada. Você pode observar que na aba Dictionary, há um Copy Rules de entrada (Assign Input Facts) e um de saída (Assign Output Facts). Você pode atribuir os valores diretamente do input e output do BPEL, mas para ficar menos acoplado, vamos colocar um Assign antes de chamar as regras que atribui o $inputVariable.payload para $idade e um outro Assign após chamar as regras que pega a saída ($mensagem) e atribui para o output do processo: $outputVariable.payload.
Agora é só executar e você terá o resultado esperado! O código do projeto está disponível aqui.