====== Opis ====== __**Projekt zakończony**__ **Grzegorz Caban**, Investigate runtime integration aspects, mainly the integration of the Object-Oriented Model in Prolog with a Java VC possibilities executable design, LogTalk, etc. * input Java, OO Prolog documentation, MVC concept. [[http://www.prologonlinereference.org/oop.psp|Prolog OOP]], [[http://www.logtalk.org|LogTalk]], [[http://www.trinc-prolog.com/doc/pl_obj.htm|TrincProlog]], [[http://www.sics.se/isl/sicstuswww/site/index.html|SICStus Prolog]] * output Feasibility study, a prototype. [[pl:miw:miw08_ruleruntimeo:spotkania | Historia spotkań ]] ====== Projekt ====== * {{:pl:miw:mvceditorlogtalk.zip|Edytor Tekstu oparty o MVC}} - View i Controller w J2SE, Model w Logtalk, modyfikacja istniejącej aplikacji napisanej w całości w J2SE, podmiana Model na Logtalk + implementacja integracji Java <-> Logtalk w Controller * {{:pl:miw:thermostatlogtalk.zip|Termostat oparty o MVC}} - View i Controller w J2SE, Model w Logtalk, przykład termostatu zaimplementowanego od podstaw w Javie i Logtalk'u na podstawie [[hekate:hekate_case_thermostat|modelu reguł]]. ==== Uruchomienie ==== Oba powyższe projekty to skompresowane projekty Eclipse, aby je uruchomić należy : - Rozpakować zawartość archiwum do wybranego przez siebie folderu, - Uruchomić Ecplipse IDE i jako Workspace wybrać folder wybrany w punkcie pierwszym - Nastepnie z menu kontekstowego Eclipse wybieramy **File -> New Project** - W oknie dialogowym wybieramy : **Java Project -> Next** - Zaznaczamy radiobutton : **Create project from existing source** i klikając browse wybieramy folder zawierający rozpakowane źródła projektu z punktu 1 - Wpisujemy nazwe projektu (musi być zgodna z nazwa folderu wybranego w poprzednim punkcie), klikamy **Next** - wybieramy finish na ostatniej stronie okna dialogowego - prawdopodobnie konieczne będzie [[pl:miw:miw08_ruleruntimeo:howto|skonfigurowanie JPL i logtalk]] - projekt jest gotowy do uruchomienia ====== Sprawozdanie ====== ===== Cel projektu ===== Celem projektu było przetestowanie możliwości budowy aplikacji wielowarstwowych opartych o wzorzec projektowy MVC przy użyciu Javy oraz Prologa. Zakładając, że aplikacja jest projektowana zgodnie z metodologia programowania obiektowego i na etapie projektowania aplikacji nie decydujemy, który moduł, czy wręcz obiekt której klasy ma zostać zaimplementowany przy użyciu Javy, a który w Prologu. Dopiero osoba implementująca ten projekt powinna mieć możliwość teoretycznie dowolnego wyboru jednej z tych technologii, w zależności od tego jak wygodniej będzie zaimplementować dany obiekt. Tak postawione założenia wymuszają znalezienie technologi/framework'a umożliwiającego: * Tworzenie kodu w języku Prolog z wykorzystaniem wszystkich dobrodziejstw programowania obiektowego. Jest to warunek konieczny, aby zapewnić pełną dowolność implementowania poszczególnych klas modelu w Prologu lub Javie, musimy zapewnić, że Prolog będzie zapewniał te same możliwości abstrakcji danych, enkapsulacji, dziedziczenia itp co Java. * Wygodną integracje kodu Prolog'a z kodem w Javie, w ideale bez tworzenia dodatkowego kodu służącego tylko do komunikacji pomiędzy obiektami napisanymi w różnych językach, a w praktyce minimalizujących ilość takiego kodu. Zwłaszcza istotne wydaje się aby implementacja tej warstwy komunikacyjnej dała się łatwo odseparować od logiki samej aplikacji, tak aby minimalnie zaburzyć projekt wejściowy. * Warte podkreślenia jest też wymóg integracji obiektów Prologa i Javy dopiero na etapie runtime'u, nie chodzi tutaj o wygenerowanie kodu Javy na podstawie kodu Prologa i poźniejsze uruchomienie aplikacji w samej Javie. Pierwszym zatem zadaniem było znalezienie odpowiedniego framework'a umożliwiającego tworzenie obiektów w Prologu oraz integracje tych obiektów z obiektami zaimplementowanymi w Javie. ===== Obiektowy Prolog ===== Poniżej znajduje się lista framework'ów, które zostały w ramach tego projektu przetestowane w nadziei znalezienia spełniającego wyżej postawione zadania : [[pl:miw:miw08_ruleruntimeo:oopframeworks|Analiza istniejących rozwiązań]] ===== Wybrane rozwiązanie ===== Jako docelowa platforma realizacji projektu został wybrany [[http://www.logtalk.org|LogTalk]] ze względu na fakt że zapewnia on pełne wsparcie dla obiektowości w Prologu, oraz jest w przeciwieństwie do [[http://www.sics.se/isl/sicstuswww/site/index.html|SICStus Prolog]] i [[http://www.sics.se/isl/sicstuswww/site/index.html|SICStus Prolog]] technologią w pełni Open Source, podczas gdy pozostałe dające praktycznie podobne możliwości są niestety technologiami komercyjnymi. ===== Integracja LogTalk'a z Java ===== Niestety sam Logtalk nie wspiera w żaden sposób integracji obiektów tworzonych przy jego pomocy z innymi językami obiektowymi. Dlatego kolejnym krokiem jest było znalezienie narzędzia umożliwiającego integracje Logtalk'a z Java. Ponieważ docelowym kompilatorem Prologa używanym w tym projekcie jest SWI Prolog, naturalna wydała się próba użycia do tego celu jedno z pakietów standardowych dołączanych do tej dysytrybucji, czyli [[http://www.swi-prolog.org/packages/jpl/|JPL]] który oferuje dwustronny interface pomiędzy Prologiem a Java.Jeżeli dodać do tego obiektowość oferowaną przez LogTalk to wydaje się, że jest to zestaw spełniający dane wymagania. [[pl:miw:miw08_ruleruntimeo:jpljava | Przykład użycia JPL do komunikacji Prolog'a z Java]]. Przykład całej klasy napisanej w Javie, służącej do komunikacji z obiektami LogTalk znajduje się tutaj [[https://dev.crazydwarves.org/ProjetM1TER/browser/trunk/src/fr/up5/mi/etu/vnfc/argumentation/engine/LogtalkEngine.java|LogTalkEngine]] == Napotkane problemy i rozwiazania == Podczas realizacji tego projektu natrafiono na sporo problemów natury konfiguracyjnej, co wydaje się dość naturalne jako że używamy kilka niezależnie tworzonych bibliotek. Oto lista ważniejszych problemów wraz z opisem ich rozwiązania : * [[pl:miw:miw08_ruleruntimeo:prologmodules | Używanie modułów zewnętrznych modułów Prologa z obiektów Logtalk]] * [[pl:miw:miw08_ruleruntimeo:swiconfig | Konfiguracja SWI-Prolog do współpracy z Logtalk]] [[pl:miw::miw08_ruleruntimeo:howto | Jak skonfigurować JPL i Logtalk ]] - uwagi na temat użycia i konfiguracji JPL i Logtalk do współpracy z Java. Celem przetestowania znalezionych rozwiązań na przykładzie prostej aplikacji opartej o wzorzec MVC, powstały dwie aplikacje opisane poniżej. Inne brane pod uwagę przykłady prostych projektów [[pl:miw::miw08_ruleruntimeo:mvcexamples|aplikacji opartych o MVC]] ===== Edytor Tekstu ===== Celem tego przykładu była próba zmiany gotowej aplikacji napisanej w [[http://java.sun.com/developer/technicalArticles/javase/mvc/| Javie opartej o wzorzec MVC]], na aplikacje której część logiki jest zaimplementowana poprzez obiekty Logtalk. [[pl:miw::miw08_ruleruntimeo:mvceditor | Jak zaimplementować model w Logtalku, w gotowej aplikacji J2SE opartej o MVC]] ===== Termostat ===== W odróżnieniu od poprzedniego przykładu temu przyświecał cel próby implementacji całej aplikacji, mając na starcie tylko [[hekate:hekate_case_thermostat|model]] w formie diagramów ARD, XTT. Model ma zostać zaimplementowany w Logtalk'u, reszta w Javie. [[pl:miw::miw08_ruleruntimeo:mvcthermostate | Jak zaimplementować MVC w Javie i Logtalku na podstawie diagramów ARD, XTT]] ====== Materiały ====== * [[http://java.sun.com/developer/technicalArticles/javase/mvc/|Opis edytora tekstu z strony Sun'a]] oraz {{:pl:miw:mvceditordescription.zip|kod tej strony}} * {{:pl:miw:mvcexample.zip|źródła edytora dokumentów w oryginale (bez Logtalk)}} * [[https://dev.crazydwarves.org/ProjetM1TER/wiki|Projekt wykorzystujący Logtalk i JPL do integracji z Java]] * [[http://logtalk.org/|Logtalk - strona główna ]] * [[http://www.swi-prolog.org/packages/jpl/| Dokumentacja do JPL ]]