Transformação UML em CORBA

A transformação UML em CORBA transforma elementos de modelo UML (Linguagem de Modelagem Unificada) versão 2.0 em CORBA (Common Object Request Broker Architecture) IDL (Interface Definition Language). É possível utilizar a transformação para iniciar um projeto CORBA a partir das especificações de UML 2.0. A transformação também fornece um perfil opcional e reduzido que você pode utilizar para modelar e gerar a maioria dos elementos CORBA.


1. Informações Iniciais

Antes de utilizar a transformação de UML em CORBA, você deve estar familiarizado com a criação e edição dos modelos e projetos de UML 2.0. O seguinte procedimento mostra a utilização mais básica da transformação CORBA.

Para transformar um modelo UML em CORBA:

 

1.    Verifique se você está na perspectiva de Modelagem.

2.    Na visualização Explorador de Modelos crie um componente UML nomeado "Component1", e dentro do componente crie uma interface nomeada "Interface1".

3.    Clique com o botão direito do mouse no componente; em seguida, clique em Transformar > Executar Transformação > UML 2 CORBA.

4.    Na janela Executar Transformação, clique em Criar contêiner de destino.

5.       Na janela Novo projeto, especifique Amostra como o nome de projeto e clique em Concluir.

 

O novo projeto contém um arquivo IDL nomeado como "Component1.idl" e não possui uma interface definida, que é nomeada como Interface1.

A transformação também pode executar várias outras funções mais complexas, como substituição de nomes sem modificar o modelo de origem, validação do modelo UML para potenciais problemas de transformação e assim por diante.

 

2. Detalhes da Transformação

 

2.1 Modelo do Gabarito CORBA

O modelo de gabarito CORBA pode ajudá-lo a iniciar modelagem com CORBA rapidamente. Para iniciar, clique em Arquivo > Novo > Modelo UML e selecione Modelo CORBA a partir dos gabaritos disponíveis. Essa seleção gera um modelo UML e fornece instruções e uma infra-estrutura básica para a criação de um modelo CORBA.

 

2.2 Origem de Transformação

Você pode especificar um modelo, um componente, um pacote UML que contenha componentes, ou uma combinação desses elementos como a origem para cada aplicativo da transformação. A transformação gera um arquivo IDL único para cada componente UML na hierarquia da origem especificada. Cada arquivo IDL contém códigos somente para os elementos aos quais o componente UML correspondente pertence. A transformação ignora elementos que não pertencem a um componente UML. Se você especificar qualquer outro elemento como a origem para a transformação, a transformação falhará durante a validação.  

Quando você aplica o perfil CORBA, é possível controlar os componentes UML de acordo com o seu modelo para o qual a transformação gera o código. É possível treinar esse controle, configurando a propriedade generateCode como verdadeiro ou falso. Quando você configura a propriedade como falso, a transformação ignora os componentes ao gerar um código.

2.3 Destino da Transformação

O destino para cada aplicativo da transformação é um simples recurso de projeto Eclipse. O projeto contém o arquivo ou arquivos IDL que são considerados arquivos de recurso do espaço de trabalho Eclipse.

2.4 Perfil Opcional

Você pode modelar os seguintes tipos CORBA sem utilizar um perfil:

Um perfil opcional fornece estereótipos para modelar mais tipos CORBA específicos, como os que se seguem:

2.5 Validação do Modelo de Origem

O perfil de transformação CORBA define restrições para estereótipos. Para avaliar essas restrições e relatar qualquer erro em um modelo de origem, você pode utilizar o comando "Run Validation". A transformação CORBA também desempenha validações adicionais na parte do modelo para a qual a transformação se aplica.

2.6 Utilização de um Modelo de Mapeamento

Você pode renomear elementos modelados no código gerado, utilizando um modelo de mapeamento. Exceto os componentes, é possível renomear apenas elementos UML com identificadores simples. Os componentes UML podem ser renomeados tanto com um identificador simples como com um caminho parcial válido que é relativo ao contêiner de destino para o qual o arquivo IDL é gerado. O caminho deve ser finalizado com o nome do arquivo IDL. Por exemplo, se você renomear Component A como dirA\A, a transformação gerará A.idl no diretório nomeado como dirA, ao invés de gerar no nível superior do contêiner de destino.

3. Mapeamento de CORBA para UML

A seguinte tabela lista como a transformação mapeia elementos de modelo UML 2.0 para CORBA IDL.

Elemento UML 2.0

Elemento CORBA IDL

Modelo

Nada

Componente

Arquivo IDL

Tipos primitivos

Tipos básicos

Nativo

Pacote

Módulo (se o pacote estiver em um componente)

Ignorado (se o pacote não estiver em um componente)

Interface

Interface

Atributo ou associação

Atributo

Operação

Operação IDL

Parâmetro

Parâmetro da operação IDL

Enumeração

Enumeração

Classe <<CORBAValue>>

Tipo de valor

Tipo de valor customizado

Tipo de valor guardado

Atributo estático

Constante

Classe <<CORBAStruct>>

Estrutura

Classe <<CORBAException>>

Exceção

Classe <<CORBATypedef>>

Typedef

Matriz

Seqüência

3.1 Modelo UML 2.0

Um modelo UML 2.0 não mapeia diretamente para nenhum elemento CORBA. Essa ausência de mapeamento significa que a transformação não gera código para elemento de modelo se não houver componentes definidos no modelo.

3.2 Componente UML 2.0

Um elemento UML 2.0 mapeia para um único arquivo CORBA IDL. O arquivo IDL para um componente contém todos os elementos CORBA que pertencem ao componente.

3.3 Tipos Primitivos UML 2.0

Um tipo primitivo de UML 2.0 mapeia tanto para o tipo básico CORBA como para o tipo nativo CORBA. Uma biblioteca do tipo UML 2.0 que contém todos os tipos básicos CORBA conforme os tipos primitivos UML 2.0 tornam-se disponíveis para importação no modelo. Alternativamente, você pode criar um tipo primitivo UML 2.0 com o mesmo nome conforme um tipo básico CORBA existente para utilização da seleção de tipo no modelo. A seguinte lista mostra os tipos básicos CORBA disponíveis na biblioteca de tipo:

Um tipo primitivo UML 2.0 nomeado como qualquer coisa, exceto os tipos especificados na lista, representa um tipo nativo CORBA. Um tipo nativo CORBA gera a definição nativa 
no arquivo IDL e está disponível para a seleção de tipo no modelo.

3.4 Pacote UML 2.0

Um pacote UML 2.0 contido em um componente UML 2.0 mapeia para o módulo CORBA. A transformação ignora pacotes UML 2.0 que não estão em um componente 
UML 2.0.

3.5 Interface UML 2.0

Uma interface UML 2.0 mapeia para a interface CORBA. Uma generalização UML 2.0 das interfaces UML 2.0 mapeia para a herança de interfaces CORBA. A tabela a seguir mostra como a transformação transforma propriedades de interface.

Propriedade de Interface UML

Resultado da Transformação

Nome

Nova interface CORBA no IDL com o nome especificado, com alguns caracteres ilegais removidos

Visibilidade, público

Interface normal

Visibilidade, privado

Interface local

Abstrato

Interface CORBA abstrata

Folha

Ignorado

3.6 Atributos e Associações UML 2.0

Atributos e associações UML 2.0 mapeiam para atributos CORBA. A tabela a seguir mostra como a transformação transforma propriedades de atributo.

Propriedade de Atributo UML

Resultado da Transformação

Nome

Atributo CORBA com o mesmo nome

Tipo

Atributo CORBA com o tipo básico especificado

Valores "É Estático" e "padrão"

Constante CORBA

De leitura

Atributo CORBA de leitura

Ordem

Ordem IDL

A tabela a seguir mostra como a transformação transforma propriedades de associação.

Propriedade de Associação UML

Resultado da Transformação

Nome

Atributo CORBA com o mesmo nome

Tipo

Atributo CORBA com o tipo conforme o fornecedor dessa associação

Valores "É Estático" e "padrão"

Constante CORBA

De leitura

Atributo CORBA de leitura

Ordem

Ordem IDL

3.7 Operação UML 2.0

Uma operação UML 2.0, declarada em uma interface UML ou em uma classe UML com o estereótipo <<CORBAValue>> , mapeia diretamente para a operação IDL. A transformação ignora outras operações UML 2.0. A tabela a seguir mostra como a transformação transforma propriedades de operação.

Propriedade de Operação UML

Resultado da Transformação

Nome

Nova operação CORBA com o nome especificado

Tipo de retorno

Tipo de retorno da operação CORBA

Todas as outras propriedades

Ignorado

Operação com o estereótipo <<CORBAOneway>>

Operação IDL unilateral

Estereótipo <<create>> em operação na classe UML <<CORBAValue>>

Mapeia para uma operação do inicializador de valor CORBA

3.8 Parâmetro UML 2.0

Um parâmetro UML 2.0 mapeia para o parâmetro da operação IDL. A tabela a seguir mostra como a transformação transforma propriedades de parâmetro.

Propriedade de Parâmetro UML

Resultado da Transformação

Nome

Novo parâmetro com o nome especificado

Direção (entrada, saída, entrada e saída)

Parâmetro correspondente na IDL; 'return' é ignorado

Tipo

Parâmetro com o tipo especificado

Visibilidade

Ignorado

3.9 Enumeração UML 2.0

Uma enumeração UML 2.0 mapeia para a enumeração CORBA. Uma enumeração pode conter apenas literais de enumeração.

3.10 Classe UML 2.0 com o Estereótipo <<CORBA Value>>

Uma classe UML 2.0 com o estereótipo <<CORBAValue>> mapeia para um tipo de valor CORBA. O estereótipo <<CORBAValue>> acompanha uma especificação da propriedade nomeada 
e determinada com a enumeração {"none", "custom", "boxed"}. O valor padrão é "none". Se você configurar a propriedade de especificação como "custom", ela mapeará 
para um valor customizado CORBA. Se você configurar a propriedade de especificação como "boxed", ela mapeará para um valor guardado CORBA.

Um tipo de valor CORBA é uma entidade que possui um estado opcional e um método inicializador que estão separados das propriedades de uma interface. Os membros de estado de um tipo de valor CORBA são representados pelos atributos UML 2.0 com o estereótipo <<CORBAState>> e os métodos inicializadores são representados, aplicando o estereótipo <<create>> do perfil básico que acompanha o produto.

A tabela a seguir mostra como a transformação transforma propriedades de classe.

Propriedade de Classe UML

Resultado da Transformação

Estereótipo

<<CORBAValue>>

Nome

Novo tipo de valor com o nome especificado.

Visibilidade

Ignorado

Abstrato

Tipo de valor abstrato

Atributos com <<CORBAState>> com visibilidade pública ou privada

Membro de estado CORBA do tipo de valor CORBA, com visibilidade pública ou privada

Operação com <<create>>

Método de fábrica CORBA do tipo de valor não-abstrato

3.11 Atributo Estático UML 2.0

Uma declaração de constante CORBA pode aparecer no escopo de um arquivo IDL, de um módulo, de uma interface ou de um tipo de valor.

Uma constante CORBA que aparece no escopo de uma interface ou tipo de valor pode ser representada pelo atributo UML estático na classe ou interface 
UML correspondente.

Uma constante CORBA que aparece no escopo de um módulo CORBA ou no escopo de um arquivo IDL deve ser um atributo na classe UML com o estereótipo 
<<CORBAConstants>> que apareça no pacote UML (para uma constante de módulo) ou no componente UML (para uma constante de escopo IDL). 
O nome dessa classe é ignorado. Cada atributo da classe com o estereótipo <<CORBAConstants>> representa uma declaração constante
.

3.12 Classe UML 2.0 com o Estereótipo <<CORBA Struct>>

Uma classe UML 2.0 com o estereótipo <<CORBAStruct>> mapeia para uma estrutura CORBA. Essa classe é restrita a ter apenas atributos e não operações. Os membros de estrutura são representados pelo atributo UML ou pela associação da classe.

3.13 Classe UML 2.0 com o Estereótipo <<CORBA Exception>>

Uma classe UML 2.0 com o estereótipo <<CORBAException>> representa uma definição de exceção. Esse tipo de classe pode, opcionalmente, conter atributos.

No CORBA 2.4, apenas a operação CORBA pode causar uma exceção, o que não é possível com um atributo CORBA. Portanto, se uma operação CORBA 
causar uma exceção, ela é representada na propriedade RaisedException da operação UML correspondente.

3.14 Classe UML 2.0 com o Estereótipo <<CORBA Typedef>>

A transformação utiliza o CORBA typedef para atribuir um novo nome a um tipo CORBA existente. Uma classe UML 2.0 com o estereótipo <<CORBATypedef>> 
mapeia para o CORBA typedef. Um relacionamento de substituição UML 2.0 dessa classe para o tipo CORBA existente é a notação 
completa que representa o CORBA typedef.

A especificação CORBA 2.4 desaprova a declaração anônima de uma matriz e tipo de seqüência CORBA. Esse mapeamento não suporta seqüências 
ou matrizes CORBA anônimas. Você deve nomear uma matriz ou tipo de seqüência, utilizando uma declaração typedef. O estereótipo <<CORBATypedef>> que 
estende a classe UML 2.0 contém uma propriedade de especificação (cujos valores são "none", "array" e "sequence", com "none" como o padrão) e uma 
propriedade de dimensões (cujo padrão é vazio) que contém as dimensões matriz ou seqüência.

Uma matriz CORBA é modelada como um relacionamento de substituição UML 2.0 de uma classe com o estereótipo <<CORBATypedef>> para o elemento UML que 
representa o tipo de elemento de matriz. A propriedade "specification" do estereótipo é configurada para "array" e a propriedade "dimensions" é configurada para a cadeia que 
representa as dimensões da matriz (por exemplo, "[3][5]"). Uma associação de um tipo construído para a classe com o estereótipo  <<CORBATypedef>> modela
um membro no tipo construído com o tipo como matriz CORBA.

Uma seqüência CORBA é modelada como um relacionamento de substituição UML 2.0 de uma classe com o estereótipo <<CORBATypedef>> para o elemento UML que 
representa o tipo de elemento da seqüência. A propriedade "specification" do estereótipo é configurada para "sequence" e, opcionalmente, a propriedade "dimensions" 
é configurada para o valor de cadeia que representa a ligação superior da seqüência (por exemplo, "12"). 
Uma associação de um tipo construído para a classe com o estereótipo <<CORBATypedef>> modela um membro no tipo construído com o tipo como seqüência CORBA.

4. Inclusões e Declarações Avançadas CORBA

A transformação gera automaticamente declarações avançadas CORBA. Não é possível modelá-las. A transformação rearranja tipos em IDL para minimizar declarações avançadas. Quando um tipo for utilizado antes de sua definição e a definição desse tipo não pôde ser movida antes de sua utilização, a transformação gerará uma declaração avançada 
do tipo no escopo correto.

A transformação gera automaticamente um #include quando um tipo é utilizado, cuja definição aparece em um componente diferente. Muitos arquivos  CORBA IDL
precisam incluir o arquivo ORB.idl. Quando for necessário forçar um #include em um arquivo IDL gerado de outro arquivo IDL externo que não esteja modelado, você precisa 
criar uma dependência do componente atual para um componente criado recentemente que represente o arquivo IDL externo. Você pode evitar a geração de código 
para o componente criado recentemente, configurando a propriedade generateCode como falso. Essa propriedade acompanha o estereótipo do componente a partir do 
perfil CORBA. Por exemplo, para gerar um "#include <ORB.idl>" no arquivo IDL, você deve criar uma dependência do componente que modele 
o arquivo IDL atual para um novo componente nomeado ORB. Além disso, para impedir a transformação do código de geração para o novo componente nomeado ORB, 
configure sua propriedade generateCode como falso.

5. Referências Cruzadas de Modelo

A transformação UML em CORBA suporta modelos com referências cruzadas. Por exemplo, Interface A no modelo atual poderia estender Interface B a partir de 
outro modelo. Nesses casos, a transformação cria um #include do arquivo IDL, no qual o tipo utilizado aparece (Interface B, nesse exemplo). 
A transformação não gerencia o local dos arquivos IDL incluídos no sistema de arquivos. Você deve manter os caminhos relativos dos arquivos IDL 
gerados utilizando um modelo de mapeamento.

 

6. Constructos CORBA Não Mapeados

Os constructos CORBA a seguir não possuem, atualmente, um mapeamento nesse perfil:

7. Suporte para Tecnologias Comuns de Transformação

 

7.1 Integração com a Equipe de Suporte

A transformação CORBA fornece integração com a Equipe de Suporte, de modo que os usuários podem efetuar o registro de saída automaticamente e incluir novos arquivos nos sistemas de controle de origem.

7.2 Modelo do Mapeamento de Transformação

Se você não deseja modificar um modelo de origem para uma transformação, é possível especificar nomes alternados para os elementos de destino da transformação. 
É possível também que deseje especificar nomes alternados caso queira incluir detalhes específicos para CORBA nos modelos independentes de plataforma, como restrições de nomenclatura 
. Para suportar nomes de destino alternados sem modificar o modelo de origem, crie um mapeamento de modelo.

Para criar um modelo de mapeamento:

1. Verifique se você está na perspectiva de Modelagem.
2. Na visualização Explorador de Modelos, clique em um modelo UML.
3. Na barra de menus, clique em Modelagem > Transformações > Configurar Transformações.
4. Crie uma nova transformação UML 2.0 para transformação CORBA (por exemplo, nomeie a transformação
Crie um mapeamento ).
5. Na página Mapeamento, clique em Criar somente modelo de mapeamento (sem transformação).
6. Especifique um nome de arquivo e clique em Executar.

 

Quando você utiliza um recurso de mapeamento de transformação, a transformação CORBA cria um modelo de mapeamento, que é um modelo separado que tem um artefato para cada elemento transformável. O artefato se refere a e tem o mesmo nome do elemento transformável original. Para especificar um nome alternativo para o elemento 
original, digite um novo nome na propriedade do nome do arquivo do artefato. Se você não alterar a propriedade do nome do arquivo do artefato, a transformação gera o elemento com o 
nome padrão do artefato. A seguinte tabela lista exemplos de nomes alternativos.

 

Origem UML

Nome do Arquivo do Artefato de Mapeamento

CORBA Gerado

Component1

"" 

Arquivo Component1.idl

Component2

"myIDL"

Arquivo myIDL.idl

Component3

"myDir\myIDL2"

arquivo myIDL2.idl na pasta "myDir".


Para utilizar um modelo de mapeamento:

1. Verifique se você está na perspectiva de Modelagem.
2. Na visualização Explorador de Modelos, clique em um modelo UML.
3. Na barra de menus, clique em Modelagem > Transformações > Configurar Transformações.
4. Crie uma nova Transformação UML 2.0 em CORBA (por exemplo, nomeie a transformação
Utilize mapeamento ).
5. Na página Mapeamento, clique em Utilizar Modelo de Mapeamento.
6. Clique no modelo de mapeamento criado anteriormente e clique em Executar.


Quando a transformação é executada, utiliza nomes alternativos especificados no modelo de mapeamento.

7.3 Validação

O plug-in de transformação CORBA fornece funcionalidade para validar modelos para potenciais problemas de transformação. Por exemplo, relacionamentos de generalização circular e conflitos de nomenclatura causam erros de compilação no arquivo IDL gerado. Para consultar uma lista de potenciais problemas que podem ocorrer no 
código gerado, aplique o perfil no modelo de origem e execute o recurso de validação.

A tabela a seguir lista alguns dos potenciais problemas de transformação.

Categoria

Potenciais Problemas de Transformação

Estereótipo CORBAValue

Um tipo de valor não deve ter nenhum classificador aninhado, exceto typedef, estrutura, exceção ou enumeração.

Um tipo de valor deve possuir membros com nomes exclusivos.

Um tipo de valor deve possuir atributos de herança exclusivos.

Um tipo de valor deve possuir operações de herança exclusivas.

Um tipo de valor pode suportar no máximo uma interface não-abstrata.

Um tipo de valor abstrato deve herdar apenas de outros tipos de valores abstratos.

Um tipo de valor não pode herdar da mesma classe mais de uma vez.

Um tipo de valor com membros de estados podem apenas herdar de um tipo de valor único com membros de estado.

Um tipo de valor abstrato não pode ter os membros de estado e não pode ser um tipo de valor guardado.

Um tipo de valor guardado não pode participar na herança.

Um tipo de valor guardado deve possuir exatamente uma associação ou um atributo.

Estereótipo CORBAConstants

 

A classe CORBAConstants não deve possuir operações.

A classe CORBAConstants não deve possuir quaisquer classificadores aninhados.

A classe CORBAConstants deve possuir membros com nomes exclusivos.

Estereótipo CORBAException

A classe CORBAException não deve possuir quaisquer classificadores aninhados.

Estereótipo CORBAStruct

Uma estrutura não deve ser proprietária de relacionamentos de generalização ou implementação.

Uma estrutura não deve possuir quaisquer classificadores aninhados.

Uma estrutura não deve possuir quaisquer operações.

Estereótipo CORBATypedef

Um typedef não deve possuir quaisquer relacionamentos de generalização.

Um typedef deve possuir um relacionamento de substituição.

Um typedef não deve possuir quaisquer associações, atributos ou operações.

Um typedef não deve possuir quaisquer classificadores aninhados.

Estereótipo CORBAState

Um atributo de membro de estado deve possuir uma classe de tipo de valor conforme seu proprietário.

Estereótipo CORBAOneway

Uma operação unilateral não deve possuir parâmetros com o tipo entrada ou entrada e saída.

Uma operação unilateral deve ter um tipo de retorno void.

Uma operação unilateral deve ter uma interface como sua proprietária.

Uma operação unilateral não deve causar quaisquer exceções.

Enumeração

Uma enumeração deve possuir literais enumerados com nomes exclusivos.

Componente

Um componente não deve conter um componente aninhado.

Todos os pacotes no componente devem possuir nomes exclusivos.

Interface

Uma interface deve possuir membros com nomes exclusivos.

Uma interface não deve conter interface, pacote, tipo de valor ou componente aninhados.

Uma interface sem restrições não pode herdar de uma interface local.

Uma interface deve possuir operações de herança exclusivas.

Uma interface deve possuir atributos herdados exclusivos.

Uma interface não pode herdar da mesma interface mais de uma vez.

Uma interface abstrata pode herdar somente de outras interfaces abstratas.

Geral

Um modelo não deve possuir elementos nomeados com palavras-chave CORBA (por exemplo, pacotes, classes, interfaces, operações, propriedades, parâmetros e enumerações).

Um modelo não deve possuir classes ou interfaces com relacionamentos de generalização ou implementação circulares.

Um modelo não deve possuir nomes de elemento duplicados.

Um modelo não deve possuir uma hierarquia formada de maneira inválida como uma que contenha um componente aninhado.