diff --git a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java index 386b2ca4a768..b04b7cdfefb0 100644 --- a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java +++ b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java @@ -7,7 +7,6 @@ import org.kie.api.KieServices; import org.kie.api.builder.KieBuilder; import org.kie.api.builder.KieFileSystem; -import org.kie.api.builder.KieModule; import org.kie.api.builder.KieRepository; import org.kie.api.builder.ReleaseId; import org.kie.api.io.Resource; @@ -25,7 +24,9 @@ public class DroolsBeanFactory { private KieFileSystem getKieFileSystem() { KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); - List rules = Arrays.asList("com/baeldung/drools/rules/BackwardChaining.drl", "com/baeldung/drools/rules/SuggestApplicant.drl", "com/baeldung/drools/rules/Product_rules.drl.xls"); + List rules = Arrays.asList("com/baeldung/drools/rules/BackwardChaining.drl", "com/baeldung/drools/rules/SuggestApplicant.drl", + "com/baeldung/drools/rules/Product_rules.drl.xls", "com/baeldung/drools/rules/eligibility_rules_event.drl", + "com/baeldung/drools/rules/eligibility_rules_context.drl"); for (String rule : rules) { kieFileSystem.write(ResourceFactory.newClassPathResource(rule)); } diff --git a/drools/src/main/java/com/baeldung/drools/matched_rules/Person.java b/drools/src/main/java/com/baeldung/drools/matched_rules/Person.java new file mode 100644 index 000000000000..b0593b69b1a4 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/matched_rules/Person.java @@ -0,0 +1,49 @@ +package com.baeldung.drools.matched_rules; + +public class Person { + private String name; + private int age; + private boolean eligibleToVote; + private boolean priorityVoter; + + + // Constructors + public Person(String name, int age) { + this.name = name; + this.age = age; + this.eligibleToVote = false; + this.priorityVoter = false; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public boolean isEligibleToVote() { + return eligibleToVote; + } + + public void setEligibleToVote(boolean eligibleToVote) { + this.eligibleToVote = eligibleToVote; + } + + public boolean isPriorityVoter() { + return priorityVoter; + } + + public void setPriorityVoter(boolean priorityVoter) { + this.priorityVoter = priorityVoter; + } +} diff --git a/drools/src/main/java/com/baeldung/drools/matched_rules/RuleTracker.java b/drools/src/main/java/com/baeldung/drools/matched_rules/RuleTracker.java new file mode 100644 index 000000000000..175f1530a631 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/matched_rules/RuleTracker.java @@ -0,0 +1,17 @@ +package com.baeldung.drools.matched_rules; + +import java.util.ArrayList; +import java.util.List; + +public class RuleTracker { + + private final List firedRules = new ArrayList<>(); + + public void add(String ruleName) { + firedRules.add(ruleName); + } + + public List getFiredRules() { + return firedRules; + } +} diff --git a/drools/src/main/java/com/baeldung/drools/matched_rules/RuleUtils.java b/drools/src/main/java/com/baeldung/drools/matched_rules/RuleUtils.java new file mode 100644 index 000000000000..1d6d9d904be3 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/matched_rules/RuleUtils.java @@ -0,0 +1,11 @@ +package com.baeldung.drools.matched_rules; + +import org.kie.api.runtime.rule.RuleContext; + +public class RuleUtils { + + public static void track(RuleContext ctx, RuleTracker tracker) { + String ruleName = ctx.getRule().getName(); + tracker.add(ruleName); + } +} diff --git a/drools/src/main/java/com/baeldung/drools/matched_rules/TrackingAgendaEventListener.java b/drools/src/main/java/com/baeldung/drools/matched_rules/TrackingAgendaEventListener.java new file mode 100644 index 000000000000..8a701fe77b7b --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/matched_rules/TrackingAgendaEventListener.java @@ -0,0 +1,26 @@ +package com.baeldung.drools.matched_rules; + +import java.util.ArrayList; +import java.util.List; + +import org.kie.api.event.rule.AfterMatchFiredEvent; +import org.kie.api.event.rule.DefaultAgendaEventListener; +import org.kie.api.runtime.rule.Match; + +public class TrackingAgendaEventListener extends DefaultAgendaEventListener { + private final List matchList = new ArrayList<>(); + + @Override + public void afterMatchFired(AfterMatchFiredEvent event) { + matchList.add(event.getMatch()); + } + + public List getFiredRuleNames() { + List names = new ArrayList<>(); + for (Match m : matchList) { + names.add(m.getRule().getName()); + } + return names; + } + +} diff --git a/drools/src/main/resources/com/baeldung/drools/rules/eligibility_rules_context.drl b/drools/src/main/resources/com/baeldung/drools/rules/eligibility_rules_context.drl new file mode 100644 index 000000000000..94bf16202da0 --- /dev/null +++ b/drools/src/main/resources/com/baeldung/drools/rules/eligibility_rules_context.drl @@ -0,0 +1,25 @@ +package com.baeldung.drools.rules + +import com.baeldung.drools.matched_rules.Person; +import com.baeldung.drools.matched_rules.RuleTracker; +import static com.baeldung.drools.matched_rules.RuleUtils.track; + +rule "Check Voting Eligibility" + when + $person : Person(age >= 18) + $tracker : RuleTracker() + then + track(drools, $tracker); + $person.setEligibleToVote(true); + update($person); +end + +rule "Senior Priority Voting" + when + $person : Person(age >= 65) + $tracker : RuleTracker() + then + track(drools, $tracker); + $person.setPriorityVoter(true); + update($person); +end diff --git a/drools/src/main/resources/com/baeldung/drools/rules/eligibility_rules_event.drl b/drools/src/main/resources/com/baeldung/drools/rules/eligibility_rules_event.drl new file mode 100644 index 000000000000..b621243a197b --- /dev/null +++ b/drools/src/main/resources/com/baeldung/drools/rules/eligibility_rules_event.drl @@ -0,0 +1,19 @@ +package com.baeldung.drools.rules + +import com.baeldung.drools.matched_rules.Person; + +rule "Check Voting Eligibility Event" + when + $person : Person(age >= 18) + then + $person.setEligibleToVote(true); + update($person); +end + +rule "Senior Priority Voting Event" + when + $person : Person(age >= 65) + then + $person.setPriorityVoter(true); + update($person); +end diff --git a/drools/src/test/java/com/baeldung/drools/matched_rules/MatchedRulesUnitTest.java b/drools/src/test/java/com/baeldung/drools/matched_rules/MatchedRulesUnitTest.java new file mode 100644 index 000000000000..a5469833cdc4 --- /dev/null +++ b/drools/src/test/java/com/baeldung/drools/matched_rules/MatchedRulesUnitTest.java @@ -0,0 +1,65 @@ +package com.baeldung.drools.matched_rules; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.kie.api.runtime.KieSession; + +import com.baeldung.drools.config.DroolsBeanFactory; + +public class MatchedRulesUnitTest { + + private KieSession kieSession; + + @BeforeEach + public void before() { + kieSession = new DroolsBeanFactory().getKieSession(); + } + + @Test + public void givenPerson_whenListenerAttached_thenRuleIsTracked() { + // Given + Person person = new Person("Bob", 65); + + TrackingAgendaEventListener listener = new TrackingAgendaEventListener(); + kieSession.addEventListener(listener); + + // When + kieSession.insert(person); + kieSession.fireAllRules(); + kieSession.dispose(); + + // Then + assertFalse(listener.getFiredRuleNames().isEmpty()); + assertTrue(listener.getFiredRuleNames().contains("Check Voting Eligibility Event")); + assertTrue(listener.getFiredRuleNames().contains("Senior Priority Voting Event")); + } + + @Test + public void givenPerson_whenRulesFire_thenContextTracksFiredRules() { + // Given + Person person = new Person("John", 70); + RuleTracker tracker = new RuleTracker(); + + // When + kieSession.insert(person); + kieSession.insert(tracker); + + kieSession.fireAllRules(); + kieSession.dispose(); + + // Then + List fired = tracker.getFiredRules(); + + assertTrue(fired.contains("Check Voting Eligibility")); + assertTrue(fired.contains("Senior Priority Voting")); + + assertTrue(person.isEligibleToVote()); + assertTrue(person.isPriorityVoter()); + } + +}