OCLE Object Constraint Language Environment Fábio Moura CIn-UFPE Roteiro Introdução Projetos Modelos Compilando Especificações OCL Model Checking Geração de Código Java Exemplo OCLE – Introdução OCLE foi especialmente projetada e implementada para auxiliar usuários UML no desenvolvimento de expressões OCL Erros no desenvolvimento dos modelos podem ser facilmente detectados e corrigidos Permite fácil criação de expressões OCL É uma ferramenta poderosa, de uso muito simples e intuitivo Permite acesso completo tanto a nível de meta modelos como de modelos É gratuita ! http://lci.cs.ubbcluj.ro/ocle/index.htm http://www.cin.ufpe.br/~in1006/2005/OCLE Projetos Permite o gerenciamento flexível de modelos e especificações OCL Poder ser desenvolvidos em arquivos separados e posteriormente unidos em um projeto Um mesmo arquivo OCL ou modelo UML pode ser usado em mais de um projeto OCLE Um projeto pode conter mais de um modelo UML Um deles deve ser o modelo ativo A sua criação é opcional A estrutura do projeto ativo é mostrada no Project panel Contém o Project Browser Mostra os arquivos contendo os componentes do projeto Projetos Project Browser Criando Novos Projetos Menu Project – New ... Modelos OCLE permite a importação de modelos UML realizados usando ferramentas CASE como o Rational Rose A precondição é que estes modelos estejam armazenados no formado XMI OCLE também permite a criação de modelos UML dentro de uma interface gráfica e então exportá-los para arquivos XMI O modelo ativo é mostrado no model browser Completa navegação e representação do modelo Filtragem Edição Model Browser, Estereótipos e Propriedades Diagramas Suportados Use Case Classe Objetos Diagrama de Classes Diagrama de Use Case Diagrama de Objetos Compilando Especificações OCL O compilador OCL permite ao usuário checar a corretude da sintaxe e da semântica de expressões OCL Componente chave de qualquer ferramenta OCL Menu Tools – Compile project specifications Tipos de arquivos com especificações OCL .ocl – especificações expressas no nível de meta modelo .bcr – especificações expressas no nível de modelo (restrições de negócio) Mensagens de Erro Model Checking OCLE realiza a checagem do modelo através da avaliação de restrições especificadas pelo usuário em diferentes elementos do modelo Ajuda a corrigir erro nos modelos e nas especificações OCL Maneira mais simples de checar o modelo Compile as especificações OCL Menu Tools – Check model Problemas são mostrados no painel Evaluation Avaliação Local Característica poderosa do OCLE que permite a avaliação parcial de uma expressão OCL em um determinado contexto Passos Escolha a regra que deseja avaliar – clique duas vezes em sua declaração de contexto Um menu popup será mostrado contendo todas as instâncias possíveis para a classe mencionada na declaração de contexto Selecione uma instância clicando duas vezes sobre ela OCLE automaticamente irá modificar o contexto para todas as regras Uma vez que o contexto foi escolhido, clique duas vezes em diferentes partes da expressão escolhida, OCLE irá tentar avaliar a expressão selecionada, mostrando o resultado no painel OCL Output Dê um duplo clique sobre o estereótipo da expressão (inv) para avaliar a expressão inteira Geração de Código Java O principal objetivo do gerador de código é produzir uma aplicação completamente executável a partir do modelo UML e suas especificações OCL associadas Transforma classes, interfaces e tipos de dados em seu código fonte Java correspondente Adicionalmente, restrições OCL associadas são transformadas em código executável, integrado ao código do modelo UML, produzindo uma aplicação Java que checa suas próprias restrições O código Java produzido é compilável, embora não seja completo Uma vez que o código foi gerado, ainda se faz necessário escrever o corpo dos métodos gerados Geração de Código Java Para invocar o gerador de código, use a opção do menu Tools – Generate code ... Exemplo Finance_Business_ClassDiagram Exemplo Código Gerado (.java) ... public void check_Order_first() { Enum enumType = Order.this.type; boolean bEquals = enumType.equals(Enum.buy); float fMatchedPrice = Order.this.matchedPrice; float fLimit = Order.this.limit; boolean bLessOrEqual = fMatchedPrice <= fLimit; boolean bImplies = !bEquals || bLessOrEqual; if (!bImplies) { System.err.println("invariant 'first' failed for object "+Order.this); } ... }