O EMF – Eclipse Modeling Framework Pasteur Ottoni de Miranda Junior O EMF –Eclipse Modeling Framework -é um framework e uma ferramenta para geração de código Java baseada em um modelo estruturado. É uma alterntiva ao MOF. O código pode ser gerado a partir de um documento XMI ou um modelo mdl (Rose), interfaces Java Anotado e ainda esquemas XML. Uma vez criado o modelo, o gerador EMF gera um conjunto de classes de implementação, que podem ser modificadas e editadas. Possui suporte a persistência via XMI . É constituído por dois frameworks fundamentais: O core framework, suporte para criação de classes de implementação e o framework EMF.edit, suporte para edição do modelo. A Figura 1 abaixo exibe a estrutura básica do EMF, denominada ECore e constitui o core framework do mesmo. Repare na semelhança com o MOF, pela existência de estruturas para representação de classes (EClass), atributos (EAtributte), operações (EOperation), pacotes (EPackage), objetos (EObject) dentre outras. Figura 1 – Estrutura básica do EMF (ECore) Representação de estruturas no EMF Na Figura 2 temos um exemplo de classe denominada Book, contendo dois atributos, title e pages. 2 Figura 2- Classe Book e seus atributos Essa classe e sua representação em XMI, Java anotado e esquema XML são exibidos nas Figuras 3, 4 e 5. Figura 3 – Representação da classe Book em XMI Figura 4 – Representação da classe Book em Java anotado 3 Figura 5 – Representação da classe Book em XMI O código Java gerado a partir do modelo Para cada classe no modelo, uma interface Java e a classe de implementação respectiva são geradas. Essa interface contém métodos para armazenar (métodos setter como setTitle() no exemplo) e recuperar (métodos getter como getTitle() no exemplo) dados: Figura 6 – Interface Book gerada Repare que a interface Book estende a classe EObjetc do EMF. Também é gerada a implementação da interface Book, como mostrado abaixo. Repare que os métodos getters e setters são implementados. Figura 7 – Implementação da classe Book 4 Repare acima, na implementação dos getters e setters. No setter, método eNotify() envia notificações a observadores que possam estar monitorando (listening) o objeto. Quando não há, eNotificationRequired() retorna false. Código gerado para estruturas no EMF Referências unidirecionais Na Figura 8 vemos a classe Book e uma associação unidirecional com seu Writer (autor). Repare que são criados os métodos setAuthor(Writer value) e getWriter() que respectivamente armazenam e recuperam um objeto do tipo Writer. Figura 8 – Classe Book e uma associação unidirecional com a classe Writer Relacionamento um para muitos Na Figura 9, vemos que o EMF gera objetos EList (lista de objetos Book) para representação de relacionamentos um para muitos. Repare no código for (iterator... que percorre essa lista de objetos. 5 Figura 9 – Representação de relacionamento um para muitos Agregações Como em relacionamentos um para muitos, agregações são implementadas como listas (EList). Figura 10- Implementação de agregações como Elist Enumerações Na Figura 11 abaixo, exibe-se a implementação de enumerações. A classe BookCategory implementa como enumeration algumas categorias de livros, que são atributos dela. Veja na implementação em Java gerada pelo EPF, essas categorias implementadas como atributos. Na classe Book, são gerados os métodos getCategory() e setCategory() que retornam e atribuem categorias de livros. 6 Figura 11- Implementação de enumerações Factories O EPF utiliza o padrão de projeto Factory Method para criar objetos. Veja na Figura 12 a classe LibraryFactory, que contém os factory methods createBook(), createLibrary() e createWriter(). 7 Figura 12 – Factory methods para criação de objetos Herança A Figura 13 exibe a implementação gerada pelo EPF, da estrutura de herança. Figura 13-Implementação da herança Modificação do código gerado A tag \@generated indica porções do código que foram geradas pelo EPF. Se removida, como na Figura 14, o código inserido abaixo será mantido. 8 Figura 14 – Como modificar código gerado Criar e acessar instâncias Na Figura 14 abaixo, podemos ver no código gerado pelo EPF a criação da instância da fábrica de objetos (objeto Factory) e a criação dos objetos book e writer por meio dos respectivos factory methods (createBook() e createWriter()). 9 Figura 15- Criação de instâncias Persistir instâncias O código exibido na Figura 16 mostra o código gerado pelo EPF para armazenamento persistente de instâncias. Essas instâncias são armazenadas em arquivos XMI, no exemplo, mylibray.xmi (Figura 17). Figura 16-Armazenamento persistente de objetos em arquivo XMI 10 Figura 17- Arquivo XMI gerado para armazenamento de instâncias Carregar instâncias armazenadas em arquivo XMI A Figura 18 mostra como instâncias são recuperadas a partir de arquivos XMI (no exemplo, o arquivo mylbrary.xmi). Figura 18- Recuperando instâncias salvas em arquivo XMI Referência http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.emf.doc/references/overvi ew/EMF.html 11