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.
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.
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.
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.
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:
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.
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.
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 |
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.
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.
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.
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 |
Atributos e associações UML 2.0 mapeiam para atributos CORBA. A tabela a seguir mostra como a transformação transforma propriedades de atributo.
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 |
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 |
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 |
Uma enumeração UML 2.0 mapeia para a enumeração CORBA. Uma enumeração pode conter apenas literais de enumeração.
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 |
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
.
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.
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.
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.
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.
Os constructos CORBA a seguir não possuem, atualmente, um mapeamento nesse perfil:
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.
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.
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. |