[[
✎ pl:miw:miw08_gefardxtt_1
]]
aiWiki
Pokaż stronę
Ostatnie zmiany
Indeks
Zaloguj
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== Opis ====== __**Projekt zakończony**__ Maciej Dudek (4AR) <md5@o2.pl> ARD GEF and Eclipse based editor for ARD and XTT. Evaluation, feasibility, prototype. XTTv2 Editor [[miw:xtt requirements|requirements]] * input * Eclipse: [[http://www.eclipse.org/modeling/|EMF]], Eclipse -> EMF -> GMF -> GEF * ARD: [[hekate:bib:hekate_bibliography#gjn2008flairs-ardformal|Towards Formalization of ARD+ Conceptual Design and Refinement Method]] and [[hekate:bib:hekate_bibliography#gjn2008flairs-ardprolog|An ARD+ Design and Visualization Toolchain Prototype in Prolog]] and [[hekate:bib:hekate_bibliography#gjn2008flairs-userv|UServ Case Study, Conceptual Design with ARD+ Method]]. * output Feasibility study, a description how to create such editors with GEF, a prototype editor MS Thesis regarding GEF: Interfejs graficzny do budowy aplikacji komponentowych zapewniający weryfikację semantyczną, ARD+ Editor [[miw:ard requirements|requirements]] ====== Spotkania ====== [[pl:miw:miw08_gefardxtt_1:spotkania|Archiwum spotkań]] ====== Projekt ====== ===== Source ===== - {{:pl:miw:miw08_gefardxtt_1:ardeditor_project.zip|Ard Editor Project}} - {{:pl:miw:miw08_gefardxtt_1:ardeditor_diagram.zip|Ard Editor Diagram}} - {{:pl:miw:miw08_gefardxtt_1:ardeditor_edit.zip|Ard Editor Edit}} ==== Sposób uruchomienia ==== - Zaimportuj Ard Editor Diagram oraz Ard Editor Edit jako projekt w Eclipse - Otwórz oba projekty - Kliknij prawym przyciskiem na Ard Editor Diagram: - Run As... -> Eclipse Application - W nowo otwartym oknie Eclipse utwórz nowy projekt (wystarczy nawet pusty katalog) - Kliknij //New// -> Examples -> My Diagram - Otworzy się edytor. Użytkownik musi podać 2 nazwy plików: - Plik edytora o rozszerzeniu .hml_diagram (odpowiada za rozmieszczenie na ekranie itp) - Plik modelu o rozszerzeniu .hml (w formacie XML) ====== Sprawozdanie ====== ===== 1. Przygotowanie ===== ==== 1.1 Lektury ==== Swoją pracę rozpocząłem od lektury następujących prac: * {{:pl:miw:mgr-gef.pdf|GEF MS Thesis}} - Część pracy magisterskiej Macieja Kwietnia i Jana Rachwalika dotycząca GEF. * [[https://ai.ia.agh.edu.pl/wiki/hekate:bib:hekate_bibliography#gjn2008flairs-ardformal|Specyfikacja Ard+]] * [[https://ai.ia.agh.edu.pl/wiki/hekate:bib:hekate_bibliography#gjn2008flairs-ardprolog|System varda]] * [[https://ai.ia.agh.edu.pl/wiki/hekate:bib:hekate_bibliography#gjn2008flairs-userv|UServ case study]] * [[http://www.eclipse.org/articles/Article-GEF-diagram-editor/shape.html|Diagram Editor]] * [[http://www.eclipse.org/articles/Article-GEF-editor/gef-schema-editor.html|Schema Editor]] * [[http://wiki.eclipse.org/index.php/GMF_Tutorial|Mindmodel Tutorial]] Dalsze kroki to: * Uruchomienie programu Varda. * Zainstalowanie EMF, GEF, GMF. * Uruchomienie przykładowych edytorów: Logic Diagram, Flow Diagram, Shapes Diagram. ==== 1.2 Wyjaśnienie skrótów ==== Ponieważ skróty EMF, GEF i GMF są do siebie podobne, po krótce wyjaśnię między różnice między tymi frameworkami: * [[http://www.eclipsecon.com/modeling/emf/|EMF]] - służy do tworzenia modeli, logiki biznesowej. Modele zapisywane są w plikach ecore. Jest możliwa konwersja między modelami w ecore oraz modelem opisanym przy pomocy [[http://www.w3.org/XML/Schema|XSD (XML Schema)]]. * [[http://www.eclipse.org/gef/|GEF]] - służy do tworzenia edytorów graficznych. Opiera się na bibliotece draw2d, z której czerpie narzędzia do rysowania. Jest dość skomplikowany i trudny w opanowaniu. Daje za to szerokie możliwości. Uwaga, nie mylić z [[http://gef.tigris.org/|innym GEF]], który nie jest projektem Eclipse. * [[http://www.eclipse.org/modeling/gmf/|GMF]] - plugin do Eclipse - w stosunku do GEF znacznie ułatwia tworzenie edytorów. Jest niejako graficzną "nakładką" na framework GEF pomagając programiście stworzyć edytor. Można skorzystać z narzędzia [[http://eclipser-blog.blogspot.com/2007/06/gmf-project-in-5-minutes-with-gmf.html|dashboard]], który jest zaimplementowany jako jeden z widoków w Eclipse. Prowadzi on programistę przez proces tworzenia edytora używając do tego szeregu //wizardów// i łącząc drobne części ze sobą. Na końcu generowany jest kod edytora w GEF uzupełniony o Runtime GMF. Jednak trudno wykorzystać GMF do zaawansowanych problemów. Dla niestandardowych problemów trzeba edytować kod na własną rękę korzystając z klas GEF. Podsumowując, zastosowanie GMF daje zautomatyzowanie generacji kodu, ale może nie wystarczyć w niestandardowych projektach. Zatem tworząc aplikację z pewnością użycie wszystkich z nich będzie nieodzowne a ich działanie będzie się przenikało. ===== 2. Pierwsza próba stworzenia edytora ===== ==== 2.1 Użycie definicji DTD i translacja do XSD ==== Aby skorzystać z możliwości EMF importując model XSD, przekształcono definicję [[https://ai.ia.agh.edu.pl/wiki/_media/hekate:hml.dtd?id=hekate%3Ahekate_markup_language&cache=cache|HML.dtd]] z postaci DTD do postaci XSD. Efekt został przedstawiony poniżej: <code xml> <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="hml"> <xs:complexType> <xs:sequence> <xs:element ref="type_set"/> <xs:element ref="attribute_set"/> <xs:element minOccurs="0" ref="property_set"/> <xs:element minOccurs="0" ref="tph"/> <xs:element minOccurs="0" ref="ard"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="type_set"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="type"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="type"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" ref="desc"/> <xs:element ref="domain"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:ID"/> <xs:attribute name="name" use="required"/> <xs:attribute name="base" use="required"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="integer"/> <xs:enumeration value="numeric"/> <xs:enumeration value="string"/> <xs:enumeration value="bool"/> <xs:enumeration value="date"/> <xs:enumeration value="time"/> <xs:enumeration value="timestamp"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="length"/> <xs:attribute name="scale"/> </xs:complexType> </xs:element> <!-- id should begin with 'tpe_...' --> <xs:element name="desc" type="xs:string"/> <xs:element name="domain"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="range"/> <xs:element ref="value"/> </xs:choice> <xs:attribute name="type"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="ordered"/> <xs:enumeration value="unordered"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="range"> <xs:complexType> <xs:attribute name="from" use="required"/> <xs:attribute name="to" use="required"/> </xs:complexType> </xs:element> <xs:element name="value" type="xs:string"/> <xs:element name="attribute_set"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="att"/> <xs:element minOccurs="0" maxOccurs="unbounded" ref="group"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="att"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" ref="desc"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:ID"/> <xs:attribute name="type" type="xs:IDREF"/> <xs:attribute name="name" use="required"/> <xs:attribute name="abbrev"/> <xs:attribute name="value" use="required"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="single"/> <xs:enumeration value="multiple"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="class" use="required"> <xs:simpleType> <xs:restriction base="xs:token"> <xs:enumeration value="ro"/> <xs:enumeration value="rw"/> <xs:enumeration value="wo"/> <xs:enumeration value="state"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <!-- id should begin with 'att_...' --> <xs:element name="group"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" ref="desc"/> <xs:element maxOccurs="unbounded" ref="attref"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:ID"/> <xs:attribute name="name" use="required"/> <xs:attribute name="abbrev"/> </xs:complexType> </xs:element> <!-- id should begin with 'grp_...' --> <xs:element name="attref"> <xs:complexType> <xs:attribute name="ref" use="required" type="xs:IDREF"/> </xs:complexType> </xs:element> <xs:element name="property_set"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="property"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="property"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="attref"/> </xs:sequence> <xs:attribute name="id" use="required" type="xs:ID"/> </xs:complexType> </xs:element> <!-- id should begin with 'prp_...' --> <xs:element name="tph"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="trans"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="trans"> <xs:complexType> <xs:attribute name="src" use="required" type="xs:IDREF"/> <xs:attribute name="dst" use="required" type="xs:IDREF"/> </xs:complexType> </xs:element> <xs:element name="ard"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" ref="dep"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="dep"> <xs:complexType> <xs:attribute name="independent" use="required" type="xs:IDREF"/> <xs:attribute name="dependent" use="required" type="xs:IDREF"/> </xs:complexType> </xs:element> </xs:schema> </code> Dokument [[https://ai.ia.agh.edu.pl/wiki/_media/hekate:hml-test.xml?id=hekate%3Ahekate_markup_language&cache=cache|hml-test.xml]] poprawnie przechodzi [[http://www.xmlforasp.net/SchemaValidator.aspx|walidację]] przy użyciu powyższej definicji. Konwersji dokonano przy użyciu programu [[http://www.thaiopensource.com/relaxng/trang-manual.html|Trang]]. === Problem z użyciem powyższej definicji === Powyższa definicja, choć poprawna, okazała się niekompatybilna z frameworkiem GMF. Podstawowe problemy to: * Relacja zawierania się - brak bezpośredniego połączenia korzenia z property. W definicji oryginalnej występuje następujące zawieranie: //ard -> property_set -> property//. Zgodnie z takim modelem, aby utworzyć //property//, musielibyśmy tworzyć pośredni element //property_set// oraz połączenia między nimi. Jest to naturalnie sprzeczne z naszym założeniem. * Wybór korzenia - edytor tworzony jest dla konkretnego elementu w modelu. Wybierając korzeń K możemy edytować elementy zawarte w K, ale innych nie. Więc jeśli chcemy mieć możliwość edycji //property_set// oraz //ard// to naszym korzeniem musiałby być element //hml//. Lecz wtedy nasz edytor rozrósłby się jeszcze bardziej - o element //ard//. * Elementy IDREF - korzystanie z elementów IDREF nie uniemożliwia, lecz czyni trudniejszym tworzenie modelu. Trzeba jednak użyć [[http://www.eclipse.org/modeling/emf/docs/overviews/XMLSchemaToEcoreMapping.pdf|Ecore Annotations]]. Dokonano próby utworzenia edytora wszystkich elementów (bez żadnej customizacji) za pomocą pluginu do GMF o nazwie [[http://dynamicgmf.sourceforge.net/|Dynamic GMF]]. Ten plugin ma w założeniu dać możliwość wygenerowania edytora jedynie przez wybranie pliku xsd. Pojawiał się jednak błąd wewnętrzny programu "Null pointer exception". Takiego błędu nie było gdy użyłem pliku [[http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.gmf/examples/org.eclipse.gmf.examples.mindmap/model/mindmap.xsd?root=Modeling_Project&view=markup&content-type=text%2Fvnd.viewcvs-markup&revision=HEAD|mindmap.xsd]]. Sądzę, iż obecność elementów IDREF mogła się do tego przyczynić. ==== 2.2 Inna metodologia tworzenia modeli ==== Dużo bardziej naturalnym, prostszym i efektywniejszym sposobem jest tworzenie modelu ecore pasującego do GMF. I tak import z XSD następuje do pliku ECORE, na którym później się operuje. Kolejnym krokiem mogłoby być eksportowanie tego modelu do XSD. W razie potrzeby można by dokonywać konwersji między róznymi definicjami XSD za pomocą szablonów XSLT. ==== 2.3 Własny model ==== Stworzyłem zatem edytor opierając się o własny model. Model powstał przy pomocy EMF, który następnie wyeksportowałem do formatu XSD. Nowa wersja Ard.xsd: <code xml> <?xml version="1.0" encoding="UTF-8" standalone="no"?> <xsd:schema xmlns:hml="hml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="hml"> <xsd:element name="Ard" type="hml:Ard"/> <xsd:element name="Property" type="hml:Property"/> <xsd:element name="Atrybut" type="hml:Atrybut"/> <xsd:complexType name="Ard"> <xsd:sequence> <xsd:element maxOccurs="unbounded" minOccurs="0" name="property" type="hml:Property"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Property"> <xsd:sequence> <xsd:element maxOccurs="unbounded" minOccurs="0" name="atrybut" type="hml:Atrybut"/> </xsd:sequence> <xsd:attribute name="dependant"> <xsd:simpleType> <xsd:list itemType="xsd:anyURI"/> </xsd:simpleType> </xsd:attribute> </xsd:complexType> <xsd:complexType name="Atrybut"> <xsd:attribute name="nazwa"/> </xsd:complexType> </xsd:schema> </code> Niestety, zawiera on jedynie opis ARD, bez TPH ani XTT. Poniżej zamieszczono screen z edytora oraz odpowiadający mu plik xml. ==== 2.4 Edytor oparty na własnym modelu ==== Diagram Ard {{http://hyper.ia.agh.edu.pl/~dudekm/zdj/przykladowy_edytor_1.jpg}} Wygenerowany plik XML: <code xml> <?xml version="1.0" encoding="UTF-8"?> <hml:Ard xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:hml="hml"> <property dependant="//@property.1 //@property.2"> <atrybut nazwa="jeden"/> <atrybut nazwa="dwa"/> </property> <property> <atrybut nazwa="trzy"/> <atrybut nazwa="cztery"/> </property> <property> <atrybut nazwa="pięć"/> <atrybut nazwa="sześć"/> </property> </hml:Ard> </code> Sprawdzono zgodność pliku xml ze schematem xsd. Możliwości edytora ważne z punktu widzenia ARD: * Dodawanie nowych elementów //property//. * Dodawanie elementów //attribute// do //property//. * Łączenie elementów //property//. * Zapis do pliku xml. ===== 3. Perspektywy projektu ===== Jest to wstępny zarys edytora. Docelowy edytor miałby posiadać bogatą funkcjonalność. Dalsze elementy, które należałoby zaimplementować to: * Menu kontekstowe zawierające komendy //split// dla elementów //attribute// oraz //finalize// dla elementów //property//. [[http://wiki.eclipse.org/index.php/GMF_Tutorial_Part_3#Custom_Actions|Custom Actions]] * Utworzenie dwóch dodatkowych warstw: do pierwszej należałyby elementy i połączenia ard bez tph, do drugiego same elementy tph bez ard. Następnie należałoby umożliwić włączanie oraz wyłączanie widoczności warstw. W szczególności obie warstwy mogłyby być widoczne aby widzieć zarówno drzewo TPH jak i ARD. * Utworzenie połączenia edytora ARD z edytorem XTT. To połączenie mogłoby przyjąć różną formę: - otwarcia property w edytorze XTT [[http://dev.eclipse.org/newslists/news.eclipse.tools.gef/msg15508.html|link]] - edycji XTT poprzez duże zbliżenie (zoom) na sfinalizowany element property. * Utworzenie edytora XTT. ===== 4. Wnioski ===== * Model warto tworzyć od podstaw w EMF. * GEF to potężne narzędzie, lecz trudne w opanowaniu. * API GMF oraz GEF zostało w ostatnim czasie uzupełnione o komentarze, lecz nadal jest wiele miejsc, gdzie ich brakuje. * Tutoriale są ukierunkowane na kilka zagadnień, w sprawie innych trzeba się pytać na forach dyskusyjnych, lub wręcz pisać do twórców frameworku. ===== 5. Linki ===== Poniżej zamieszczam wartościowe linki związane z moim projektem: === Instalacja GMF === * [[http://wiki.eclipse.org/index.php/GMF_Tutorial|Instalacja + tutorial]] * [[http://www.brovig.org/blog/2007/05/17/installing-gmf-on-eclipse-33-m7-europa/|installing-gmf-on-eclipse-33-m7-europa]] === Nauka === * [[http://www.eclipse.org/articles/Article-Introducing-GMF/article.html|Introducing GMF]] * [[http://www.eclipse.org/articles/Article-GEF-editor/gef-schema-editor.html|GEF Schema Editor]] * [[http://www.ibm.com/developerworks/library/os-ecemf1/|IBM tutorial]] * [[http://mirrors.ibiblio.org/pub/mirrors/eclipse/technology/phoenix/demos/gmf-orgchart/|Screencast]] - bardzo przydatny. * [[http://www.eclipse.org/articles/Article-FromFrontendToCode-MDSDInPractice/article.html|Inne podejście do tematu]] * [[http://wiki.eclipse.org/index.php/GMF_Tutorial_BPMN|Tutorial]] - edytora [[http://pl.wikipedia.org/wiki/BPMN|BPMN]]. Krok po kroku. === Troubleshooting === Problemy, które napotkałem oraz linki pomocne w ich rozwiązaniu: * [[http://dev.eclipse.org/newslists/news.eclipse.technology.gmf/msg03925.html|Containment Feature]] === Support === * [[http://www.nabble.com/Eclipse-GEF---Dev-f2208.html|GEF mailing list archive]] * [[http://eclipseforum.org.pl/|Polskie forum eclipse]] - zostało uruchomione pod koniec 2007 roku. === Inne === * [[http://wiki.eclipse.org/index.php/GMF_Documentation|GMF_Documentation]] - zawiera wiele dalszych linków. * [[http://help.eclipse.org/help33/index.jsp|Eclipse 3.3 API]] - zawiera również GMF, GEF. * [[http://eclipse-po-polsku.blogspot.com/|Eclipse po polsku]] * [[http://www.redbooks.ibm.com/redbooks/pdfs/sg246302.pdf|IBM red book]], [[http://publib-b.boulder.ibm.com/Redbooks.nsf/RedpieceAbstracts/sg246302.html|code]] - bardzo przydatne, wiele elementów dobrze opisanych. ====== Materiały ====== GEF resources ([[http://www-128.ibm.com/developerworks/opensource/library/os-eclipse-gef11/?ca=dgr-lnxw07EclipseGEF|GEF]], [[http://www.eclipse.org/articles/Article-GEF-editor/gef-schema-editor.html]]), {{:pl:miw:mgr-gef.pdf|GEF MS Thesis}} Patrz też na [[hekatedev:eclipse|osobne hasło]]
pl/miw/miw08_gefardxtt_1.txt
· ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
Pokaż stronę
Poprzednie wersje
Menadżer multimediów
Do góry