Algo muito usado em linguagens de programação é sem duvidas um FOR para iteração em uma lista de elementos qualquer, neste Post pretendo ajudar você a usar o componente For Each do BPEL realizando um simples laço, iterando e concatenando nomes que colocaremos como parâmetro para nosso Loop.
Para nossos testes, vamos criar um projeto chamado ForEachBpel
Clique em File >> New
Será aberto uma tela como abaixo:
Em seguida selecione Generic Project
Em Project Name coloque ForEachBpel e em Project Technologies selecione o nome SOA e clique na setinha > para que o nome vá para a direita e fique como abaixo:
Obs: Veja em Directory que ele irá preencher automaticamente o nome onde será criado o nome do projeto que você informou em Project Name
No meu caso: /home/uans/jdeveloper/mywork/UansBlogApplication/ForEachBpel
Clique em Next e Finish em seguida, deixando o Composite Template em Empty Composite
Agora que criamos um Projeto vazio vamos criar um BPEL
Agora com o botão direito clique Componets > Insert > BPEL Process
Clique em BPEL 2.0 Specification
Em name coloque ForEachBpel
Em Template selecione Synchronous BPEL Process e clique em OK
Deixe selecionado a opção Expose as a SOAP service, pois este será o responsável por criar um WSDL e XSD default o qual iremos alterar para nossos testes.
Pronto, ele deverá ficar assim:
Abra agora o arquivo ForEachBPELProcess.xsd que foi criado automaticamente.
No complexType do element name=”process” estará conforme abaixo:
<element name=”process”>
<complexType>
<sequence>
<element name=”input” type=”string”/>
</sequence>
</complexType>
</element>
Então altere para: (apenas o destacado em vermelho)
<element name=”process”>
<complexType>
<sequence>
<element name=”nome” type=”string” maxOccurs=”unbounded” minOccurs=”1″/>
</sequence>
</complexType>
</element>
Então deverá ficar assim:
Vamos entender o que foi alterado:
- Em element name=”nome” alterei nossa variável de entrada para nome
- Em maxOccurs=”unbounded” estou dizendo que poderemos ter inúmeras vezes o parâmetro nome mencionado
- Em minOccurs=”1″ estou dizendo que esse parâmetro é obrigatório
Abra agora o seu composite BPEL e dentro do ForEachBPELProcess.bpel arraste e solte o componente For Each conforme abaixo:
Dê um duplo clique sobre o seu ForEach1 e na guia General coloque conforme abaixo:
- Name: ForEachNome
- Counter Name: ForEachContador
Agora na guia Counter Values, em Start Value coloque 1 no campo Expression e em Final Value clique sobre o ícone que parece uma pequena calculadora conforme abaixo:
Na caixa que se abrirá em Advanced Functions escolha a opção BPEL XPath Extension Functions
Dê um duplo clique sobre a opção ora:countNodes()
Dentro do parêntese de ora:countNodes() coloque duas aspas simples e dentro das aspas simples aperte Control do seu teclado e ao mesmo tempo a barra de espaço, veja que aparecerão as opções abaixo:
- inputVariable
- outputVariable
- ForEachCont…
Selecione a opção inputVariable, coloque uma virgula após o nome, e coloque novamente duas aspas simples e dentro das aspas selecione a opção payload que irá aparecer, novamente coloque uma virgula e acrescente mais duas aspas simples e dentro das aspas selecione a opção client:nome que irá aparecer, então ficará conforme abaixo:
ora:countNodes(‘inputVariable’,’payload’,’client:nome’)
Clique em OK e ficará assim:
Clique em OK novamente e arraste um componente Assign acima de nosso ForEach e renomeie o nome Assign1 dando um duplo clique sobre o nome e coloque a palavra Olá pressionando Enter em seguida, conforme abaixo:
Dentro de nosso Olá que é nossa caixinha de variável, expanda a opção outputVariable >> payload >> client:processResponse >> client:result e para dentro dela arraste o ícone acima que parece uma pequena calculadora
Dentro da caixa que será aberta acrescente o nome Olá: seguido de um espaço entre aspas simples conforme abaixo e clique em OK
Agora para dentro de nosso ForEachNome arraste outro Assign e o renomeie para o nome Concatena
Abra a nossa caixinha Concatena novamente arraste o ícone que parece uma pequena calculadora ou simplesmente clique com o botão direito sobre o nome client:result (outputVariable >> payload >> client:processResponse >> client:result) e clique em Expression
Em Advanced Functions escolha a opção String Functions
Dê um duplo clique sobre o nome concat e dentro dos parenteses de concat() de um duplo clique em client:result do seu outputVariable (outputVariable >> payload >> client:processResponse >> client:result)
Acrescente uma virgula após o result e uma aspas simples, dê um espaço e acrescente novamente mais uma aspas simples seguida de uma virgula e dê agora um duplo clique em client:nome agora do seu inputVariable (inputVariable >> payload >> client:process >> client:nome)
Ao lado de nome acrescente [] e dentro dos colchetes acrescente o nome do nosso For Each ($ForEachContador, aqui preste atenção que foi acrescentado o cifrão ($) identificando que é uma variável), dando um duplo clique sobre ele e ao lado do colchetes que foi fechado acrescente uma virgula, uma aspas simples, novamente uma virgula e novamente uma aspas simples conforme abaixo:
concat($outputVariable.payload/client:result,’ ‘,$inputVariable.payload/client:nome[$ForEachContador],’,’)
Clique em OK
Clique em OK novamente na tela acima
Agora arraste um outro Assign abaixo do seu ForEachNome e renomeie para TudoBem
Dentro da sua caixa TudoBem em client:result acrescente a expression abaixo:
concat($outputVariable.payload/client:result,’ tudo bem ?’)
Clique em OK
Clique em OK novamente na tela acima
Realize o deploy localmente do nosso projeto e vamos testa-lo
No seu Browser vá no endereço http://localhost:10000/em
Obs: A porta 10000 é o numero que escolhi ao criar o meu Domínio.
Faça o Login:
Clique no seu projeto: ForEachBpel[1.0]
Clique em Test
Abaixo em input coloque 3 onde aparece o 0, pois será o tamanho de nosso array, em seguida clique no ícone ao lado
Feito isso será aberta a tela abaixo para inserirmos 3 nomes, então preencha-os e clique em Test Web Service
Na guia Response, veja o resultado
Duvidas ? Deixe seu comentário e faça download deste Projeto
Abraços e até a Próxima
/:-D
Altieres Jesus said:
Boa tarde,
Muito bom este seu post.
Eu tenho uma situação e gostaria de saber se você pode me ajudar a resolver, estou realizando um loop parecido com este seu, a diferença é que para cada item estou realizando um invoke de outro bpel, e o que ocorre é que é sempre enviado o ultimo item da lista em todas as chamadas.
Sabe me dizer se já passou por um problema como este?
Obrigado.
Altieres Jesus said:
Consegui resolver colocando o invoke dentro de um scope e comvariaveis locais…
Uans said:
Show de bola Altierres,
Se tiver alguma outra duvida estou a disposição.
Abraços
Uans