Tags
Vamos agora realizar a gravação do conteúdo do nosso arquivo citado na Parte 2 em nosso Banco de Dados, lembrando que para todos os projetos que desenvolvo aqui no Blog eu uso as tabelas já existente ao instalarmos o Oracle XE.
Faremos a gravação do conteúdo do arquivo.txt em nossa tabela DEPARTMENT que já vem criada automaticamente ao instalarmos nosso Banco.
Consulte os Links abaixo para verificar as demais partes deste nosso Projeto:
- Trabalhando com FileAdapter no BPEL – Parte 1: Lendo o arquivo de um diretório
- Trabalhando com FileAdapter no BPEL – Parte 2: Lendo o conteúdo do arquivo
- Trabalhando com FileAdapter no BPEL – Parte 3: Gravando o conteúdo do arquivo no Banco de Dados
- Trabalhando com FileAdapter no BPEL – Parte 4: Renomeando ou Movendo um arquivo
- Trabalhando com FileAdapter no BPEL – Parte 5: Deletando um arquivo
Para esta parte do Projeto vamos precisar usar o DBAdapter para fazer o Insert das informações no banco de dados, para isso vou utilizar nosso projeto já criado aqui no Blog que é o InsertDBAdapter.
Então importe este projeto para que fique conforme abaixo:
Agora em nosso projeto FileAdapterBPEL vamos precisar chamar nosso Serviço InsertDBAdapter e para isso vamos precisar importar para dentro do nosso projeto o WSDL e XSD do InsertDBAdapter
Então faça o Deploy Local no seu JDeveloper deste projeto InsertDBAdapter:
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 do BPEL
Faça o Login:
Clique no seu projeto: InsertDBAdapter[1.0]
Clique em Test
Em WSDL copie o caminho: http://localhost:10000/soa-infra/services/default/InsertDBAdapter/insertdbadapterbpel_ep?WSDL
Cole agora na URL do seu Browser e com o botão direito clique em View Page Source:
Abaixo veja parte do WSDL
Copie o conteúdo e crie um arquivo no seu BPEL com o nome InsertDbAdapter.wsdl e cole o conteúdo que copiamos acima.
Deverá então ficar conforme estrutura abaixo:
Agora copie o InsertDBAdapterBPELProcess.xsd que esta dentro do seu Projeto InsertDBAdapter para dentro do nosso projeto FileAdapterBPEL na pasta XSD conforme abaixo:
Agora abra seu arquivo InsertDbAdapter.wsdl do seu projeto FileAdapterBPEL
Veja a linha onde está o import do InsertDBAdapterBPELProcess.xsd que está assim:
<import namespace="http://xmlns.oracle.com/UansBlogApplication/InsertDBAdapter/InsertDBAdapterBPELProcess" schemaLocation="http://localhost:10000/soa-infra/services/default/InsertDBAdapter/insertdbadapterbpel_ep?XSD=xsd/InsertDBAdapterBPELProcess.xsd"/>
Altere apenas o schemaLocation para que fique assim:
<import namespace="http://xmlns.oracle.com/UansBlogApplication/InsertDBAdapter/InsertDBAdapterBPELProcess" schemaLocation="xsd/InsertDBAdapterBPELProcess.xsd"/>
Pronto, isso já resolverá o problema do nosso WSDL
Agora volte ao seu composite.xml e arraste o componente Web Service para External References
Coloque as seguintes configurações:
- Name: InsertDbAdapter
- WSDL URL: Procure o WSDL InsertDbAdapter.wsdl que copiamos para dentro do nosso projeto FileAdapterBPEL conforme passos anteriores.
- Port Type: InsertDBAdapterBPELProcess
- Callback Port Type: —- No Callback —–
Agora ligue nosso LerArquivoBPELProcess para nosso Web Service InsertDbAdapter e deverá ficar conforme abaixo:
Abra agora nosso arquivo dadosArquivo.xsd e vamos renomear alguns campos para ficarem claros que representam na nossa Tabela DEPARTMENT de nosso banco de dados XE onde deverão ser gravados os dados que estarão dentro de nosso arquivo.txt
Está conforme abaixo:
xsd:element name="Arquivo"> <xsd:complexType> <xsd:sequence> <xsd:element name="Arquivo" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="header" type="xsd:string" nxsd:style="fixedLength" nxsd:length="5" /> <xsd:element name="detail" type="xsd:string" nxsd:style="fixedLength" nxsd:length="5" /> <xsd:element name="detail" type="xsd:string" nxsd:style="fixedLength" nxsd:length="9" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
Altere apenas os nomes, header, detail e o segundo detail para que fique assim:
xsd:element name="Arquivo"> <xsd:complexType> <xsd:sequence> <xsd:element name="Arquivo" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="numeroDepartamento" type="xsd:string" nxsd:style="fixedLength" nxsd:length="5" /> <xsd:element name="nomeDepartamento" type="xsd:string" nxsd:style="fixedLength" nxsd:length="5" /> <xsd:element name="localDepartamento" type="xsd:string" nxsd:style="fixedLength" nxsd:length="9" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
Abra agora nosso LerArquivoBPELProcess.bpel
Dentro do Loop (LendoArquivo), abaixo da caixa Empty DadosProcessados arraste um componente For Each pois ele será necessário para iterarmos as linhas do conteúdo do nosso arquivo.
Renomeie nosso For Each para ForEachLinhas e deverá ficar assim:
Abra o For Each e coloque o seguinte:
- Name: ForEachLinhas
- Counter Name: ForEachContador
Clique agora na guia Counter Values e em:
- Start Value em Expression coloque o valor 1
- Final Value em Expression clique ao lado no ícone que parece uma calculadora e coloque a expressão abaixo:
ora:countNodes('InvokeLerArquivo_SynchRead_OutputVariable','body','ns4:Arquivo')
Obs: Veja que estou usando a função ora:countNodes() para iterarmos nosso elemento Arquivo que representa nossa lista conforme definido no nosso XSD dadosArquivo.xsd
Então primeiro insira a função ora:countNodes() e dentro dos parênteses da função aperte a tecla Control + Espaço do seu teclado e escolha a opção InvokeLerArquivo_SynchRead_OutputVariable agora coloque uma virgula , e novamente aperte Control + Espaço então escolha body e novamente coloque uma virgula , e aperte Control + Espaço e escolha a opção ns4:Arquivo e agora coloque esse ultimo entre aspas simples, no caso ‘ns4:Arquivo’
Veja como ficará:
Veja acima que os nomes ficaram logo após uma virgula e estão entre aspas simples, isso é muito importante ou ocorrerão erros posteriores em função disto
Então posteriormente teremos a seguinte tela:
Agora para dentro do nosso For Each arraste um Assing e renomeie para IniciaVariaveisInvoke e abaixo arraste um Invoke e renomeie para InvokeInsertDbAdapterBPEL
Ligue nosso InvokeInsertDbAdapterBPEL para o InsertDbAdapter que está em nosso Partner Links
Em Input clique no Sinal de + para definirmos nossa variável de Input e clique em OK em seguida
Agora abra nosso IniciaVariaveisInvoke e vamos ligar a saída do OutPut do InvokeLerArquivo com o Input de nosso InsertDBAdapterBPELProcess
Ainda nesta tela em From do seu lado esquerdo dê um duplo clique na linha onde ligamos o numeroDepartamento
Ele estará com a seguinte Expression:
$InvokeLerArquivo_SynchRead_OutputVariable.body/ns4:Arquivo/ns4:numeroDepartamento
Então altere para
number($InvokeLerArquivo_SynchRead_OutputVariable.body/ns4:Arquivo[$ForEachContador]/ns4:numeroDepartamento)
Para que você entenda:
Usei a função number() para converter o numeroDepartamento para um tipo numérico já que no XSD dadosArquivo.xsd ele é String e no Banco de Dados é um NUMBER
Usei o nome o [$ForEachContador] depois de Arquivo pois ele é a nossa lista e será o que irá repetir, por isso a cada repetição do nosso For Each ele irá iterar também as linhas de nosso arquivo
Faça também o mesmo procedimento colocando o [$ForEachContador] para as Expressions, no caso ficará assim:
$InvokeLerArquivo_SynchRead_OutputVariable.body/ns4:Arquivo[$ForEachContador]/ns4:nomeDepartamento
$InvokeLerArquivo_SynchRead_OutputVariable.body/ns4:Arquivo[$ForEachContador]/ns4:localDepartamento
Vamos agora testar nosso processo:
Faça o deploy localmente do seu projeto lembrando de apontar para nosso arquivo FileAdapterBPEL_cfgplan.xml
Vamos fazer o teste para ter certeza que tudo funcionou perfeitamente.
Vá no diretorio /home/uans/Arquivos (ou onde você definiu o caminho conforme seu Config Plan) e abra o arquivo.txt
Dentro dele coloque o seguinte conteúdo:
1011 SIST SAOPAULO 1012 SIST BRASILIA 1013 SIST PENAPOLI
Obs: Lembre-se que não podem haver espaços no final dos nomes para não termos problemas
Agora para se certificar de que seus dados foram inseridos com sucesso, veja no seu banco de Dados o conteúdo que colocamos no arquivo.txt acima foi inserido na tabela corretamente
Obs: Lembre-se que nosso processo esta verificando nossa pasta onde esta o arquivo.txt de 5 em 5 segundos
Duvidas ? Deixe seu comentário e faça download deste Projeto
Abraços e até a Próxima
/:-D