Myśli, porady, tutoriale na temat środowiska Eclipse (i nie tylko)...

niedziela, 20 kwietnia 2008

Eclipse Modeling Framework (EMF), część I

Ostatnio na zajęcia przygotowywałem materiał na temat MDA. Jako przykład takiego podejścia pokazywałem studentom projekt Eclipse Modeling Framework. Materiał jest w postaci tutoriala, więc doszedłem do wniosku, że nie zaszkodzi go tutaj umieścić.


Czym jest EMF?
OMG dostarcza tylko specyfikację MDA, natomiast konkretne implementacje dostarczają już firmy komercyjne oraz różne projekty open source. Wiele koncepcji MDA odnajdziemy w projekcie EMF (Eclipse Modeling Framework).
EMF sam w sobie jest frameworkiem dla generowania narzędzi i innych aplikacji na podstawie prostych modeli klas. EMF pozwala zamienić model na wydajny, poprawny i łatwy do zmiany kod Javy.
Główne zalety EMF’a to:
  • EMF na podstawie modelu potrafi wygenerowań kod Javy nadający się od razu do wykorzystania. Dodatkowym atutem jest możliwość wpływania na sposób generowania kodu. Zmiany wprowadzone w utworzonym kodzie nie są tracone podczas wprowadzania modyfikacji do modelu i ponownej generacji kodu.
  • Model może być dostarczony w różnych postaciach, m.in. kodu Javy z odpowiednimi adnotacjami, XML’a, pliku z narzędzi do modelowania (np. Rational Rose)
  • Instancje stworzonego modelu są domyślnie zapisywane i wczytywane z plików XMI (XML Metamodel Interchange). Można również dostarczyć swój własny sposób przechowywania modelu.
  • EMF pozwala na generowania prostego edytora umożliwiającego edycję instancji modelu z poziomu interfejsu użytkownika.
  • Wygenerowany kod umożliwia nam w prosty sposób nasłuchiwanie na zmiany dokonywane w instancji modelu.
Skoro EMF ma tyle zalet to spróbujmy stworzyć coś konkretnego z jego pomocą (przedstawiony tutaj przykład opiera się na artykule Using EMF).
Aby lepiej zrozumieć jak działa EMF spróbujemy stworzyć prosty model dla aplikacji do tworzenia drzew genealogicznych.
  1. Na początek musimy stworzyć projekt EMF, w tym celu wybieramy File->New->Eclipse ModelinfgFramework->Empty EMF Project, klikamy Next, podajemy nazwę projektu (np. FamilyTree) i kończymy pracę kreatora klikając Finish.
  2. Możemy się zabrać za definicję modelu. W widoku Package Explorer menu kontekstowego dla folderu model w naszym projekcie wybieramy New->Other->Example EMF Model Creation Wizards->Ecore Model, akceptujemy domyślną nazwę (My.ecore) i klikamy Finish. Powinien otworzyć się nam drzewiasty edytor, w którym będziemy definiować nasz model.
  3. Do edycji naszego modelu (a konkretnie do edycji atrybutów poszczególnych elementów) będziemy wykorzystywać widok Properties. Jeśli widok ten jeszcze nie jest otwarty, to otwieramy go wybierając w menu Window->Show View->Other->General->Properties.
  4. Jak zauważymy w naszym modelu na wstępnie mamy zdefiniowany pakiet. Klikamy na nim, a w widoku Properties zmieniamy jego nazwę (atrybut Name) oraz pozostałe atrybuty (Ns prefix, Ns URI) na familytree.
  5. Dalsza praca z modelem jest podobna do tworzenia modelu klas UML, jedyną różnicą jest to że zamiast standardowego edytora klas mamy tutaj do dyspozycji edytor drzewiasty. Stwórzmy sobie prosty model:
  6. W modelu EMF’a operujemy m.in. na następujących elementach:
    • EPackage odpowiada pakietowi
    • EClass odpowiada klasie
    • EEnum odpowiada typowi wyliczeniowemu
    • EAttribute odpowiada atrybutowi klasy
    • EOperation odpowiada metodzie klasy
    • EReference odpowiada referencji
  7. W modelu EMF potrzebujemy zawsze element, w którym będzie naszym korzeniem przechowującym pozostałe elementy, w naszym przypadku jest to klasa FamilyTree. Tworzymy ją klikając prawym przyciskiem myszy na pakiecie familytree i wybierając New->EClass. Następnie zmieniamy atrybut Name nowej klasy na FamilyTree.
  8. Pozostałe elementy modelu definiujemy w podobny sposób, trzeba jednak wziąć pod uwagę to, że każdy element modelu musi być gdzieś przechowywany, aby to określić używamy atrybut Containment. Zatem aby stwierdzić, że obiekty typu Individual mają być przechowywane w obiekcie FamilyTree (naszym kontenerze) to ustawiamy atrybut containment na relacji Individual-FamilyTree na true.

    Jeśli ktoś chce zobaczyć jak wygląda gotowy model to wystarczy ściągnąć plik My.ecore. Możemy zastąpić nasz plik gotowym modelem i przeanalizować jak poszczególne elementy modelu UML zmapowane są na elementy typowe dla EMF’a.
  9. Na koniec pracy nasz model powinien wyglądać mniej więcej tak:

Na tym dzisiaj zakończymy. W ciągu tygodnia powinna pojawić się druga część, w której zobaczymy jak z utworzonego modelu można wygenerować w pełni działający kod.

Brak komentarzy: