fix issue #41 : Unable to add annotated rule to a composite rule

pull/55/head
Mahmoud Ben Hassine 9 years ago
parent 3d047407b1
commit 52b2aaca26

@ -27,9 +27,13 @@ package org.easyrules.core;
import org.easyrules.api.Rule;
import org.easyrules.util.Utils;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import static org.easyrules.core.RuleProxy.asRule;
/**
* Class representing a composite rule composed of a set of rules.
*
@ -45,6 +49,8 @@ public class CompositeRule extends BasicRule {
*/
protected Set<Rule> rules;
protected Map<Object, Rule> proxyRules;
public CompositeRule() {
this(Utils.DEFAULT_RULE_NAME, Utils.DEFAULT_RULE_DESCRIPTION, Utils.DEFAULT_RULE_PRIORITY);
}
@ -60,6 +66,7 @@ public class CompositeRule extends BasicRule {
public CompositeRule(final String name, final String description, final int priority) {
super(name, description, priority);
rules = new TreeSet<>();
proxyRules = new HashMap<>();
}
/**
@ -96,16 +103,21 @@ public class CompositeRule extends BasicRule {
* Add a rule to the composite rule.
* @param rule the rule to add
*/
public void addRule(final Rule rule) {
rules.add(rule);
public void addRule(final Object rule) {
Rule proxy = asRule(rule);
rules.add(proxy);
proxyRules.put(rule, proxy);
}
/**
* Remove a rule from the composite rule.
* @param rule the rule to remove
*/
public void removeRule(final Rule rule) {
rules.remove(rule);
public void removeRule(final Object rule) {
Rule proxy = proxyRules.get(rule);
if (proxy != null) {
rules.remove(proxy);
}
}
}

@ -34,6 +34,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import static java.lang.String.format;
import static org.easyrules.core.RuleProxy.asRule;
/**
* Default {@link org.easyrules.api.RulesEngine} implementation.
@ -208,16 +209,6 @@ class DefaultRulesEngine implements RulesEngine {
}
}
private Rule asRule(final Object rule) {
Rule result;
if (Utils.getInterfaces(rule).contains(Rule.class)) {
result = (Rule) rule;
} else {
result = RuleProxy.asRule(rule);
}
return result;
}
@Override
public String toString() {
return parameters.getName();

@ -30,13 +30,17 @@ class RuleProxy implements InvocationHandler {
* @return a proxy that implements the {@link org.easyrules.api.Rule} interface.
*/
public static org.easyrules.api.Rule asRule(final Object rule) {
ruleDefinitionValidator.validateRuleDefinition(rule);
return (org.easyrules.api.Rule) Proxy.newProxyInstance(
org.easyrules.api.Rule.class.getClassLoader(),
new Class[]{org.easyrules.api.Rule.class, Comparable.class},
new RuleProxy(rule));
org.easyrules.api.Rule result;
if (Utils.getInterfaces(rule).contains(org.easyrules.api.Rule.class)) {
result = (org.easyrules.api.Rule) rule;
} else {
ruleDefinitionValidator.validateRuleDefinition(rule);
result = (org.easyrules.api.Rule) Proxy.newProxyInstance(
org.easyrules.api.Rule.class.getClassLoader(),
new Class[]{org.easyrules.api.Rule.class, Comparable.class},
new RuleProxy(rule));
}
return result;
}
@Override

@ -1,5 +1,7 @@
package org.easyrules.core;
import org.easyrules.annotation.Action;
import org.easyrules.annotation.Condition;
import org.easyrules.api.RulesEngine;
import org.junit.Before;
import org.junit.Test;
@ -111,4 +113,37 @@ public class CompositeRuleTest {
public void whenNoComposingRulesAreRegistered_thenCompositeRuleShouldEvaluateToFalse() {
assertThat(compositeRule.evaluate()).isFalse();
}
@Test
public void testCompositeRuleWithAnnotatedComposingRules() throws Exception {
CompositeRule compositeRule = new CompositeRule();
MyRule rule = new MyRule();
compositeRule.addRule(rule);
RulesEngine engine = aNewRulesEngine().build();
engine.registerRule(compositeRule);
engine.fireRules();
assertThat(rule.isExecuted()).isTrue();
}
@org.easyrules.annotation.Rule
class MyRule {
boolean executed;
@Condition
public boolean when() {
return true;
}
@Action
public void then() {
executed = true;
}
public boolean isExecuted() {
return executed;
}
}
}

Loading…
Cancel
Save