From 5288bd8702465336782b4c4ec34c26afef8723aa Mon Sep 17 00:00:00 2001 From: Mahmoud Ben Hassine Date: Sun, 8 Apr 2018 13:40:59 +0200 Subject: [PATCH] issue #138 : add ability to load multiple rules at once --- .../rules/mvel/MVELRuleDefinitionReader.java | 11 +++++ .../org/jeasy/rules/mvel/MVELRuleFactory.java | 19 +++++++++ .../mvel/MVELRuleDefinitionReaderTest.java | 41 +++++++++++++++++++ .../jeasy/rules/mvel/MVELRuleFactoryTest.java | 28 +++++++++++++ .../src/test/resources/rules-empty.yml | 0 easy-rules-mvel/src/test/resources/rules.yml | 14 +++++++ 6 files changed, 113 insertions(+) create mode 100644 easy-rules-mvel/src/test/resources/rules-empty.yml create mode 100644 easy-rules-mvel/src/test/resources/rules.yml diff --git a/easy-rules-mvel/src/main/java/org/jeasy/rules/mvel/MVELRuleDefinitionReader.java b/easy-rules-mvel/src/main/java/org/jeasy/rules/mvel/MVELRuleDefinitionReader.java index 084b0c1..ab9160c 100644 --- a/easy-rules-mvel/src/main/java/org/jeasy/rules/mvel/MVELRuleDefinitionReader.java +++ b/easy-rules-mvel/src/main/java/org/jeasy/rules/mvel/MVELRuleDefinitionReader.java @@ -31,6 +31,7 @@ import java.io.FileNotFoundException; import java.io.Reader; import java.io.FileReader; import java.io.StringReader; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -53,6 +54,16 @@ class MVELRuleDefinitionReader { return createRuleDefinitionFrom(map); } + List readAll(Reader reader) { + List ruleDefinitions = new ArrayList<>(); + Iterable rules = yaml.loadAll(reader); + for (Object rule : rules) { + Map map = (Map) rule; + ruleDefinitions.add(createRuleDefinitionFrom(map)); + } + return ruleDefinitions; + } + private static MVELRuleDefinition createRuleDefinitionFrom(Map map) { MVELRuleDefinition ruleDefinition = new MVELRuleDefinition(); diff --git a/easy-rules-mvel/src/main/java/org/jeasy/rules/mvel/MVELRuleFactory.java b/easy-rules-mvel/src/main/java/org/jeasy/rules/mvel/MVELRuleFactory.java index b1de162..f9650ec 100644 --- a/easy-rules-mvel/src/main/java/org/jeasy/rules/mvel/MVELRuleFactory.java +++ b/easy-rules-mvel/src/main/java/org/jeasy/rules/mvel/MVELRuleFactory.java @@ -23,10 +23,13 @@ */ package org.jeasy.rules.mvel; +import org.jeasy.rules.api.Rules; + import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Reader; +import java.util.List; /** * Factory to create {@link MVELRule} instances. @@ -68,4 +71,20 @@ public class MVELRuleFactory { MVELRuleDefinition ruleDefinition = reader.read(ruleDescriptor.toString()); return ruleDefinition.create(); } + + /** + * Create a set of {@link MVELRule} from a Reader. + * + * @param rulesDescriptorReader as a Reader + * @return a set of rules + * @throws IOException if the I/O operation failed + */ + public static Rules createRulesFrom(Reader rulesDescriptorReader) throws IOException { + Rules rules = new Rules(); + List ruleDefinition = reader.readAll(rulesDescriptorReader); + for (MVELRuleDefinition mvelRuleDefinition : ruleDefinition) { + rules.register(mvelRuleDefinition.create()); + } + return rules; + } } diff --git a/easy-rules-mvel/src/test/java/org/jeasy/rules/mvel/MVELRuleDefinitionReaderTest.java b/easy-rules-mvel/src/test/java/org/jeasy/rules/mvel/MVELRuleDefinitionReaderTest.java index 87007bc..857412c 100644 --- a/easy-rules-mvel/src/test/java/org/jeasy/rules/mvel/MVELRuleDefinitionReaderTest.java +++ b/easy-rules-mvel/src/test/java/org/jeasy/rules/mvel/MVELRuleDefinitionReaderTest.java @@ -27,9 +27,11 @@ import org.jeasy.rules.api.Rule; import org.junit.Test; import java.io.File; +import java.io.FileReader; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Collections; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -111,4 +113,43 @@ public class MVELRuleDefinitionReaderTest { // then // expected exception } + + @Test + public void testRulesDefinitionReading() throws Exception { + // given + File rulesDescriptor = new File("src/test/resources/rules.yml"); + + // when + List ruleDefinitions = ruleDefinitionReader.readAll(new FileReader(rulesDescriptor)); + + // then + assertThat(ruleDefinitions).hasSize(2); + MVELRuleDefinition ruleDefinition = ruleDefinitions.get(0); + assertThat(ruleDefinition).isNotNull(); + assertThat(ruleDefinition.getName()).isEqualTo("adult rule"); + assertThat(ruleDefinition.getDescription()).isEqualTo("when age is greater then 18, then mark as adult"); + assertThat(ruleDefinition.getPriority()).isEqualTo(1); + assertThat(ruleDefinition.getCondition()).isEqualTo("person.age > 18"); + assertThat(ruleDefinition.getActions()).isEqualTo(Collections.singletonList("person.setAdult(true);")); + + ruleDefinition = ruleDefinitions.get(1); + assertThat(ruleDefinition).isNotNull(); + assertThat(ruleDefinition.getName()).isEqualTo("weather rule"); + assertThat(ruleDefinition.getDescription()).isEqualTo("when it rains, then take an umbrella"); + assertThat(ruleDefinition.getPriority()).isEqualTo(2); + assertThat(ruleDefinition.getCondition()).isEqualTo("rain == true"); + assertThat(ruleDefinition.getActions()).isEqualTo(Collections.singletonList("System.out.println(\"It rains, take an umbrella!\");")); + } + + @Test + public void testEmptyRulesDefinitionReading() throws Exception { + // given + File rulesDescriptor = new File("src/test/resources/rules-empty.yml"); + + // when + List ruleDefinitions = ruleDefinitionReader.readAll(new FileReader(rulesDescriptor)); + + // then + assertThat(ruleDefinitions).hasSize(0); + } } \ No newline at end of file diff --git a/easy-rules-mvel/src/test/java/org/jeasy/rules/mvel/MVELRuleFactoryTest.java b/easy-rules-mvel/src/test/java/org/jeasy/rules/mvel/MVELRuleFactoryTest.java index b51da45..3769bb4 100644 --- a/easy-rules-mvel/src/test/java/org/jeasy/rules/mvel/MVELRuleFactoryTest.java +++ b/easy-rules-mvel/src/test/java/org/jeasy/rules/mvel/MVELRuleFactoryTest.java @@ -23,6 +23,8 @@ */ package org.jeasy.rules.mvel; +import org.jeasy.rules.api.Rule; +import org.jeasy.rules.api.Rules; import org.junit.Test; import java.io.File; @@ -31,6 +33,7 @@ import java.io.Reader; import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.Iterator; import static org.assertj.core.api.Assertions.assertThat; @@ -50,6 +53,31 @@ public class MVELRuleFactoryTest { assertThat(adultRule.getPriority()).isEqualTo(1); } + @Test + public void testRulesCreation() throws Exception { + // given + File rulesDescriptor = new File("src/test/resources/rules.yml"); + + // when + Rules rules = MVELRuleFactory.createRulesFrom(new FileReader(rulesDescriptor)); + + // then + assertThat(rules).hasSize(2); + Iterator iterator = rules.iterator(); + + Rule rule = iterator.next(); + assertThat(rule).isNotNull(); + assertThat(rule.getName()).isEqualTo("adult rule"); + assertThat(rule.getDescription()).isEqualTo("when age is greater then 18, then mark as adult"); + assertThat(rule.getPriority()).isEqualTo(1); + + rule = iterator.next(); + assertThat(rule).isNotNull(); + assertThat(rule.getName()).isEqualTo("weather rule"); + assertThat(rule.getDescription()).isEqualTo("when it rains, then take an umbrella"); + assertThat(rule.getPriority()).isEqualTo(2); + } + @Test public void testRuleCreationFromFileReader() throws Exception{ // given diff --git a/easy-rules-mvel/src/test/resources/rules-empty.yml b/easy-rules-mvel/src/test/resources/rules-empty.yml new file mode 100644 index 0000000..e69de29 diff --git a/easy-rules-mvel/src/test/resources/rules.yml b/easy-rules-mvel/src/test/resources/rules.yml new file mode 100644 index 0000000..c0db9d3 --- /dev/null +++ b/easy-rules-mvel/src/test/resources/rules.yml @@ -0,0 +1,14 @@ +--- +name: adult rule +description: when age is greater then 18, then mark as adult +priority: 1 +condition: "person.age > 18" +actions: + - "person.setAdult(true);" +--- +name: weather rule +description: when it rains, then take an umbrella +priority: 2 +condition: "rain == true" +actions: + - "System.out.println(\"It rains, take an umbrella!\");" \ No newline at end of file