3.2 Gerando GML esquemas a partir de modelos UML
3.2.2 Classes – Regras gerais
A OGC (2007) define algumas regras gerais para a conversão de classes UML para elementos de um documento GML esquema:
• Os seguintes estereótipos de classes UML são reconhecidos: <<FeatureType>>,
<<Type>>, <<DataType>>, <<Union>>, <<Codelist>> e <<Enumeration>>.
Todas as classes com outros estereótipos são ignoradas na conversão de UML para GML esquema. Classes sem estereótipos seguem a regra de conversão para classes com estereótipos <<Type>>;
• Cada classe é convertida para elemento, cujo atributo name é o próprio nome da classe, e o tipo é definido como sendo a concatenação do nome da classe com o sufixo “Type”;
• As operações de classe UML são ignoradas na conversão;
• Todas as classes podem ter de zero a um (1) supertipo; portanto, o recurso de herança múltipla é ignorado.
3.2.2.1 Classes – Tipos básicos
A regra de conversão dos tipos básicos transforma componentes de uma linguagem (no caso, UML) para um componente correspondente de outra linguagem (GML esquema).
Portanto, as regras de conversão UML – GML esquema devem suportar tanto elementos gerais da UML, quanto elementos específicos da série ISO 19100. A Figura 18 ilustra uma conversão trivial dos elementos UML: classe, atributos e tipo do atributo. A classe “Estrada”
é convertida para um XML esquema correspondente <complexType>. O tipo do atributo é convertido conforme o Quadro III11 em tipos ISO específicos.
Quadro III. Parte superior: tipos ISO básicos convertidos para tipos XML esquema. Parte inferior: tipos espaciais convertidos para GML. Fonte: Grønmo; Solheim; Skogan (2002).
Tipos básicos de acordo com a ISO 19103 Tipos básicos XML esquema
CharacterString string
Integer integer
Date date
Boolean boolean
Real Decimal
Tipos espaciais de acordo com a ISO 19107 Tipos básicos XML esquema
GM_Point PointPropertyType
GM_Curve LineStringPropertyType
GM_CompositeSurface PolygonPropertyType
11 Nota do autor: a versão completa se encontra no Anexo I deste trabalho.
31
1 2 3 4 5 6 7 8 9 10 11
<complexType name="EstradaType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="classificao" type="string"/>
<element name="numero" type="string"/>
<element name="linearGeometry" type="gml:LineStringPropertyType"/>
</sequence>
</extension>
</complexContent>
</complexType>
Figura 18. Exemplo trivial do mapeamento de uma classe UML para um GML esquema “Estrada”. Fonte: OGC (2007).
3.2.2.2 Classes – DataType
As classes com o estereótipo <<DataType>> seguem as seguintes regras em seu mapeamento para GML (exemplo de mapeamento na Figura 19):
• Se a classe não tem um supertipo, ela deve ser de um tipo não derivado de dentro do XML esquema. Se a classe utiliza um supertipo, este não pode ser derivado de
“gml:AbstractObject” (direta ou indiretamente);
• O elemento mapeado deve ter os seguintes atributos configurados: “name” (nome da classe), “type” (nome da classe mais o sufixo Type), “abstractness” (valor
“true”, se a classe for abstrata) e “substitutiongroup” (nome da superclasse ou
“gml:AbstractObject”, se a classe não for uma superclasse);
• Um elemento <complexType> deve ser criado para essa classe (o atributo “name”
deve ter o valor alterado para o nome da classe, acrescentado do sufixo PropertyType). Essa regra só se aplica, caso o atributo “noPropertyType” da classe, no modelo UML original, esteja com o valor diferente de “true”.
1 2 3 4 5 6
<complexType name="ParcelNameType">
<sequence>
<element name="street" type="string" minOccurs="0" maxOccurs="1"/>
<element name="city" type="string" minOccurs="1" maxOccurs="1"/>
</sequence>
</complexType>
Figura 19. Exemplo do mapeamento de uma classe UML com o estereótipo <<DataType>>. Fonte:
adaptado de OGC (2007).
32
3.2.2.3 Classes – FeatureType
As classes com o estereótipo <<FeatureType>> seguem as seguintes regras em seu mapeamento para GML (exemplo de mapeamento na Figura 20):
• As classes devem ser derivadas direta ou indiretamente de
“gml:AbstractFeatureType”. Se a classe não tem um supertipo, ela deve estender diretamente de “gml:AbstractFeatureType”. No entanto, se a classe é estendida de um supertipo, este deve ser derivado de “gml:AbstractFeatureType” (direta ou indiretamente);
• O elemento mapeado deve ter os seguintes atributos configurados: “name” (nome da classe), “type” (nome da classe mais o sufixo Type), “abstractness” (valor
“true”, se a classe for abstrata) e “substitutiongroup” (nome da superclasse ou gml:AbstractFeature);
• Um elemento <complexType> deve ser criado para essa classe (o atributo “name”
deve ter o valor alterado para o nome da classe, acrescentado do sufixo PropertyType). Essa regra só se aplica, caso o atributo “noPropertyType” da classe, no modelo UML original, esteja com o valor diferente de “true”.
• Um elemento <complexType> deve ser criado para essa classe (o atributo “name”
deve ter o valor alterado para o nome da classe, acrescentado do sufixo
“PropertyByValueType”). Essa regra só se aplica, caso o atributo
“byValuePropertyType” da classe, no modelo UML original, esteja com o valor
“true”.
33
1 2 3 4 5 6 7 8 9 10 11 12 13
<complexType name="BuildingType">
<complexContent>
<extension base="gml:AbstractFeatureType">
<sequence>
<element name="extent" type="gml:SurfacePropertyType"/>
<element name="address" type="pcl:AddressPropertyType"/>
<element name="type" type="pcl:BuildingTypeType"/>
</sequence>
</extension>
</complexContent>
</complexType>
<element name="Building" type="pcl:BuildingType" substitutionGroup="gml:AbstractFeature"/>
Figura 20. Exemplo do mapeamento de uma classe UML com o estereótipo <<FeatureType>>. Fonte: OGC (2007).
3.2.2.4 Classes – Type
As classes sem estereótipo ou com o estereótipo <<Type>> seguem as seguintes regras em seu mapeamento para GML (exemplo de mapeamento na Figura 21):
• Classes com o estereótipo <<Type>> devem ser derivadas direta ou indiretamente de “gml:AbstractGMLType”. Se a classe não tem um supertipo, ela deve estender diretamente de “gml:AbstractGMLType”. Porém, se a classe é estendida de um supertipo, este deve ser derivado de “gml:AbstractGMLType” (novamente direta ou indiretamente). Neste caso, a classe não pode ser estendida de
“gml:AbstractFeatureType”, seja direta ou indiretamente;
• Um elemento <complexType> deve ser criado para essa classe (o atributo “name”
deve ter o valor alterado para o nome da classe, acrescentado do sufixo
“PropertyType”). Essa regra só se aplica, caso o atributo “noPropertyType” da classe, no modelo UML original, esteja com o valor diferente de “true”.
<<FeatureType>>
Bulding +extent: GM_Surface +adress: Adress +type: BuldingType
34
Elipse
+center: DirectPosition +semiminor: Vector +semimajor: Vector
<<Abstract>>
GM_CurveSegment
1 2 3 4 5 6 7 8 9 10 11 12 13
<element name="Ellipse" type="ex:EllipseType"
substitutionGroup="gml:AbstractCurveSegment"/>
<complexType name="EllipseType">
<complexContent>
<extension base="gml:AbstractCurveSegmentType">
<sequence>
<element name="center" type="gml:DirectPositionType"/>
<element name="semiminor" type="gml:VectorType"/>
<element name="semimajor" type="gml:VectorType"/>
</sequence>
</extension>
</complexContent>
</complexType>
Figura 21. Exemplo do mapeamento de uma classe UML com estereótipo <<Type>> ou sem estereótipo. Fonte: OGC (2007).
3.2.2.5 Classes – Enumerations
As classes com o estereótipo <<Enumeration>> são mapeadas como <simpleType> no XML esquema. O atributo “base” é do tipo “string”, sendo que o domínio dos valores é restringido por um conjunto de valores literais que são especificados pelos nomes dos atributos da classe (exemplo de mapeamento pode ser visto na Figura 22).
1 2 3 4 5 6 7 8 9 10
<simpleType name="BuildingTypeType">
<restriction base="string">
<enumeration value="church"/>
<enumeration value="school"/>
<enumeration value="garage"/>
<enumeration value="residential houses"/>
<enumeration value="unknown"/>
<enumeration value="mixed"/>
</restriction>
</simpleType>
Figura 22. Exemplo do mapeamento de uma classe UML com o estereótipo <<Enumeration>>. Fonte: OGC (2007).
35
3.2.2.6 Classes – CodeList
A OGC (2007) define que uma classe UML com um estereótipo <<CodeList>> e sem o atributo “asDictionary” da classe no modelo UML original com o valor “true” deve ser mapeada como uma classe com estereótipo <<Enumerations>>, mas com algumas diferenças (exemplo de mapeamento na Figura 23):
• Devem-se utilizar padrões de restrições (facets), tais como “<pattern value=’other:\w{2}’/>”, para estabelecer valores pré-definidos na lista. Utilizam- se expressões regulares nas descrições das restrições;
• Se um código for especificado como um valor de “code list”, somente o código pode ser utilizado no elemento <enumeration>;
• Um código pode ser qualificado com o uso de uma anotação <appinfo>, com um elemento <gml:description> especificando um valor texto para os valores dos elementos <enumeration>.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
<simpleType name="ParcelUsageType">
<union memberTypes="pcl:ParcelUsageEnumerationType pcl:ParcelUsageOtherType"/>
</simpleType>
<simpleType name="ParcelUsageEnumerationType">
<restriction base="string">
<enumeration value="1">
<annotation>
<appinfo><gml:description>factory</gml:description></appinfo>
</annotation>
</enumeration>
<enumeration value="2">
<annotation>
<appinfo><gml:description>road</gml:description></appinfo>
</annotation>
</enumeration>
<enumeration value="3">
<annotation>
<appinfo><gml:description>residential</gml:description></appinfo>
</annotation>
</enumeration>
<enumeration value="4">
<annotation>
<appinfo>< gml:description>offices</gml:description></appinfo>
</annotation>
</enumeration>
</restriction>
</simpleType>
<simpleType name="ParcelUsageOtherType">
<restriction base="string">
<pattern value="other: \w{2,}"/>
</restriction>
</simpleType>
Figura 23. Exemplo do mapeamento de uma classe UML com o estereótipo <<CodeList>>. Fonte: OGC (2007).
36
3.2.2.7 Classes – Union
As classes com o estereótipo <<Union>> são mapeadas como <complexType> no XML esquema. Os atributos da classe são mapeados como elementos que compõem a tag
<choice>. Os tipos dos atributos são mapeados de forma usual. Um exemplo de mapeamento pode ser visto na Figura 24.