Cícero Ednilson

Blog sobre Desenvolvimento de Softwares

Home » Soa Suite 12c – Criando um Web Service no BPEL para calcular a diferença entre datas.

Soa Suite 12c – Criando um Web Service no BPEL para calcular a diferença entre datas.

0 Flares Twitter 0 Facebook 0 Filament.io 0 Flares ×

Nesse tutorial vamos aprender a criar um Web Service no BPEL para calcular a diferença entre datas, vamos usar um wsdl que já deixei pronto aqui.

Você pode querer ler também:

Instalando o ambiente de desenvolvimento Soa Suite 12c no Ubuntu

O que vamos aprender com esse tutorial ?

  • usar um enumeration no WSDL.
  • conhecer o componente Assign.
  • conhecer o componente Java Embedding .
  • criar variáveis no BPEL.
  • como usar o if, elseif e else no BPEL.
  • funções de data do BPEL.
  • funções de matemática do BPEL.
  • realizar o deploy no Weblogic/Oracle Enterprise Manager.

Para muitas pessoas os itens que descrevi acima são básicos, mas para quem está começando agora com o BPEL pode ser de grande ajuda.

Vamos dar início a criação do nosso Web Service, para isso vamos abrir o Jdeveloper e vamos clicar no botão New e vamos selecionar a opção Application…

1

Na tela que foi aberta vamos digitar no campo pesquisa soa ap, e depois vamos selecionar SOA Application (Applications) e clicar em OK.

2

Agora no campo Application Name vou colocar o valor ApplicationCalcularData e em Apllication Package Prefix vou colocar br.com.ednilson.cicero, mas você pode colocar um valor da sua preferência e depois vamos clicar em Next.

3

Agora no campo Project Name vamos colocar o valor CalcularData e depois clicar em Next.

4

Agora vamos selecionar Empty Composite e depois vamos clicar em Finish.

5

Pronto, podemos ver o nosso projeto criado.

6

Agora na pasta WSDL vamos clicar com o botão direito e vamos até From Galery…

7

Agora vamos selecionar o item File e clicar no botão OK como mostra a imagem abaixo.

8

Na tela que foi aberta no campo File Name vamos colocar o valor CalcularData.wsdl e em Directory devemos conferir se está o caminho do nosso diretório WSDLs, e depois podemos clicar em OK.

9

Podemos ver o nosso arquivo criado na pasta WSDLs, agora vamos clicar na aba Source como mostra a imagem abaixo.

10

vamos copiar o código abaixo e colar no nosso arquivo que criamos, ou se preferir pode copiar o WSDL que ja deixei pronto para download no início desse tutorial.

<?xml version=”1.0″ encoding=”UTF-8″?>
<wsdl:definitions
     name=”pessoa”
     targetNamespace=”br.com.ednilson.cicero”
     xmlns:tns=”br.com.ednilson.cicero”
     xmlns:wsdl=”http://schemas.xmlsoap.org/wsdl/”
     xmlns:soap=”http://schemas.xmlsoap.org/wsdl/soap/”
    >
    <wsdl:types>
        <xsd:schema attributeFormDefault=”unqualified” elementFormDefault=”qualified” targetNamespace=”br.com.ednilson.cicero”
             xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:inter=”br.com.ednilson.cicero”>
            <xsd:simpleType name=”DataType”>
                <xsd:restriction base=”xsd:string”>
                    <xsd:enumeration value=”dias”/>
                    <xsd:enumeration value=”semanas”/>
                    <xsd:enumeration value=”meses”/>
                    <xsd:enumeration value=”ano”/>
                </xsd:restriction>
            </xsd:simpleType>
            <xsd:element name=”CalcularDiferencaDatasRequestType”>
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element minOccurs=”1″ name=”dataInicial” nillable=”false” type=”xsd:dateTime”/>
                        <xsd:element minOccurs=”1″ name=”dataFinal” nillable=”false” type=”xsd:dateTime”/>
                        <xsd:element minOccurs=”1″ name=”tipoResultado” nillable=”false” type=”inter:DataType”/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name=”CalcularDiferencaDatasResponseType”>
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element minOccurs=”1″ name=”diferenca” nillable=”false” type=”xsd:integer”/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name=”CalcularDiferencaDatasRequest”>
        <wsdl:part name=”parameters” element=”tns:CalcularDiferencaDatasRequestType”/>
    </wsdl:message>
    <wsdl:message name=”CalcularDiferencaDatasResponse”>
        <wsdl:part name=”parameters” element=”tns:CalcularDiferencaDatasResponseType”/>
    </wsdl:message>
    <wsdl:portType name=”Data_ptt”>
        <wsdl:operation name=”CalcularDiferencaDatas” parameterOrder=”parameters”>
            <wsdl:input message=”tns:CalcularDiferencaDatasRequest”/>
            <wsdl:output message=”tns:CalcularDiferencaDatasResponse”/>
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

Podemos ver nosso arquivo com o código que adicionamos, depois podemos dar um Ctrl + S para salvar as alterações e já podemos fechar o nosso WSDL.

11

Agora em nosso composite vamos clicar com o botão direito em Exposed Services e em Insert vamos selecionar a opção SOAP.

12

Na tela que foi aberta vamos colocar o valor CalcularDataService no campo Name e depois no campo WSDL URL vamos clicar no botão que tem o icone @ para procurar o nosso WSDL.

13

Na tela que foi aberta vamos clicar em File System e vamos localizar o nosso wsdl, depois vamos clicar em OK.

14

Agora na tela de criação do nosso Web Service vamos clicar em OK.

15

Podemos ver o nosso componente Soap(Web Service) criado.

16

Agora em Components vamos clicar com o botão direito e vamos até BPEL Process.

17

Na tela que foi aberta no campo Name vamos colocar o valor Calcular, em Template vamos selecionar a opção Base on a WSDL, vamos desmarcar a opção Expose as a SOAP service e depois em WSDL URL vamos clicar no botão que tem um ícone de @ para localizarmos nosso WSDL.

18

Em File System vamos selecionar o nosso WSDL e vamos clicar em OK.

19

Na tela de criação do nosso processo BPEL vamos clicar em OK.

20

Podemos ver no nosso projeto o nosso processo BPEL criado, agora vamos fazer uma ligação do nosso componente SOAP(Web Service) para o nosso componente BPEL, depois podemos dar um Ctrl + S para salvar as nossas alterações.

21

Agora vamos dar um duplo click sobre o nosso componente BPEL(componente Azul) e o mesmo vai abrir o arquivo Calcular.bpel.

22

Agora vamos criar as variáveis que vamos usar no nosso processo BPEL, para isso vamos clicar no ícone Variables… como mostra a imagem abaixo.

28

Na tela que foi aberta vamos clicar no sinal de +.

29

Na tela que foi aberta vamos  colocar o valor var_dataInicialEmMilissegundo no campo Name, depois vamos deixar selecionado o tipo Type e clicar na lupa como mostra a imagem abaixo.

00030

Na tela que foi aberta em XML Schema Simple Types vamos selecionar o tipo long, e depois podemos clicar em OK.

31

Agora na tela de criação da nossa variável vamos apenas clicar em OK.

32

Agora podemos ver a nossa variável criada.

33

Agora vamos criar outras variáveis como mostra a tela abaixo, devemos seguir os mesmos passos de criação da var_dataInicialEmMilissegundo que fizemos anteriormente, depois podemos clicar em OK.

34

Agora vamos arrastar um If para baixo do nosso receiveInput, esse If vai servir para definirmos o tipo de resultado que vamos querer do nosso serviço, se vai ser em dias, semanas, meses ou anos, esses parâmetros estão definidos no nosso WSDL como enumeration na request.

23

Abaixo podemos ver o nosso enumeration no WSDL.

26

Agora vamos clicar com o botão direito sobre o If e vamos selecionar a opção Edit.

24

Na tela que foi aberta vamos colocar o valor If_tipo_resultado no campo Name e depois vamos clicar no ícone que tem uma calculadora para colocarmos a nossa condição.

36

Agora vamos dar um duplo click sobre o nosso ns1:tipoResultado que vai ser jogado no campo Expression, e depois vamos colocar na frente = ‘dias’, como mostra a image abaixo, o ns1:tipoResultado vem da nossa request que definimos no nosso WSDL, depois já podemos clicar em OK.

Expressão: $inputVariable.parameters/ns1:tipoResultado = ‘dias’

37

A tela de edição do if  deve ficar como mostra a imagem abaixo, depois podemos clicar em OK.

38

Agora no if vamos dar um click sobre o nome label e na popup que foi aberta vamos colocar o valor resultado em dias e depois vamos clicar em OK, isso é apenas uma descrição para sabermos o que vamos fazer nesse if.

000027

Agora vamos dar um click na aba Source do nosso processo BPEL.

39

Vamos colocar o bloco de código abaixo dentro da tag process, essas referências servem para podermos usar as classes Java em um componente BPEL chamado Java Embedding que vamos ver mais a frente.

  <import location=”oracle.xml.parser.v2.XMLElement” importType=”http://schemas.oracle.com/bpel/extension/java”/>
  <import location=”java.text.SimpleDateFormat” importType=”http://schemas.oracle.com/bpel/extension/java”/>
  <import location=”java.text.ParseException” importType=”http://schemas.oracle.com/bpel/extension/java”/>
  <import location=”java.util.Calendar” importType=”http://schemas.oracle.com/bpel/extension/java”/>

Abaixo podemos ver nosso arquivo alterado, depois podemos voltar ao modo Design no BPEL.

000040

Agora abaixo do nosso if vamos arrastar um componente Java Embedding.

41

Depois vamos clicar com o botão direito sobre o nosso Java Embedding e clicar na opção Edit.

42

Na tela que foi aberta no campo Name vamos colocar o valo Java_Embedding_ms e no campo Code Snippet  vamos colar o código abaixo, nesse código vamos pegar o valor dos campos de data da nossa request e vamos converter em milissegundos.



try{
    
    
   
    XMLElement xmlElementDataInicial = (XMLElement)getVariableData("inputVariable","parameters","/ns1:CalcularDiferencaDatasRequestType/ns1:dataInicial");
    XMLElement xmlElementDataFinal = (XMLElement)getVariableData("inputVariable","parameters","/ns1:CalcularDiferencaDatasRequestType/ns1:dataFinal");

    String strDataInicial = xmlElementDataInicial.getTextContent();
    String strDataFinal   = xmlElementDataFinal.getTextContent();


    strDataInicial = strDataInicial.replace("T"," ");
    strDataFinal   = strDataFinal.replace("T"," ");

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Calendar calendarDataInicial = Calendar.getInstance();
    Calendar calendarDataFinal   = Calendar.getInstance();

    calendarDataInicial.setTime(sdf.parse(strDataInicial));

    calendarDataFinal.setTime(sdf.parse(strDataFinal));
   
    /*Remover hora da data inicial */
    calendarDataInicial.set(calendarDataInicial.get(Calendar.YEAR),
                            calendarDataInicial.get(Calendar.MONTH),
                            calendarDataInicial.get(Calendar.DAY_OF_MONTH), 0, 0, 0);

    /*Remover hora da data final */
    calendarDataFinal.set(calendarDataFinal.get(Calendar.YEAR),
                          calendarDataFinal.get(Calendar.MONTH),
                          calendarDataFinal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
   

    setVariableData("var_dataInicialEmMilissegundo", calendarDataInicial.getTimeInMillis());

    setVariableData("var_dataFinalEmMilissegundo", calendarDataFinal.getTimeInMillis());

} catch (Exception e){         
    System.out.println("exception "+e.getMessage());
    addAuditTrailEntry(e);
}


Abaixo podemos ver como ficou nosso Java Embedding, estamos usando esse componente por que precisamos converter as datas em milissegundos, depois basta clicar em OK.

43

Agora vamos arrastar um componente Assign para baixo do nosso Java Embedding, com o Assign vamos realizar a atribuição de valores a um determinado objeto.

45

Agora vamos dar um duplo click sobre o nosso Assign1, e na tela que foi aberta vamos na aba General e no campo Name vamos colocar o valor Assign_calcular_dias, depois vamos até a aba Copy Rules e do lado direito vamos clicar com o botão direito do mouse em var_diferenca e vamos selecionar em Expression.

46

Na tela que foi aberta vamos colocar a expressão (($var_dataFinalEmMilissegundo – $var_dataInicialEmMilissegundo)  div  (24*3600*1000)), se você não quiser copiar a expressão que está pronta, você pode ir clicando sobre as variáveis e funções como mostra a imagem abaixo, depois basta clicar em OK.

O que fizemos na nossa expressão (($var_dataFinalEmMilissegundo – $var_dataInicialEmMilissegundo)  div  (24*3600*1000)) ?

Primeiro vamos buscar a diferença entre as datas em milissegundos e depois vamos dividir pelo número de milissegundos de um dia.

 

47

Agora podemos ver o que nossa variável var_diferenca vai receber, depois basta clicar em OK.

48

Nossa primeira regra para calcular a diferença em dias está pronta como mostra a imagem abaixo.

49

Agora no nosso componente If vamos clicar no sinal de mais e selecionar Else If como mostra a imagem abaixo.

50

Podemos ver que foi criado um elseif como mostra a imagem abaixo.

51

Vamos dar um click no Label do nosso elseif e vamos colocar o valor “resultado em semanas”, depois vamos dar um duplo click para aparecer a tela de edição do nosso elseif, com a tela de edição aberta vamos clicar no ícone da calculadora.

54

Na tela que foi aberta vamos adicionar a expressão como mostra a imagem abaixo, depois basta clicar em OK.

55

Na tela de edição vamos apenas clicar em OK.

56

Agora vamos arrastar um componente Java Embedding para baixo do nosso elseif como mostra a imagem abaixo.

57

Agora vamos dar um duplo click sobre o nosso Java_Embedding1, e na tela que foi aberta no campo Name vamos colocar o valor Java_Embedding_ms e em Code Snippet vamos adicionar o bloco de código abaixo.

 



try{
    
    
   
    XMLElement xmlElementDataInicial = (XMLElement)getVariableData("inputVariable","parameters","/ns1:CalcularDiferencaDatasRequestType/ns1:dataInicial");
    XMLElement xmlElementDataFinal = (XMLElement)getVariableData("inputVariable","parameters","/ns1:CalcularDiferencaDatasRequestType/ns1:dataFinal");

    String strDataInicial = xmlElementDataInicial.getTextContent();
    String strDataFinal   = xmlElementDataFinal.getTextContent();


    strDataInicial = strDataInicial.replace("T"," ");
    strDataFinal   = strDataFinal.replace("T"," ");

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Calendar calendarDataInicial = Calendar.getInstance();
    Calendar calendarDataFinal   = Calendar.getInstance();

    calendarDataInicial.setTime(sdf.parse(strDataInicial));

    calendarDataFinal.setTime(sdf.parse(strDataFinal));
   
    /*Remover hora da data inicial */
    calendarDataInicial.set(calendarDataInicial.get(Calendar.YEAR),
                            calendarDataInicial.get(Calendar.MONTH),
                            calendarDataInicial.get(Calendar.DAY_OF_MONTH), 0, 0, 0);

    /*Remover hora da data final */
    calendarDataFinal.set(calendarDataFinal.get(Calendar.YEAR),
                          calendarDataFinal.get(Calendar.MONTH),
                          calendarDataFinal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
   

    setVariableData("var_dataInicialEmMilissegundo", calendarDataInicial.getTimeInMillis());

    setVariableData("var_dataFinalEmMilissegundo", calendarDataFinal.getTimeInMillis());

} catch (Exception e){         
    System.out.println("exception "+e.getMessage());
    addAuditTrailEntry(e);
}

Depois vamos apenas clicar em OK.

58

Agora vamos arrastar um componente Assign para baixo do nosso Java Embedding que vai realizar o calculo das datas em semanas.

59

Vamos dar um duplo click sobre o nosso Assign1 e na aba General vamos colocar o valor Assign_calcular_semanas no campo Name, e depois na aba Copy Rules vamos clicar com o botão direito sobre var_diferenca e vamos selecionar a opção Expression.

60

Na tela que foi aberta vamos colocar a expressão round(($var_dataFinalEmMilissegundo – $var_dataInicialEmMilissegundo) div (24*3600*1000*7)), se você não quiser copiar a expressão que está pronta, você pode ir clicando sobre as variáveis e funções como mostra a imagem abaixo, depois basta clicar em OK.

O que fizemos na nossa expressão round(($var_dataFinalEmMilissegundo – $var_dataInicialEmMilissegundo) div (24*3600*1000*7)) ?

Primeiro vamos buscar a diferença entre as datas em milissegundos e depois vamos dividir pelo número de milissegundos de uma semana.

61

Agora na tela de edição do nosso Assign vamos clicar em OK.

62

Agora vamos adicionar outro Else If como mostra a imagem abaixo.

63

No nosso elseif que acabamos de adicionar vamos colocar “resultado em meses” no campo label, depois vamos dar um duplo click sobre o nosso elseif e no campo Condition vamos adicionar o valor $inputVariable.parameters/ns1:tipoResultado = ‘meses’, depois basta clicar em OK.

Atenção: Se você preferir pode clicar no ícone da calculadora e selecionar o $inputVariable.parameters/ns1:tipoResultado na variável de request como fizemos nos passos anteriores.

64

Agora vamos arrastar um componente Assign para baixo no nosso elseif como mostra a imagem abaixo.

65

Depois vamos dar um duplo click sobre o nosso Assign1 e na aba General no campo Name vamos colocar o valor Assign_seta_meses_anos, depois vamos na aba Copy Rules e vamos clicar com o botão direito sobre var_anoDataInicial e vamos selecionar Expression.

66

Agora vamos usar a função xp20:year-from-dateTime() para pegarmos o ano da nossa data inicial como mostra a imagem abaixo, depois basta clicar em OK.

Expressão completa: xp20:year-from-dateTime($inputVariable.parameters/ns1:dataInicial) .

67

Agora vamos dar um duplo sobre a variável var_anoDataFinal.

000067

Na tela que foi aberta vamos criar a expressão xp20:year-from-dateTime($inputVariable.parameters/ns1:dataFinal), e depois vamos clicar em OK.

69

Agora vamos clicar com o botão direito sobre a variável var_mesDataInicial e selecionar a opção Expression.

70

Agora vamos clicar sobre a função xp20:month-from-dateTime(), essa função vamos usar para pegar o mês da data inicial ($inputVariable.parameters/ns1:dataInicial), depois basta clicar em OK.

Expressão completa: xp20:month-from-dateTime($inputVariable.parameters/ns1:dataInicial)

74

Agora vamos clicar com o botão direito sobre  a variável var_mesDataFinal e vamos selecionar a opção Expression.

72

Agora vamos adicionar a expressão xp20:month-from-dateTime($inputVariable.parameters/ns1:dataFinal)  para pegarmos o mês da data final e depois vamos clicar em OK.

73

Podemos ver na nossa tela de edição do Assign os itens que criamos, depois basta clicar em OK.

75

Agora vamos arrastar um outro componente Assign como mostra a imagem abaixo.

76

Agora vamos dar um duplo click sobre o nosso componente Assign1 e na tela que foi aberta vamos até a aba General e no campo Name vamos colocar o valor Assign_calcular_meses e depois na aba Copy Rules vamos clicar com o botão direito sobre a variável var_diferenca.

77

Vamos criar a expressão  (($var_mesDataFinal + 12 * $var_anoDataFinal) – ($var_mesDataInicial + 12 * $var_anoDataInicial)) e depois vamos clicar em OK.

78

Agora vamos apenas clicar em OK.

79

Agora vamos até o else e em label vamos colocar o valor “resultado em anos” e depois vamos clicar em OK.

80

Agora vamos arrastar um componente Assign para baixo do nosso else.

81

Agora vamos dar um duplo click sobre o nosso Assign1 e na aba General vamos colocar o valor Assign_seta_anos no campo Name e depois na aba Copy Rules vamos clicar com o botão direito sobre var_anoDataInicial e vamos selecionar a opção Expression.

82

Agora vamos criar a expressão xp20:year-from-dateTime($inputVariable.parameters/ns1:dataInicial) e depois vamos clicar em OK.

84

Agora vamos clicar com o botão direito sobre a variável var_anoDataFinal e vamos selecionar a opção Expression.

85

Agora vamos adicionar a expressão xp20:year-from-dateTime($inputVariable.parameters/ns1:dataFinal) e clicar em OK.

83

Agora na tela de edição do nosso Assign vamos apenas clicar no botão OK.

86

Agora vamos arrastar um componente Assign para baixo do Assign_seta_anos e vamos dar um duplo click sobre o nome Assign1 e vamos renomear para Assign_calcular_anos.

87

Agora vamos dar um duplo click no nosso componente Assign_calcular_anos e depois vamos clicar com o botão direito sobre var_diferenca e vamos selecionar a opção Expression.

88

Agora vamos criar a expressão ($var_anoDataFinal – $var_anoDataInicial) e depois podemos clicar em OK.

89

Agora na tela de edição do Assign vamos apenas clicar em OK.

90

Agora vamos arrastar um componente Assign para baixo do nosso If_tipo_resultado, e vamos dar um duplo click sobre o nome Assign1 e renomear para Assign_seta_saida.

91

Depois vamos dar um duplo click sobre Assign_seta_saida e na tela que foi aberta vamos fazer uma ligação de var_diferenca para  ns1:diferenca e clicar em ok.

93

Agora nosso serviço está pronto, vamos clicar com o botão direito sobre o nosso projeto e vamos realizar o Deploy como mostra a imagem abaixo.

Atenção: Para realizarmos o deploy o nosso WebLogic/Oracle Entreprise Manager deve estar em execução.

94

Na tela que foi aberta vamos selecionar Deploy to Application Server clicar em Next.

95

Na tela abaixo vamos deixar selecionado apenas a opção Mark composite revision as default e clicar em Next.

96

Agora vamos selecionar nosso Servidor Web Logic e clicar em Next.

97

Na imagem abaixo podemos ver o endereço no nosso Servidor Weblogic e o seu status, vamos apenas clicar em Next.

98

Na tela abaixo podemos ver um resumo do nosso deploy, depois podemos clicar em Finish.

99

Agora vamos acessar no Oracle Enterprise Manager (http://127.0.0.1:7101/em) e efetuar o login.

100

Agora vamos selecionar o nosso serviço em soa-infra e depois vamos clicar no botão Testar.

101

Agora vamos preencher os campos com os parâmentros como mostra a imagem abaixo, depois vamos clicar no botão Testar Web Service.

102

Abaixo podemos ver o resultado do teste feito com a diferença em dias.

103

Agora vamos clicar na aba Solicitação e preencher os campos com os parâmetros como mostra a imagem abaixo para testarmos o resultado da diferença em semanas.

104

Abaixo podemos ver o resultado da diferença em semanas.

105

Vamos novamente clicar na aba Solicitação e vamos preencher os campos com os parâmetros como mostra a imagem abaixo para testarmos o resultado da diferença em meses.

106

Na imagem abaixo podemos ver resultado do nosso teste com a diferença em meses.

108

Agora vamos clicar na aba Solicitação novamente e vamos preencher os campos com os parâmetros como mostra a imagem abaixo para testarmos o resultado da diferença em anos.

109

Na imagem abaixo podemos ver o resultado da diferença em anos.

110

É isso amigos nesse tutorial aprendemos a criar um Web Service no BPEL para calcular a diferença entre datas, até o próximo tutorial.

Comentários

Name of author

Name: ciceroednilson@gmail.com

Deixe uma resposta

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

0 Flares Twitter 0 Facebook 0 Filament.io 0 Flares ×