From 375956af63fc0f927b06c1d8a92a4c58306daa3c Mon Sep 17 00:00:00 2001 From: Mahmoud Ben Hassine Date: Thu, 18 Aug 2016 11:52:25 +0200 Subject: [PATCH] fix issue #34 : make method "beforeEvaluate" return a boolean --- .../java/org/easyrules/api/RuleListener.java | 5 ++-- .../easyrules/core/DefaultRulesEngine.java | 11 ++++---- .../org/easyrules/core/RuleListenerTest.java | 26 +++++++++++++++---- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/easyrules-core/src/main/java/org/easyrules/api/RuleListener.java b/easyrules-core/src/main/java/org/easyrules/api/RuleListener.java index 4b684b0..217e52e 100644 --- a/easyrules-core/src/main/java/org/easyrules/api/RuleListener.java +++ b/easyrules-core/src/main/java/org/easyrules/api/RuleListener.java @@ -10,9 +10,10 @@ public interface RuleListener { /** * Triggered before the evaluation of a rule. * - * @param rule the current rule + * @param rule being evaluated + * @return true if the rule should be evaluated, false otherwise */ - Rule beforeEvaluate(Rule rule); + boolean beforeEvaluate(Rule rule); /** * Triggered before the execution of a rule. diff --git a/easyrules-core/src/main/java/org/easyrules/core/DefaultRulesEngine.java b/easyrules-core/src/main/java/org/easyrules/core/DefaultRulesEngine.java index a4bf54e..ea34840 100644 --- a/easyrules-core/src/main/java/org/easyrules/core/DefaultRulesEngine.java +++ b/easyrules-core/src/main/java/org/easyrules/core/DefaultRulesEngine.java @@ -149,8 +149,7 @@ class DefaultRulesEngine implements RulesEngine { break; } - rule = triggerListenersBeforeEvaluate(rule); - if (rule == null) { + if (!triggerListenersBeforeEvaluate(rule)) { LOGGER.log(Level.INFO, "Rule ''{0}'' has been skipped before being evaluated", name); continue; } @@ -200,11 +199,13 @@ class DefaultRulesEngine implements RulesEngine { } } - private Rule triggerListenersBeforeEvaluate(Rule rule) { + private boolean triggerListenersBeforeEvaluate(Rule rule) { for (RuleListener ruleListener : ruleListeners) { - rule = ruleListener.beforeEvaluate(rule); + if (!ruleListener.beforeEvaluate(rule)) { + return false; + } } - return rule; + return true; } private void logEngineParameters() { diff --git a/easyrules-core/src/test/java/org/easyrules/core/RuleListenerTest.java b/easyrules-core/src/test/java/org/easyrules/core/RuleListenerTest.java index 378ddaf..794642c 100644 --- a/easyrules-core/src/test/java/org/easyrules/core/RuleListenerTest.java +++ b/easyrules-core/src/test/java/org/easyrules/core/RuleListenerTest.java @@ -57,8 +57,8 @@ public class RuleListenerTest { when(rule.getName()).thenReturn("r"); when(rule.getPriority()).thenReturn(1); when(rule.evaluate()).thenReturn(true); - when(ruleListener1.beforeEvaluate(rule)).thenReturn(rule); - when(ruleListener2.beforeEvaluate(rule)).thenReturn(rule); + when(ruleListener1.beforeEvaluate(rule)).thenReturn(true); + when(ruleListener2.beforeEvaluate(rule)).thenReturn(true); rulesEngine = aNewRulesEngine() .withRuleListener(ruleListener1) @@ -100,10 +100,10 @@ public class RuleListenerTest { } @Test - public void whenListenerReturnsNull_thenTheRuleShouldBeSkippedBeforeBeingEvaluated() throws Exception { + public void whenListenerReturnsFalse_thenTheRuleShouldBeSkippedBeforeBeingEvaluated() throws Exception { // Given - when(ruleListener1.beforeEvaluate(rule)).thenReturn(null); + when(ruleListener1.beforeEvaluate(rule)).thenReturn(false); rulesEngine = aNewRulesEngine() .withRuleListener(ruleListener1) .build(); @@ -113,8 +113,24 @@ public class RuleListenerTest { rulesEngine.fireRules(); // Then - verify(rule, never()).execute(); + verify(rule, never()).evaluate(); + } + + @Test + public void whenListenerReturnsTrue_thenTheRuleShouldBeEvaluated() throws Exception { + // Given + when(ruleListener1.beforeEvaluate(rule)).thenReturn(true); + rulesEngine = aNewRulesEngine() + .withRuleListener(ruleListener1) + .build(); + + // When + rulesEngine.registerRule(rule); + rulesEngine.fireRules(); + + // Then + verify(rule).evaluate(); } }