Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,7 +24,9 @@ public class DroolsBeanFactory {

private KieFileSystem getKieFileSystem() {
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
List<String> rules = Arrays.asList("com/baeldung/drools/rules/BackwardChaining.drl", "com/baeldung/drools/rules/SuggestApplicant.drl", "com/baeldung/drools/rules/Product_rules.drl.xls");
List<String> 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));
}
Expand Down
49 changes: 49 additions & 0 deletions drools/src/main/java/com/baeldung/drools/matched_rules/Person.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.baeldung.drools.matched_rules;

import java.util.ArrayList;
import java.util.List;

public class RuleTracker {

private final List<String> firedRules = new ArrayList<>();

public void add(String ruleName) {
firedRules.add(ruleName);
}

public List<String> getFiredRules() {
return firedRules;
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<Match> matchList = new ArrayList<>();

@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
matchList.add(event.getMatch());
}

public List<String> getFiredRuleNames() {
List<String> names = new ArrayList<>();
for (Match m : matchList) {
names.add(m.getRule().getName());
}
return names;
}

}
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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<String> fired = tracker.getFiredRules();

assertTrue(fired.contains("Check Voting Eligibility"));
assertTrue(fired.contains("Senior Priority Voting"));

assertTrue(person.isEligibleToVote());
assertTrue(person.isPriorityVoter());
}

}