BPEL

ForEach do BPEL mais Prático

Em um exemplo anterior escrevi um artigo de como fazemos para usar o ForEach do BPEL, mas neste exemplo estarei mostrando uma forma mais prática ou mais usual que é usado no dia a dia, onde fazemos a invocação de um serviço que retornará uma lista de Empregados no Oracle XE e posteriormente iremos trabalhar na iteração desta lista.

Neste primeiro passo faça o download do arquivo ForEachMaisPratico.zip e extraia o nosso WSDL que usaremos para nosso exemplo.

Crie um novo projeto chamado ForEachMaisPratico

Imagem Blog UansCarvalho

Dentro do seu composite.xml arraste um Database Adapter para External References e dê o nome de ListaEmpregadosDbAdapter

Aqui explicarei rapidamente as opções que estou selecionando visto que nosso foco será nosso ForEach

Selecione a opção Select

Imagem Blog UansCarvalho

Estou aqui importando a tabela EMPLOYEE

Imagem Blog UansCarvalho

Abaixo cliquei em Remove para remover os dois relacionamentos que Neste Caso NÃO são necessários.

Imagem Blog UansCarvalho

Veja abaixo os campos que faremos o Select.

Imagem Blog UansCarvalho

Imagem Blog UansCarvalho

Temos então nosso DBAdapter Criado.

Imagem Blog UansCarvalho

Copie o arquivo ForEachMaisPratico.wsdl para dentro do seu projeto BPEL

Imagem Blog UansCarvalho

Arraste agora um BPEL Process e escolha a opção Base on a WSDL para selecionar este WSDL

Imagem Blog UansCarvalho

Depois ligue o BPEL no nosso DBAdapter

Imagem Blog UansCarvalho

Abra o ForEachBPEL e dentro dele arraste um Invoke e aponte para nosso Partner Link

Dê o nome de Invoke_ListaEmpregados, crie as variaveis de input e OutPut

Imagem Blog UansCarvalho

Deverá ficar conforme abaixo:

Imagem Blog UansCarvalho

Vamos agora criar uma variável para referenciar nosso Response do WSDL

Clique então no (X) conforme abaixo para criarmos essa variável

Imagem Blog UansCarvalho

Dê o nome de var_consultarEmpregadosResponse e escolha a opção Element e clicando na Lupa navegue nas pastas conforme abaixo até chegar dentro do nosso WSDL na operação ConsultarEmpregadosResponse

Imagem Blog UansCarvalho

Clique em OK acima e ficará conforme abaixo:

Imagem Blog UansCarvalho

Clique agora ainda nesta caixa, na aba Initialize para inicializarmos nossa listaEmpregado conforme a operação ConsultarEmpregadosResponse em nosso WSDL

Já na aba Initialize na opção Type selecione Literal e dentro cole o trecho de XML abaixo:

<ConsultarEmpregadosResponse xmlns="br.com.uanscarvalho.model">
<listaEmpregado>
</listaEmpregado>
</ConsultarEmpregadosResponse>

Imagem Blog UansCarvalho

Para que você entenda o XML:

Estou colocando as tags da nossa operação de Response e na frente dela coloco em xmlns o targetNamespace do nosso WSDL

Dentro da operação de Response coloco a listaEmpregado conforme está no WSDL

Após clicar em OK acima, ficará conforme abaixo:

Imagem Blog UansCarvalho

Arraste agora um ForEach abaixo do nosso Invoke_ListaEmpregados

Imagem Blog UansCarvalho

Dê um duplo clique sobre a caixa do nosso ForEach para edita-lo

Em Name: coloque ForEach e em Counter Name: coloque ForEachCounter

Imagem Blog UansCarvalho

Clique agora na aba Counter Values e em na primeira Expression coloque o numero 1 e na segunda Expression clique ao lado no ícone onde parece ser uma calculadora

Imagem Blog UansCarvalho

Abaixo faça por partes o seguinte:

Coloque primeiro a função ora:countNodes()

Imagem Blog UansCarvalho

Agora dentro da função coloque duas aspas simples e DENTRO da aspas simples aperte a tecla CONTROL + ESPAÇO e escolha a opção Invoke_ListaEmpregados_ListaEmpregadosDbAdapterSelect_OutputVariable do seu teclado

Imagem Blog UansCarvalho

Continuando, agora ao lado da aspas simples coloque uma virgula e mais uma aspas simples, aperte a tecla CONTROL + ESPAÇO novamente e escolha então a opção EmployeeCollection

Imagem Blog UansCarvalho

Novamente ao lado da aspas simples coloque mais uma virgula e mais uma aspas simples e escolha a opção ns3:Employee/

Imagem Blog UansCarvalho

Agora ao lado da / aperte novamente CONTROL + ESPAÇO do seu teclado e escolha a opção ns3:empno e ao lado feche a tag acrescentando uma aspas simples e ficará conforme abaixo (Veja e expressão inteira)

Obs: Aqui coloquei passo a passo a expressão porque é muito importante as aspas simples e a virgula entre eles ou nosso ForEach não funcionará

countNodes('Invoke_ListaEmpregados_ListaEmpregadosDbAdapterSelect_OutputVariable','EmployeeCollection','ns3:Employee/ns3:empno')

Imagem Blog UansCarvalho

Ficará então conforme abaixo:

Imagem Blog UansCarvalho

Dentro do ForEach ao lado esquerdo clique no (X) para adicionarmos mais uma variável (Este (X) está dentro de nosso Escopo) conforme abaixo:

Imagem Blog UansCarvalho

Esta variável fará referencia ao tipoEmpregado que também referencia o EmpregadoType conforme linha abaixo do nosso WSDL:

<xsd:element name=”tipoEmpregado” type=”inter:EmpregadoType”/>

Obs: Este elemento foi criado exclusivamente para ser usado em nosso ForEach para representar nosso EmpregadoType o qual tem os outros elementos que compõem nosso EmpregadoType como codigoEmpregado, nomeEmpregado e etc..

<xsd:element name=”tipoEmpregado” type=”inter:EmpregadoType”/>

<xsd:complexType name=”EmpregadoType”>
     <xsd:sequence>
          <xsd:element name=”codigoEmpregado” type=”xsd:integer”/>
          <xsd:element name=”nomeEmpregado”   type=”xsd:string” />
          ...
     </xsd:sequence>
</xsd:complexType

Dê o nome de var_tipoEmpregado e escolha a opção Element e clicando na Lupa navegue nas pastas conforme abaixo até chegar dentro do nosso WSDL no tipoEmpregado

Imagem Blog UansCarvalho

Clique em OK e ficará conforme abaixo:

Imagem Blog UansCarvalho

Clique novamente em OK

Imagem Blog UansCarvalho

Arraste agora um Assign abaixo do nosso ForEach e dê o nome de Seta_Index_Nas_Variaveis

Imagem Blog UansCarvalho

Abra agora este Seta_Index_Nas_Variaveis e dentro dele ligue nosso ns3:empno que está ao lado esquerdo que é o elemento de resposta do nosso Invoke para o ns1:codigoEmpregado ao lado direito que está dentro da variável var_tipoEmpregado que criamos dentro do Scope1 conforme abaixo:

Imagem Blog UansCarvalho

Dê agora um duplo clique na linha que ele criou mas do lado do From e você verá a tela abaixo:

Imagem Blog UansCarvalho

Em Empression coloque ao lado do ns3:Employee o [$ForEachCounter].

Veja a expressão como ficará:

Obs: Veja que o [$ForEachCounter] está entre colchetes e está antes da barra / do ns3:empno

$Invoke_ListaEmpregados_ListaEmpregadosDbAdapterSelect_OutputVariable.EmployeeCollection/ns3:Employee[$ForEachCounter]/ns3:empnovoke_ListaEmpregados_ListaEmpregadosDbAdapterSelect_OutputVariable.EmployeeCollection/ns3:Employee[$ForEachCounter]/ns3:empno

Imagem Blog UansCarvalho

Clique em OK e agora repita todo este procedimento para os demais elementos colocando também o nome [$ForEachCounter] antes de cada elemento dentro da Expression

Imagem Blog UansCarvalho

Clique em OK e abaixo do Seta_Index_Nas_Variaveis arraste um IF

Imagem Blog UansCarvalho

Aqui vou acrescentar uma lógica bem simples apenas para que você entenda que aqui deverá ser sua lógica

Neste IF estarei colocando SE o nome do Empregado for igual a UANS, deverá acrescentar 100 ao salário mostrando também os demais elementos da lista

Mas é interessante você prestar atenção que estou usando da variável var_tipoEmpregado pois foi nela que atribuímos nosso response de nossa Consulta(Invoke) conforme passos acima

Imagem Blog UansCarvalho

Imagem Blog UansCarvalho

Dentro do IF no caso de ser verdadeiro acrescente um Assign para podermos adicionar 100 ao salário

Imagem Blog UansCarvalho

Aqui eu liguei salário com salário mas ao acrescentar o valor + 100 ele mesmo joga essa linha para o ns1:tipoEmpregado (isso é normal)

Dei o nome para esta Assign de Adicona_100_salario_UANS e ao lado direito no ELSE arraste uma EMPTY e dê o nome de Continua_Fluxo

Imagem Blog UansCarvalho

Ainda dentro do seu ForEach abaixo do seu IF acrescente mais um Assign e dê o nome de Adiciona_na_Lista

Imagem Blog UansCarvalho

Abra esse Assign e faremos então a atribuição da nossa variável var_tipoEmpregado para nossa variável var_ConstaEmpregadosResponse que criamos no começo do nosso Fluxo:

Para que você entenda:

A variável var_tipoEmpregado já esta sendo preenchida a cada execução do Loop e depois estamos adicionando estes dados na nossa listaEmpregado que é o elemento dentro do nosso Response do WSDL no caso o ConsultaEmpregadosResponse

Imagem Blog UansCarvalho

Após esta ligação ao lado do From você deverá clicar com o botão direito e deverá aparecer um pequeno menu conforme abaixo, então vá até Change rule type e escolha a opção Append

Imagem Blog UansCarvalho

Após o passo acima, agora para terminar, fora do nosso ForEach acrescente mais um Assign e dê o nome de Seta_OutPut

Imagem Blog UansCarvalho

Neste Assign apenas adicionaremos o conteúdo de nossa variável var_ConstaEmpregadosResponse que já foi toda preenchida por causa do nosso FOR para nosso OutPut e devolver esse resultado

Imagem Blog UansCarvalho

Aqui eu liguei o var_consultarEmpregadosResponse ao ns1:ConsultarEmpregadosResponse do outputVariable mas é normal ele ficar ligado no parameters conforme acima

Pronto, agora é só fazer o deploy do nosso projeto e testar.

Abaixo mostro UMA PARTE do XML retornado após nosso Teste.

Imagem Blog UansCarvalho

Veja acima que onde está o salário para o nomeEmpregado UANS ele adicionou 100, retornando o valor de 1100.

Abaixo o Select na Tabela:

Imagem Blog UansCarvalho

Duvidas ? Deixe seu comentário e faça download deste Projeto :-)

 

Abraços e até a Próxima

/:-D

 

 

Criei este Blog destinado a desenvolvedores e interessados na Tecnologia Oracle SOA Suite, minha idéia é que no futuro ele sirva de referência para Analistas e Desenvolvedores desde aprendizes a especialistas. Já existem alguns Posts interessantes que abordam um pouco do meu dia a dia, no passar do tempo irei alimentar este Blog com o máximo de informações possíveis, por isso peço por gentileza aos interessados e afins que caso tenham alguma dúvida, sugestão ou crítica que me digam para que eu possa da melhor forma suprir as expectativas e na medida do possível sanar todas as duvidas que vierem a surgir ou até mesmo criar novos Posts abordando algum tópico que venha a ser relevante para todos os interessados. Obrigado Uans Carvalho

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *