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