issue #138 : add ability to load multiple rules at once

pull/147/head
Mahmoud Ben Hassine 7 years ago
parent 994c24ab16
commit 5288bd8702

@ -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<MVELRuleDefinition> readAll(Reader reader) {
List<MVELRuleDefinition> ruleDefinitions = new ArrayList<>();
Iterable<Object> rules = yaml.loadAll(reader);
for (Object rule : rules) {
Map<String, Object> map = (Map<String, Object>) rule;
ruleDefinitions.add(createRuleDefinitionFrom(map));
}
return ruleDefinitions;
}
private static MVELRuleDefinition createRuleDefinitionFrom(Map<String, Object> map) {
MVELRuleDefinition ruleDefinition = new MVELRuleDefinition();

@ -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<MVELRuleDefinition> ruleDefinition = reader.readAll(rulesDescriptorReader);
for (MVELRuleDefinition mvelRuleDefinition : ruleDefinition) {
rules.register(mvelRuleDefinition.create());
}
return rules;
}
}

@ -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<MVELRuleDefinition> 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<MVELRuleDefinition> ruleDefinitions = ruleDefinitionReader.readAll(new FileReader(rulesDescriptor));
// then
assertThat(ruleDefinitions).hasSize(0);
}
}

@ -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<Rule> 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

@ -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!\");"
Loading…
Cancel
Save