====== Drools I ======
**UWAGA** Ukończenie wszystkich ćwiczeń z tego laboratorium jest konieczne do rozpoczęcia pracy na następnych zajęciach!!!
Aby móc korzystać z Drools w Eclipse należy odpowiednio go skonfigurować. W systemie jest zainstalowana awersja Eclipse z wgraną wtyczką do obsługi Drools, ale konieczne jest ustawienie ścieżki do //runtime'u// Drools w Eclipse. W tym celu, po uruchomieniu //eclipse//:
- Wejdź w //Window->Preferences//.
- Z drzewka po prawej wybierz //Drools/Installed Drools Runtime//.
- Następnie zaznacz runtime znajdujacy sie na liście i wybierz kliknij na przycisk //Edit//.
- Wskaż katalog //drools-runtime// znajdujacy siew katalogu // /usr/local/eclipse/drools-runtime//.
- Upewnij się, że runtime jest zaznaczony na liście i uruchom ponownie środowisko.
=====Wstęp=====
====Utworzenie projektu Drools====
- Kliknij //File->New->Project->Drools->Drools Project//
- Podaj nazwę projektu i kliknij //Next//
- Zaznacz opcje jak na obrazki i kliknij //Next// \\ {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:newproject-2.png|}}
- Upewnij się, że projekt jest związany z jakimś //Drools runtime// i kliknij //Finish//.
====Struktura projektu Drools====
===Podział kodu źródłowego===
Kod źródłowy projektu Drools dzieli się na dwie części:
- Katalog //src/main/java// gdzie znajduje się kod w języku Java odpowiedzialny za uruchamianie wnioskowania oraz definicje klas wykorzystywanych w bazie wiedzy
- Katalog //src/main/rules// w którym znajdują się definicje reguł i diagramy DroolsFlow.
{{:pl:dydaktyka:piw:2010:systemy_ekspertowe:structure.png|}}
===Podstawowa składnia reguł===
Reguły w Drools budowane są według następującego schematu:
rule "NazwaReguły"
// Opcje charakteryzujace regułę
when
// Część warunkowa
then
// Operacje wykonywane w przypadku gdy część warunkowa jest prawdziwa
end
W przykładzie "Hello World" w Eclipse w części warunkowej pojawia się następująca linijka:m : Message( status == Message.HELLO, myMessage : message )
Należy ją czytać tak: //Jeśli w bazie faktów istnieje obiekt klasy Message, taki że jego pole status jest równe polu Message.HELLO, to niech m będize uchwytem do tego obiektu a myMessage uchwytem do pola tego obiektu o nazwie message//.
Inaczej mówiąc operator **:** (dwukropek) działa tutaj podobnie jak operator przypisania a polecenie podobne wywołaniu konstruktora klasy Message jest tak naprawdę instrukcja warunkową.
===Uruchomienie wnioskowania w "Hello World"===
W pliku //DroolsTest.java// zamieszczony jest kod odpowiedzialny za stworzenie bazy wiedzy, dodanie faktów i uruchomienie wnioskowania.
metoda private static KnowledgeBase readKnowledgeBase() throws Exception
odpowiedzialna jest za stworzenie bazy wiedzy na podstawie plików z regułami.
Pliki z regułami muszą być przekazane do obiektu //KnowledgeBuilderFactory//. Odpowiedzialna jest za to następująca linijka:...
kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);
...
Fakty muszą również zostać dodane do bazy faktów (reprezentowanej przez obiekt klasy //StatefulKnowledgeSession//:...
// stworzenie obiektu-faktu
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
// dodanie obiektu-faktu do bazy wiedzy
ksession.insert(message);
...
==Ćwiczenie==
Uruchom projekt "Hello World". Zmodyfikuj klasę //Message// dodaj±c jeszcze jedno pole enumerate o wartości CONVERSATION. Zmodyfikuj regułę Hello tak aby zmieniała status na CONVERSATION. Dopisz regułę odpowiadajacą temu polu. Uruchom projekt.
=====Cashpoint=====
Utwórz kolejny projekt analogicznie jak poprzednio, zaznaczając również aby zostały wygenerowane przykłady HelloWorld i DroolsFlow. Następnie postępuj według wskazówek, modyfikując przykładowe pliki.
====Opis====
System powinien modelować zachowanie typowego bankowemu. Użytkownik podaje bankomatowi swój PIN a następnie może wykonać jedną z następujących operacji:
- wypłata gotówki
- sprawdzenie salda na koncie
Bankomat ma pewien limit gotówki jaka może wypłacić. Konto użytkownika też ma ograniczone saldo.
Bankomat może odmówić transakcji i zatrzymać kartę po trzech niepoprawnych wpisaniach numeru PIN.
====Klasy====
Dodaj następujące klasy do swojego projektu do katalogu //src/main/java//:
* {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:bankomat.txt|Bankomat}}
* {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:konto.txt|Konto}}
====Reguły====
Zapisz następujące reguły. Umieść je w dwóch plikach: //Autoryzacja// oraz //Akcja//.
Aby dodać nowy plik reguł kliknij prawym przyciskiem myszy na nazwę projektu, a następnie //New->Other...->Drools/Rule//.
- Wybierz projekt i katalog w którym ma być umieszczony plik z regułami (///src/main/rules//),
- wpisz nazwę pliku z regułami i nazwę pakietu (//com.sample//) i kliknij //Finish//.
**Plik: Autoryzacja**
Napisz reguły sprawdzające poprawność PINu i w razie gdy PIN został wpisany poprawnie ustawiające wartość pola autoryzacja na //true//.
Zakładamy, że pole //poprawnyPin,saldo,wpisanaKwota,limitGotowki// są polami których wartości są ustalane na razie odgórnie.
^Nazwa reguły^Warunek^Akcja^
|InvalidPIN|poprawnyPIN != wpisanyPIN && iloscProb < 3 | iloscProb++ |
|BlockAccount|poprawnyPIN != wpisanyPIN && iloscProb == 3 | blokada=true |
|AuthGranted|poprawnyPIN == wpisanyPIN && iloscProb < 3 | autoryzacja=true |
**Plik: Akcja**
Napisz reguły odpowiedzialne za akcje bankomatu:
^Nazwa reguły^Warunek^Akcja^
|PayOut| autoryzacja == true && wybranaAkcja == wyplata && wpisanaKwota <= saldo && wpisanaKwota<=limitGotowki| "Wyplacam pieniadze" |
|CahspointLimit| autoryzacja == true && wybranaAkcja == wyplata && wpisanaKwota <= saldo && wpisanaKwota>limitGotowki| "Za malo pieniedzy w bankomacie!" |
|AccountLimit| autoryzacja == true && wybranaAkcja == wyplata && wpisanaKwota > saldo | "Za malo srodkow na koncie" |
|Balance| autoryzacja == true && wybranaAkcja == saldo | "Twoje saldo to: " |
|Unauthorized| autoryzacja == false && blokada == true| "Brak autoryzacji, blokuje karte" |
====Sterowanie wnioskowaniem====
Zmodyfikuj plik z katalogu //src/main/java/// odpowiedzialny za uruchamianie wnioskowania, tak aby oba pliki z regułami zostały dodane do abzy wiedzy. Stwórz obiekty klas Konto i Bankomat i dodaj je do bazy faktów.
Uruchom wnioskowanie. System prawdopodobnie nie będzie działać poprawnie, albo wpadnie w pętle nieskończoną. Podczas wywoływania //update// silnik wnioskujący przetworzy jeszcze raz wszystkie reguły, łącznie z tą która wywołała //update//. Taka sytuacja może powodować zapętlenie się wnioskowania jeśli warunki uruchomienia reguł nie zabezpieczają takiej sytuacji w 100%. Aby oznaczyć regułę jako taka, która powinna być przetworzona tylko raz w cyklu wnioskowania, należy dopisać **no-loop** przed częścią warunkową:
rule "NazwaReguły"
no-loop
when
// Część warunkowa
then
// Operacje wykonywane w przypadku gdy część warunkowa jest prawdziwa
end
Aby wskazać silnikowi wnioskującemu kolejność uruchamiania reguł, można użyć pola **salience**, określającego priorytet reguły. Im wyższa wartość //salience//, tym wyższy priorytet. Reguły o wyższym priorytecie uruchamiane są w pierwszej kolejności.
rule "NazwaReguły"
no-loop
salience 10
when
// Część warunkowa
then
// Operacje wykonywane w przypadku gdy część warunkowa jest prawdziwa
end
Można również korzystać z mechanizmu grupowania reguł w moduły (tutaj //agendy//). Więcej na ten temat można znaleźć w [[http://downloads.jboss.com/drools/docs/5.0.1.26597.FINAL/drools-expert/html_single/index.html#d0e1560|dokumentacji]].
===Ćwiczenie===
Wykorzystując atrybut **salience** oraz **no-loop** popraw działanie systemu ekspertowego.
===== Konfiguracja Eclipse=====
Dla chętnych, którzy będą chcieli przyjrzeć się DroolsExpert i DroolsFlow bliżej, poniżej zostały przedstawione zostały kroki konfiguracji Eclipse do współdziałania z pakietem JBoss Rules:
- Pobierz Eclipse wersji 3.5 (najnowsza wersja nie działa z Drools 5).
- Wejdź w //Help->Software updates...->Available Software->Add Site..// i dodaj nowy link [[http://download.eclipse.org/tools/gef/updates/releases/]] a następnie zainstaluj najnowszą wersje //Graphical Editing Framework GEF//. Na koniec //Accept//.
- Po zainstalowaniu pluginu GEF dodaj kolejną stronę: [[http://downloads.jboss.com/drools/updatesite3.5/]] i zainstaluj pakiet JBoss Rules.
- Zbuduj runtime. Wejdź w //Window->Preferences->Drools/Installed Drools Runtime//. Kliknij //Add// a następnie //Browse// i wskaż katalog w którym chcesz przechowywać runtime (najlepiej niech to będzie katalog wewnątrz katalogu //clipse// o nazwie //drools-runtime//. Na sam koniec kliknij na //Generate New Runtime// i po wygenerowaniu i zaakceptowaniu, upewnij sie że runtime jest zaznaczony na liście.
===== Komentarze =====
Z braku lepszego miejsca tutaj studenci wpisują komentarze natury ogólnej do tego lab. 8-)