• Nenhum resultado encontrado

Conversão dos Tipos de Dados e Mensagens

4 Conversão entre FCEO e BPELWS

4.4 Conversão dos Tipos de Dados e Mensagens

É possível converter, automaticamente, os tipos de dados e as mensagens em UML para o formato XSD/WSDL, recorrendo a um conjunto de regras. No perfil, os tipos de

mensagens são definidas através das classes com o estereótipo <<messageContent>>. Como resultado da conversão devem ser criados dois ficheiros. No ficheiro XSD deverão ser colocados os tipos de dados e no ficheiro WSDL deverão ser colocadas as mensagens. A separação entre os dois documentos permite aumentar a modularidade da solução, reutilizar os mesmos tipos de dados base em outros projectos, usar esquemas já existentes e facilitar a manutenção do projecto.

4.4.1 Geração dos Ficheiros XSD e WSDL

Todas as classes com o estereótipo <<data>> são convertidas num tipo composto:

complexType [FW04]. O nome a atribuir é constituído pelo nome da classe seguido de

“Type”. Este sufixo serve para distinguir entre tipos e elementos em XSD. Para cada tipo XSD deve ser criado o elemento respectivo. Recorre-se à etiqueta element para definir os elementos em XSD. O nome a atribuir ao elemento é igual ao do tipo que lhe deu origem, excepto que a primeira letra é minúscula e que o sufixo “Type” é excluído do nome.

Os atributos de cada classe UML dão origem a uma sequência de elementos dentro do tipo XSD composto. Estes elementos, por sua vez, podem referenciar um tipo XSD simples ou complexo. Um elemento referencia um tipo simples sempre que o atributo do modelo UML seja elementar, por exemplo: ‘String’, ‘Integer’, ‘Double’, etc (ver Apêndice C – Conversão de Tipos Básicos da UML para o Formato XSD). Neste caso, o seu nome é igual ao atributo do modelo UML que lhe deu origem. Quando a classe está associada a outras classes do tipo <<data>>, o elemento passa a referenciar o tipo XSD correspondente à classe associada [BM04]. Neste caso, o nome do elemento é constituído pelo nome da classe associada, devendo iniciar-se por uma letra minúscula. Deve ainda ser considerada a multiplicidade dos elementos que participam na associação, alterando em conformidade os campos: ‘minOccurs’ e ‘maxOccurs’, do elemento XSD. Na Tabela em baixo encontra-se exemplificada a conversão das diferentes expressões de multiplicidade possíveis em UML para XSD.

Expressão UML minOccurs maxOccurs

0..1 0 1

1 1 1

m..n m n

1..* 1 unbounded

Tabela 4.1 – Conversão das Expressões de Multiplicidade

Sempre que exista herança entre duas classes <<data>> deve usar-se o elemento extension. A extensão é declarada no tipo XSD que solicita a herança, definindo, como base da extensão, o tipo XSD associado à classe da qual pretende herdar. Podem ser usados nomes de atributos iguais na super- e na sub-classe. Na Tabela 4.2 encontra-se exemplificada a conversão de vários exemplos de classes <<data>> para o formato XSD.

Modelo UML Conversão para XSD

<xsd:complexType name=”ClasseAType”> <xsd:sequence>

<xsd:element name=”attribA” type=”string”/> <xsd:element name=”attribB” type=”boolean”/> <xsd:element name=”attribC” type=”int”/> </xsd:sequence> </xsd:complexType> ClasseA attribA : String attribB : Boolean attribC : Integer <<data>> ClasseA <<data>> ClasseB <<data>> 1..n 0..1 0..1 1..n

<!-- geracao tipo ‘ClasseAType’ --> <xsd:complexType name=”ClasseAType”> <xsd:sequence>

<xsd:element name=”classeB” type=”tns:ClasseBType” minOccurs=”1” maxOccurs=”unbounded” /> </xsd:sequence>

</xsd:complexType>

<!-- geracao tipo ‘ClasseBType’ --> <xsd:complexType name=”ClasseBType”> <xsd:sequence>

<xsd:element name=”classeA” type=”tns:ClasseAType” minOccurs=”0” maxOccurs=”1” /> </xsd:sequence>

Modelo UML Conversão para XSD ClasseA <<data>> ClasseB <<data>> 1..n 0..1 0..1 1..n

<!-- geracao tipo ‘ClasseAType’ --> <xsd:complexType name=”ClasseAType”> <xsd:sequence>

<xsd:element name=”classeB” type=”tns:ClasseBType” minOccurs=”1” maxOccurs=”unbounded” /> </xsd:sequence>

</xsd:complexType>

<!-- geracao tipo ‘ClasseBType’ --> <xsd:complexType name=”ClasseBType” /> ClasseA attribA : String <<data>> ClasseB attribB : String <<data>>

<!-- geracao tipo ‘ClasseAType’ --> <xsd:complexType name="ClasseAType"> <xsd:sequence>

<xsd:element name="attribA" type="string"/> </xsd:sequence>

</xsd:complexType>

<!-- geracao tipo ‘ClasseBType’ --> <xsd:complexType name="ClasseBType"> <xsd:complexContent>

<xsd:extension base="tns:ClasseAType"> <xsd:sequence>

<xsd:element name="attribB" type="string"/> </xsd:sequence>

</xsd:extension> </xsd:complexContent> </xsd:complexType>

Tabela 4.2 – Conversão Modelo UML para Formato XSD

As mensagens e as secções constituintes devem ser colocadas num ficheiro WSDL, separado do ficheiro XSD que contém o esquema dos tipos de dados base. Cada classe do tipo <<messageContent>> dá origem a um elemento message no ficheiro WSDL. Para cada atributo da classe é acrescentada uma etiqueta part ao elemento da mensagem. Sempre que um atributo seja elementar recorre-se ao método de conversão usado para os tipos de dados base (ver Apêndice C – Conversão de Tipos Básicos da UML para o Formato XSD). Os restantes atributos da classe devem referenciar um tipo XSD composto previamente definido. Nas Figuras em baixo é ilustrado um exemplo de conversão de uma mensagem para o formato WSDL juntamente com os tipos de dados

utilizados. Note-se que o esquema importado através do ficheiro WSDL corresponde ao ficheiro XSD que contém a definição dos tipos de dados base.

Cliente nome : String morada : String <<data>> Encomenda eid : String <<messageContent>> +cliente Linha nomeProduto : String quantidade : Integer precoUnitario : Float <<data>> LinhaEncomenda <<data>> +linhaEncomenda 1..n 1..n

Figura 4.9 – Cenário Conversão para uma Encomenda

<xsd:complexType name="ClienteType"> <xsd:sequence>

<xsd:element name="nome" type="xsd:string"/> <xsd:element name="morada" type="xsd:string"/> </xsd:sequence>

</xsd:complexType>

<xsd:complexType name="LinhaEncomendaType"> <xsd:sequence>

<xsd:element name="linhas" type="LinhaType"/> </xsd:sequence>

</xsd:complexType>

<xsd:complexType name="LinhaType"> <xsd:sequence maxOccurs="unbounded">

<xsd:element name="nomeProduto" type="xsd:string"/> <xsd:element name="quantidade" type="xsd:int"/> <xsd:element name="precoUnitario" type="xsd:float"/> </xsd:sequence>

</xsd:complexType>

<types> <schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" >

<import namespace="…" schemaLocation="Ficheiro.xsd"/> <element name="cliente" type="tns:ClienteType"/>

<element name="linhaEncomenda" type="tns:LinhaEncomendaType"/> </schema>

</types>

<message name="Encomenda">

<part name="eid" type="xsd:string"/>

<part name="cliente" element="tns:cliente"/>

<part name="linhaEncomenda" element="tns:linhaEncomenda"/> </message>

Figura 4.11 – Ficheiro WSDL correspondente à Encomenda

Documentos relacionados