Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:miw:2009:miw09_xtt_drools [2009/04/22 20:38]
jsi08
pl:miw:2009:miw09_xtt_drools [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
-====== ​Opis ====== +~~ODT~~ 
-Szymon Frenkel ​[[sfrenkel@student.bez-spamu.agh.edu.pl]]\\ \\+====== ​MIW 2009 XTT_DROOLS ​====== 
 +  * Zrealizował:  ​[[sfrenkel@student.bez-spamu.agh.edu.pl|Szymon Frenkel]] (4RI) \\ \\
 Analyze how to design ​ Analyze how to design ​
 [[http://​www.jboss.org/​drools/​|Drools]] [[http://​www.jboss.org/​drools/​|Drools]]
Linia 7: Linia 8:
   * Pokrewny projekt: [[pl:​miw:​2009:​miw09_drools_x|Drools_X]] - Grzegorz Stopa   * Pokrewny projekt: [[pl:​miw:​2009:​miw09_drools_x|Drools_X]] - Grzegorz Stopa
  
-====== ​Spotkania ​====== +====== ​Prezentacja ​====== 
-===== 20090402 ==== +[[pl:​miw:​2009:​miw09_xtt_drools:​prezentacja|Prezentacja wyników projektowych]]
-  * kategoryzacja przykładów,​ opis, ile reguł, atr, etc, czego dotyczą+
  
-===== 20090326 ​==== +====== Sprawozdanie ====== 
- *    ... +==== 1Przykłady systemów ekspertowych w Drools ​==== 
-===== 20090319 ​==== +=== Zastosowanie w zarządzaniu produkacją ​=== 
-http://codeodor.com/index.cfm/2007/9/10/Rules-based-Programming-with-JBoss-RulesDrools/​1600+ [[http://www.ibm.com/developerworks/​java/​library/​j-drools/​|www.ibm.com/developerworks/java/library/j-drools]] 
 +  * **Opis** 
 +The problem to solve
  
-http://​droolsrules.blogspot.com/+    * A company named XYZ builds two types of computer machinesType1 and Type2A machine'​s type is defined by its architecture.
  
-http://​www.onjava.com/​pub/​a/​onjava/​2007/​01/​17/​building-enterprise-services-with-drools-rule-engine.html+    * An XYZ computer can serve multiple functions. Four functions are currently definedDDNS Server, DNS Server, Gateway, and Router.
  
-http://www.rationaldev.com/​jboss-rules-the-new-drools-rules-engine-overview+    * XYZ performs several tests on each machine before it is shipped out.
  
-http://www.ibm.com/​developerworks/​java/​library/​j-drools/​+    * The tests performed on each machine depend on each machine'​s type and functionsCurrently, five tests are defined: Test1, Test2, Test3, Test4, and Test5.
  
-http://​magazine.redhat.com/​2008/​07/​10/​introduction-to-drools-rules-fall-from-your-eyes/​+    * When tests are assigned to a computer, a tests due date is also assigned to the machineTests assigned to the computer should be conducted no later than this due dateThe due date's value depends on the tests that were assigned ​to the machine.
  
-systemy wspomagania decyzji!+    * XYZ has automated much of the process for executing the tests using an internally developed software application that can determine a machine'​s type and functions. Then, based on these properties, the application determines which tests to execute and their due date.
  
-===== 20090312 ====+    * Currently, the logic that assigns the tests and tests due date to a computer is part of this application'​s compiled code. The component that contains this logic is written in the Java language.
  
-  * przykłady!!! +    * The logic for assigning tests and due dates is changed more than once a month. The developers must go through a tedious process every time they need to implement it in the Java code. 
-  [[hekate:​hekate_case_thermostat]]+\\  
 +  * **Własności** 
 +   * 10 reguł 
 +   ​5 jedno-atrybutowych 
 +   * 5 dwu-atrybutowych 
 +\\
  
-===== 20090225 ==== 
-Zapoznanie z działaniem [[http://​www.jboss.org/​drools/​ | Drools]]. 
  
-====== Projekt ====== +  * **kod źródłowy*
-==== 1. Przykłady systemów ekspertowych w Drools ==== +<​code ​ada>rule "Tests for type1 machine"​
-  - [[http://​www.ibm.com/​developerworks/​java/​library/​j-drools/​|Zastosowanie w zarządzaniu]] +
-  ​testRules1.drl +
-<​code>​rule "Tests for type1 machine"​+
  
 salience 100 salience 100
Linia 153: Linia 155:
  setTestsDueTime(machine,​ 3);   setTestsDueTime(machine,​ 3);
 end</​code>​ end</​code>​
-  - [[http://​www.onjava.com/​pub/​a/​onjava/​2007/​01/​17/​building-enterprise-services-with-drools-rule-engine.html?​page=4|Przykład systemu dla firmy]] 
-  - [[http://​www.onjava.com/​pub/​a/​onjava/​2005/​08/​03/​drools.html?​page=5|Przykład reguł biznesowych]] ​ 
-  - [[http://​downloads.jboss.com/​drools/​docs/​4.0.7.19894.GA/​html/​ch10.html#​d0e6737|Bilety]] 
-  - wykorzystanie zależności czasowych w prostym systemie przydzielania biletów klientom\\ ​ 
-[[http://​student.agh.edu.pl/​~sfrenkel/​drools/​TroubleTicket.drl|TroubleTicket.drl]] 
  
-====== ​Sprawozdanie ​====== +=== Przykład systemu dla firmy === 
-====== ​Prezentacja ​======+[[http://​www.onjava.com/​pub/​a/​onjava/​2007/​01/​17/​building-enterprise-services-with-drools-rule-engine.html?​page=4|www.onjava.com/​pub/​a/​onjava/​2007/​01/​17/​building-enterprise-services-with-drools-rule-engine.html?​page=4]] 
 +  * **Opis** 
 +Reguły opisują podejmowanie decyzji przyznania pożyczki na podstawie określonych kryteriów. 
 +\\ 
 +  * **Własności** 
 +  * 9 reguł 
 +  * 1 jedno-atrybutowa 
 +  * 6 dwu-atrybutowych 
 +  * 2 trój-atrybutowe 
 +\\ 
 +  * **kod źródłowy** 
 +<code ada> 
 +    rule "Age verification"​ 
 +        when 
 +            Borrower(age < 18) 
 +            $loanApp : LoanApplication() 
 +        then 
 +            $loanApp.addFeedbackMessage(FeedbackMessages.MIN_AGE);​ 
 +    end 
 + 
 +    rule "​Credit score"​ 
 + 
 +        when 
 +            Borrower(creditScore <600) 
 +            $loanApp : LoanApplication() 
 +        then 
 +            $loanApp.addFeedbackMessage(FeedbackMessages.MIN_CREDIT_SCORE);​ 
 +    end 
 + 
 +    rule "Loan Amount limits"​ 
 +        when 
 +            $loanApp : (LoanApplication(loanAmount <100000.0) or 
 +            LoanApplication(loanAmount >400000.0)) 
 +        then 
 +            $loanApp.addFeedbackMessage(FeedbackMessages.LOAN_AMOUNT_LIMITS);​ 
 +    end 
 + 
 +    rule "​Maximum Loan-to-value ratio"​ 
 +        when 
 +            $loanApp : LoanApplication(loanToValueRatio > 80.0) 
 +        then 
 +            $loanApp.addFeedbackMessage(FeedbackMessages.LTV);​ 
 +    end 
 + 
 +    rule "​Income multiples"​ 
 +        salience -3 
 +        when 
 +            Borrower( $grossIncome : grossIncome ) 
 +            Property( value > (new Double($grossIncome.doubleValue()*3))) 
 +            $loanApp : LoanApplication() 
 +        then 
 +            $loanApp.setAffordabilityFlag(Flag.NOT_AFFORDABLE);​ 
 +    end 
 + 
 +    rule "​Affordability Model"​ 
 +        salience -4 
 +        when 
 +            Borrower( $affordableLoanAmount : affordableLoanAmount ) 
 +            Property( value > (new Double($affordableLoanAmount.doubleValue()))) 
 +            $loanApp : LoanApplication() 
 +        then 
 +            $loanApp.setAffordabilityFlag(Flag.NOT_AFFORDABLE);​ 
 +    end 
 + 
 +    rule "​Property type"​ 
 +        when 
 +            Property(purpose !Flag.OWNER_OCCUPIED) 
 +            $loanApp : LoanApplication() 
 +        then 
 +            $loanApp.addFeedbackMessage(FeedbackMessages.PROP_TYPE);​ 
 +    end 
 + 
 +    rule "​Property age" 
 +        when 
 +            Property(yearBuilt < 1965) 
 +            $loanApp : LoanApplication() 
 +        then 
 +            $loanApp.addFeedbackMessage(FeedbackMessages.PROP_YEAR_BUILT);​ 
 +    end 
 +    rule "​Underwriting decision"​ 
 + 
 +        when 
 +            ​$loanApp : (LoanApplication(affordabilityFlag ​== Flag.NOT_AFFORDABLE) or 
 +            LoanApplication( feedbackMsgSize > 0)) 
 +        then 
 +            $loanApp.setStatus(Flag.FAILED);​ 
 +    end 
 +</​code>​ 
 +=== Przykład reguł w XMLu === 
 +[[http://​www.onjava.com/​pub/​a/​onjava/​2005/​08/​03/​drools.html?​page=5|www.onjava.com/​pub/​a/​onjava/​2005/​08/​03/​drools.html?​page=5]] 
 +  * **Opis** 
 +Przykład zapisania reguł Drools w XMLu 
 +\\ 
 +  * **Własności** 
 +  * 1 reguła dwu-atrybutowa 
 +\\ 
 +  * **Kod źródłowy** 
 +<code xml> 
 +<?xml version="​1.0"?>​ 
 +<​rule-set>​ 
 +  <!-- Ensure stock price is not too high--> ​      
 +  <rule name="Stock Price Low Enough">​ 
 +    <!-- Params to pass to business rule --> 
 +    <​parameter identifier="​stockOffer">​ 
 +      <​class>​StockOffer</​class>​ 
 +    </​parameter>​ 
 +    <!-- Conditions or 'Left Hand Side'  
 +        (LHS) that must be met for  
 +         ​business rule to fire --> 
 +    <!-- note markup --> 
 +    <​java:​condition>​ 
 +      stockOffer.getRecommendPurchase() == null 
 +    </​java:​condition>​ 
 +    <​java:​condition>​ 
 +      stockOffer.getStockPrice() < 100 
 +    </​java:​condition>​ 
 +    <!-- What happens when the business  
 +                      rule is activated --> 
 +    <​java:​consequence>​ 
 +        stockOffer.setRecommendPurchase( 
 +                              StockOffer.YES); ​  
 +          printStock(stockOffer);​ 
 +    </​java:​consequence>​ 
 +  </​rule>​ 
 +</​rule-set>​ 
 +</​code>​ 
 +=== Bilety === 
 +[[http://​downloads.jboss.com/​drools/​docs/​4.0.7.19894.GA/​html/​ch10.html#​d0e6737]] 
 +  * **Opis** 
 +   ​Prosty systemie przydzielania biletów klientom, wykorzystuje zależności czasowe. 
 +\\ 
 +  * **Własności** 
 +  * 5 reguł dwu-atrybutowych 
 +\\ 
 +  * **Kod źródłowy** 
 +<code ada> 
 +rule "New Ticket"​ 
 + salience 10 
 + when 
 + customer : Customer( ) 
 + ticket : Ticket( customer == customer, status == "​New"​ )  
 + then 
 + System.out.println( "New : " + ticket );  
 +end 
 +   
 +rule "​Silver Priority"​ 
 + duration 3000 
 + when 
 + customer : Customer( subscription == "​Silver"​ )  
 + ticket : Ticket( customer == customer, status == "​New"​ )  
 + then 
 + modify( ticket ) {setStatus( "​Escalate"​ )}  
 +end 
 + 
 +rule "Gold Priority"​ 
 + duration 1000 
 + when 
 + customer : Customer( subscription == "​Gold"​ )  
 + ticket : Ticket( customer == customer, status == "​New"​ )  
 + then 
 + modify( ticket ) {setStatus( "​Escalate"​ )}  
 +end 
 + 
 +rule "​Platinum Priority"​ 
 + when 
 + customer : Customer( subscription == "​Platinum"​ )  
 + ticket : Ticket( customer == customer, status == "​New"​ )  
 + then 
 + ticket.setStatus( "​Escalate"​ ); 
 + modify ( ticket ) {setStatus( "​Escalate"​ )} 
 +end 
 + 
 +rule "​Escalate"​ 
 + when 
 + customer : Customer( )  
 + ticket : Ticket( customer == customer, status == "​Escalate"​ )  
 + then 
 + sendEscalationEmail( customer, ticket ); 
 +end 
 + 
 +rule "​Done"​ 
 + when 
 + customer : Customer( )  
 + ticket : Ticket( customer == customer, status == "​Done"​ )  
 + then 
 + System.out.println( "Done : " + ticket );  
 +end 
 +</​code>​ 
 +==== 2. Testowanie systemów Drools ====  
 +=== Wstęp === 
 +W celu sprawdzenia poprawności przedstawionych w poprzednim rozdziale systemów Drools przeprowadzono testy ich działania. Wykorzystano do tego środowisko programistyczne Eclipse z pluginem do obługi Drools - opis jego instalacji został zaprezentowany na stronie pokrewnego projektu - [[:​pl:​miw:​2009:​miw09_drools_instalacja|Drools_X]] 
 +=== System 1 === 
 +Testowano [[pl:​miw:​2009:​miw09_xtt_drools#​przyklad_systemu_dla_firmy|przykładowy system dla firmy]]. \\ 
 +Systemu jest napisany we wcześniejszej wersji Drools, zatem nie funkcjonuje prawidłowo na używanej do testów wersji Drools - 4.0.7.19894. \\ 
 +Po ściągnięciu {{:​pl:​miw:​2009:​miw09_xtt_drools:​system1_src.zip|źródeł systemu}} spod adresu [[http://​www.onjava.com/​onjava/​2007/​01/​17/​examples/​src_code.zip]] i stworzeniu na tej podstawie nowego projektu Drools w Eclipse'​ie wystąpiły następują błędy: \\ 
 +<​code>​ 
 +Errors (6 items) 
 +Severity and Description Path Resource Location Creation Time Id \\ 
 +Cannot invoke doubleValue() on the primitive type double system3/​src/​main/​rules/​rules Underwriting.drl line 38 1243455362182 3459 \\ 
 +Cannot invoke doubleValue() on the primitive type double system3/​src/​main/​rules/​rules Underwriting.drl line 49 1243455362182 13460 \\ 
 +The method assertObject(Borrower) is undefined for the type WorkingMemory system3/​src/​main/​java/​com/​birali/​engine UnderwritingService.java line 29 1243455345587 3457 \\ 
 +The method assertObject(LoanApplication) is undefined for the type WorkingMemory system3/​src/​main/​java/​com/​birali/​engine UnderwritingService.java line 28 1243455345587 13456 \\ 
 +The method assertObject(Property) is undefined for the type WorkingMemory system3/​src/​main/​java/​com/​birali/​engine UnderwritingService.java line 30 1243455345587 13458 \\ 
 +The method newWorkingMemory() is undefined for the type RuleBase system3/​src/​main/​java/​com/​birali/​engine UnderwritingService.java line 27 1243455345586 13455''​ </​code>​ 
 +Kiedy wprowadzono zmiany dostosowujących do Drools 4.0, udało się wyeliminować powyższe błędy. 
 +Kolejny błędu wystąpiły po uruchomieniu narzędzia do testowania JUnit, tym razem w pliku reguł: 
 +<​code>​ 
 +org.drools.rule.InvalidRulePackage:​ Rule Compilation error : [Rule name=Income multiples, agendaGroup=MAIN,​ salience=-3,​ no-loop=false] 
 + com/​birali/​underwriting/​Rule_Income_multiples_0.java (9:434) : Cannot invoke doubleValue() on the primitive type double 
 +Rule Compilation error : [Rule name=Affordability Model, agendaGroup=MAIN,​ salience=-4,​ no-loop=false] 
 + com/​birali/​underwriting/​Rule_Affordability_Model_0.java (9:446) : Cannot invoke doubleValue() on the primitive type double 
 +</​code>​ 
 +Gdy usunięto wywołania funkcji "​doubleValue",​ test przeszedł poprawnie z wynikiem na konsoli: 
 +<​code>​ 
 +==>​Income multiples fired. Flag=NOT_AFFORDABLE 
 + 
 +Testing all feedback messages 
 +============================= 
 +Property should be built after 1965 
 +Type of property should be Owner Occupied 
 +Credit score should be geater than 600 
 +Borrower minimum age should be 18 
 +Loan to value ratio should not be greater than 80 
 +Loan Amount should be between $100,000 and $400,000 
 + 
 +Feedback message size=6 
 +Affordability Flag=NOT_AFFORDABLE 
 +Underwriting Decision=FAILED 
 +</​code>​ 
 +Zastosowane modyfikacje w kodzie źródłowym:​ 
 +<​code>​ 
 +com/​birali/​engine/​UnderwritingService.java 
 +27,​30c27,​30 
 +<     WorkingMemory wm = ruleBase.newWorkingMemory();​ 
 +<     wm.assertObject(la);​ 
 +<     wm.assertObject(la.getBorrower());​ 
 +<     wm.assertObject(la.getProperty());​ 
 +--- 
 +>     WorkingMemory wm = ruleBase.newStatefulSession();​ 
 +>     wm.insert(la);​ 
 +>     wm.insert(la.getBorrower());​ 
 +>     wm.insert(la.getProperty());​ 
 + 
 +</​code>​ 
 +<​code>​ 
 +Underwriting.drl 
 +42c42 
 +<    ​ Property( value > (new Double($grossIncome.doubleValue()*3))) 
 +--- 
 +>    ​ Property( value > (new Double($grossIncome*3))) 
 +53c53 
 +<    ​ Property( value > (new Double($affordableLoanAmount.doubleValue())))  
 +--- 
 +>    ​ Property( value > (new Double($affordableLoanAmount)))  
 +</​code>​ 
 +=== System 2 === 
 +Testowano [[pl:​miw:​2009:​miw09_xtt_drools#​zastosowanie_w_zarzadzaniu_produkacja|system do zarządzania w produkcji]]. \\ 
 +Po ściągnięciu {{:​pl:​miw:​2009:​miw09_xtt_drools:​system2_src.zip|kodu źródłowego}} projektu Drools, dostępnego na stronie [[http://​www.ibm.com/​developerworks/​java/​library/​j-drools]],​ można bardzo łatwo stworzyć projekt w Eclipse'​ie,​ ponieważ archiwum zawiera plik projektu gotowy do zaimportowania. \\ 
 +Następnie uruchomiono przygotowany test JUnit ({{:​pl:​miw:​2009:​miw09_xtt_drools:​testsrulesenginetest.java.zip|TestsRulesEngineTest.java}}),​ który sprawdza poprawność działania systemu. 
 +Przeprowadzony test nie wykazał żadnych błędów w działaniu. 
 +=== System 3 === 
 +Testowano [[pl:​miw:​2009:​miw09_xtt_drools#​bilety|system biletowy]]. \\ 
 +Po ściągnięciu {{:​pl:​miw:​2009:​miw09_xtt_drools:​system3_src.zip|plików źródłowych}} systemu ze strony [[http://​downloads.jboss.com/​drools/​docs/​4.0.7.19894.GA/​html/​ch10.html#​d0e6737]] i stworzeniu nowego projektu Drools umieszczono pliki Javy i reguł w odpowiednich katalogach. Problemy pojawiły się z pierwszym uruchomieniem - program nie mógł odczytać pliku reguł:  
 +<​code>​ 
 +Exception in thread "​main"​ java.lang.NullPointerException 
 + at java.io.Reader.<​init>​(Reader.java:​61) 
 + at java.io.InputStreamReader.<​init>​(InputStreamReader.java:​55) 
 + at com.sample.TroubleTicketExample.main(TroubleTicketExample.java:​20) 
 +</​code>​ 
 +Dodanie jednego znaku '/'​ przed nazwą pliku rozwiązało ten problem: 
 +<​code>​ 
 +TroubleTicketExample.java 
 +20c20 
 +<         ​builder.addPackageFromDrl( new InputStreamReader( TroubleTicketExample.class.getResourceAsStream( "​TroubleTicket.drl"​ ) ) ); 
 +--- 
 +>         ​builder.addPackageFromDrl( new InputStreamReader( TroubleTicketExample.class.getResourceAsStream( "/​TroubleTicket.drl"​ ) ) ); 
 +</​code>​ 
 +System zaczął działań, ale na końcu symulacji dał o sobie znać kolejny błąd, również dotyczący ścieżki do pliku, tym razem z plikiem z logami: 
 +<​code>​ 
 +Exception in thread "​main"​ java.lang.RuntimeException:​ Could not create the log file.  Please make sure that directory that the log file should be placed in does exist. 
 + at org.drools.audit.WorkingMemoryFileLogger.writeToDisk(WorkingMemoryFileLogger.java:​96) 
 + at com.sample.TroubleTicketExample.main(TroubleTicketExample.java:​72) 
 +</​code>​ 
 +Podanie ścieżki bezwzględnej do pliku naprawiło błąd: 
 +<​code>​ 
 +TroubleTicketExample.java 
 +28c28 
 +<         ​logger.setFileName( "​log/​trouble_ticket"​ ); 
 +--- 
 +>         ​logger.setFileName( "/​tmp/​log_trouble_ticket"​ ); 
 +</​code>​ 
 +Ostatecznie na konsoli otrzymano wynik działania systemu: 
 +<​code>​ 
 +New : [Ticket [Customer D : Silver] : New] 
 +New : [Ticket [Customer C : Silver] : New] 
 +New : [Ticket [Customer B : Platinum] : New] 
 +New : [Ticket [Customer A : Gold] : New] 
 +Email : [Ticket [Customer B : Platinum] : Escalate] 
 +[[ Sleeping 5 seconds ]] 
 +Email : [Ticket [Customer A : Gold] : Escalate] 
 +Done : [Ticket [Customer C : Silver] : Done] 
 +Email : [Ticket [Customer D : Silver] : Escalate] 
 +[[ awake ]] 
 +</​code>​ 
 +Przebieg symulacji zapisany w {{:​pl:​miw:​2009:​miw09_xtt_drools:​log_trouble_ticket.txt|logu}} 
 +, który można wygodnie oglądnąć w zakładce "Audit View" Eclipse'​a. 
 + 
 +==== 3. Modelowanie diagramów ARD ==== 
 +=== Wstęp === 
 +  * Do modelowania wybrano [[pl:​miw:​2009:​miw09_xtt_drools#​przyklad_systemu_dla_firmy|przykładowy system dla firmy]], wspomagający podejmowanie decyzji udzielania pożyczek. 
 +  * Do tworzenia diagramów wykorzystano program [[hekate:​HJEd]] 
 +  * Diagramy tworzono w oparciu o [[hekate:​hekate_case_thermostat]] 
 + 
 +=== Diagram ARD === 
 +{{:​pl:​miw:​2009:​miw09_xtt_drools:​ard.png?​600|}} 
 +=== Diagram TPH === 
 +{{:​pl:​miw:​2009:​miw09_xtt_drools:​tph.png?​600|}} 
 +=== XML === 
 +{{:​pl:​miw:​2009:​miw09_xtt_drools:​ard.xml}} 
 + 
 +====== Spotkania ====== 
 +[[pl:​miw:​2009:​miw09_xtt_drools:​spotkania|Notatki ze spotkań projektowych]] 
 ====== Materiały ====== ====== Materiały ======
 [[http://​downloads.jboss.com/​drools/​docs/​4.0.7.19894.GA/​html/​index.html | Dokumentacja Drools]] [[http://​downloads.jboss.com/​drools/​docs/​4.0.7.19894.GA/​html/​index.html | Dokumentacja Drools]]
pl/miw/2009/miw09_xtt_drools.1240425522.txt.gz · ostatnio zmienione: 2019/06/27 15:58 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0