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..338ae43aa483 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,8 @@ 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.drl"); for (String rule : rules) { kieFileSystem.write(ResourceFactory.newClassPathResource(rule)); } diff --git a/drools/src/main/java/com/baeldung/drools/matched_rules/MatchedRules.java b/drools/src/main/java/com/baeldung/drools/matched_rules/MatchedRules.java new file mode 100644 index 000000000000..f4f15e563a80 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/matched_rules/MatchedRules.java @@ -0,0 +1,32 @@ +package com.baeldung.drools.matched_rules; + +import org.kie.api.runtime.KieSession; +import com.baeldung.drools.config.DroolsBeanFactory; + +public class MatchedRules { + + public static void main(String[] args) { + KieSession kieSession = new DroolsBeanFactory().getKieSession(); + + TrackingAgendaEventListener listener = new TrackingAgendaEventListener(); + kieSession.addEventListener(listener); + + // RuleTracker tracker = new RuleTracker(); + // kieSession.insert(tracker); + + Person person1 = new Person("Alice", 20); + Person person2 = new Person("Bob", 16); + Person person3 = new Person("Baeldung", 65); + kieSession.insert(person1); + kieSession.insert(person2); + kieSession.insert(person3); + + kieSession.fireAllRules(); + + System.out.println("Fired rules: " + listener.getFiredRuleNames()); + // System.out.println("Fired rules: " + tracker.getFiredRules()); + + kieSession.dispose(); + } + +} 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..fc51c6479ea0 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/matched_rules/Person.java @@ -0,0 +1,47 @@ +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; + } + + // Getters and Setters + 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..b47cd3e395f7 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/matched_rules/RuleUtils.java @@ -0,0 +1,13 @@ +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); + + System.out.println("Rule fired (via RuleUtils): " + 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.drl b/drools/src/main/resources/com/baeldung/drools/rules/eligibility_rules.drl new file mode 100644 index 000000000000..94bf16202da0 --- /dev/null +++ b/drools/src/main/resources/com/baeldung/drools/rules/eligibility_rules.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