Trabalho com desenvolvimento BPEL há alguns anos utilizando o produto da Oracle, o SOA Suite, e tenho acompanhado a sua evolução desde a versão 10g, incluindo a IDE de desenvolvimento, o JDeveloper.
Recentemente estive envolvido em um projeto e precisei utilizar em diferentes contextos o componente assign. Nas versões mais recentes do produto existe uma sensível diferença na interface para realizar as atribuições e isso me motivou a escrever esse post, na tentativa de destacar e exemplificar o uso do copy e das suas regras: copy list, append, insert after e insert before.
Nos exemplos abaixo utilizei uma VM produzida pela Oracle (disponível aqui) e configurada com:
Oracle Enterprise Linux (64-bit) EL 5 Update 5 Oracle XE Database 11.2.0 Oracle SOA Suite 11.1.1.6.0 (includes Service Bus) Oracle BPM Suite 11.1.1.6.0 Oracle JDeveloper 11.1.1.6.0 JRockit R28.2.0-79-146777-1.6.0_29s
O valor de input utilizado nos testes foi:
<inputVariable> <part name="payload"> <ns1:OrdemServicoRequest xmlns:ns1="https://xmlns.oracle.com/DDM"> <ns1:CodigoOS>123</ns1:CodigoOS> <ns1:DataAberturaOS>22/09/2012</ns1:DataAberturaOS> <ns1:TipoOS>OS</ns1:TipoOS> <ns1:StatusOS>Iniciado</ns1:StatusOS> <ns1:DataEncerramentoOS>25/09/2012</ns1:DataEncerramentoOS> <ns1:Codigocliente>12114</ns1:Codigocliente> <ns1:NomeCliente>José da Silva Sauro</ns1:NomeCliente> <ns1:EnderecosCliente> <ns1:EnderecoCliente> <ns1:Rua>Rua 1</ns1:Rua> <ns1:Numero>2</ns1:Numero> <ns1:Complemento>Bairro 3</ns1:Complemento> <ns1:Cidade>Longe de Tudo</ns1:Cidade> <ns1:Estado>Algum</ns1:Estado> <ns1:CEP>01000-000</ns1:CEP> </ns1:EnderecoCliente> <ns1:EnderecoCliente> <ns1:Rua>Rua 2</ns1:Rua> <ns1:Numero>3</ns1:Numero> <ns1:Complemento>Bairro 4</ns1:Complemento> <ns1:Cidade>Perto de Tudo</ns1:Cidade> <ns1:Estado>Nenhum</ns1:Estado> <ns1:CEP>02000-000</ns1:CEP> </ns1:EnderecoCliente> </ns1:EnderecosCliente> <ns1:EmailCliente>jose@sauro.sil</ns1:EmailCliente> </ns1:OrdemServicoRequest> </part> </inputVariable>
- Uso tradicional do copy
O uso tradicional do copy serve, entre outras coisas, para atribuição de valores para variáveis à partir de outras variáveis ou funções pré-definidas no produto (expression).
O retorno dessa atribuição será:
- Uso do append
O append irá inserir um elemento ao final da lista, sem alterar o conteúdo já existe. Veja o exemplo abaixo.
O resultado da lista, nesse momento do exemplo, são dois elementos.
- Uso do copyList
A regra copyList tem por característica eliminar todos os elementos que já existirem na lista de destino e substituir integralmente o seu conteúdo, incluindo elementos e atributos.
No nosso exemplo incluímos um terceiro assign, depois dos dois assigns dos exemplos acima, com a regra copyList. Note que o array destino continha, até então, dois elementos. Os dois foram excluídos e um novo elemento será incluído, conforme exemplo. Para deixar claro o exemplo, incluímos dois elementos utilizando o copyList. O valor final do array irá conter somente o segundo valor inserido.
O resultado final da lista conterá somente o segundo elemento inserido.
- Uso do insertBefore e insertAfter
O nosso último exemplo é para demonstrar o uso do insertBefore e insertAfter. O primeiro irá incluir um elemento antes do elemento assinalado no destino e o segundo, depois.
O resultado final da lista será:
A atividade assign é uma ótima opção para atribuição de valores às variáveis, muitas vezes eliminando a necessidade de uma transformação. Conhecer bem as suas regras ajuda a tirar proveito de todos os recursos envolvidos.
Um detalhe, por experiência de projeto, é que essa janela pode se tornar muito lenta no caso de utilização de schemas (XSD) que ficam armazenados em servidores remotos e no MDS. Esperemos que isso melhore nas próximas versões do produto.
O projeto utilizado no exemplo está disponível para download no link abaixo:
- [download id=”1″]