diff --git a/drools/pom.xml b/drools/pom.xml new file mode 100644 index 0000000000..908a82df56 --- /dev/null +++ b/drools/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + com.baeldung + drools + 1.0.0-SNAPSHOT + + 4.4.6 + 7.0.0.CR1 + 3.13 + 2.19.1 + 4.11 + + + + org.apache.httpcomponents + httpcore + ${http-component-version} + + + + org.kie + kie-ci + ${drools-version} + + + org.drools + drools-decisiontables + ${drools-version} + + + + org.drools + drools-core + ${drools-version} + + + org.drools + drools-compiler + ${drools-version} + + + org.apache.poi + poi + ${apache-poi-version} + + + + org.apache.poi + poi-ooxml + ${apache-poi-version} + + + junit + junit + ${junit-version} + test + + + org.springframework + spring-core + 4.3.6.RELEASE + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${surefire-plugin-version} + + + **/*IntegrationTest.java + + + + + + + \ No newline at end of file diff --git a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java new file mode 100644 index 0000000000..5f0d619813 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java @@ -0,0 +1,67 @@ +package com.baeldung.drools.config; + +import org.kie.api.KieServices; +import org.kie.api.builder.*; +import org.kie.api.io.KieResources; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; +import org.kie.internal.io.ResourceFactory; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +public class DroolsBeanFactory { + + private static final String RULES_PATH = "com/baeldung/drools/rules/"; + private KieServices kieServices=KieServices.Factory.get(); + + private KieFileSystem getKieFileSystem() throws IOException{ + KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); + List rules=Arrays.asList("SuggestApplicant.drl","Product_rules.xls"); + for(String rule:rules){ + kieFileSystem.write(ResourceFactory.newClassPathResource(rule)); + } + return kieFileSystem; + + } + + public KieContainer getKieContainer() throws IOException { + getKieRepository(); + + KieBuilder kb = kieServices.newKieBuilder(getKieFileSystem()); + kb.buildAll(); + + KieModule kieModule = kb.getKieModule(); + KieContainer kContainer = kieServices.newKieContainer(kieModule.getReleaseId()); + + return kContainer; + + } + + private void getKieRepository() { + final KieRepository kieRepository = kieServices.getRepository(); + kieRepository.addKieModule(new KieModule() { + public ReleaseId getReleaseId() { + return kieRepository.getDefaultReleaseId(); + } + }); + } + + public KieSession getKieSession(){ + getKieRepository(); + KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); + + kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/SuggestApplicant.drl")); + kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/Product_rules.xls")); + + KieBuilder kb = kieServices.newKieBuilder(kieFileSystem); + kb.buildAll(); + KieModule kieModule = kb.getKieModule(); + + KieContainer kContainer = kieServices.newKieContainer(kieModule.getReleaseId()); + + return kContainer.newKieSession(); + + } + +} \ No newline at end of file diff --git a/drools/src/main/java/com/baeldung/drools/model/Applicant.java b/drools/src/main/java/com/baeldung/drools/model/Applicant.java new file mode 100644 index 0000000000..706a55d53c --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/model/Applicant.java @@ -0,0 +1,48 @@ +package com.baeldung.drools.model; + +public class Applicant { + + private String name; + private int age; + private double currentSalary; + private int experienceInYears; + + public Applicant(String name, int age, Double currentSalary, int experienceInYears) { + this.name = name; + this.age = age; + this.currentSalary = currentSalary; + this.experienceInYears = experienceInYears; + } + + 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 Double getCurrentSalary() { + return currentSalary; + } + + public void setCurrentSalary(Double currentSalary) { + this.currentSalary = currentSalary; + } + + public int getExperienceInYears() { + return experienceInYears; + } + + public void setExperienceInYears(int experienceInYears) { + this.experienceInYears = experienceInYears; + } +} diff --git a/drools/src/main/java/com/baeldung/drools/model/Product.java b/drools/src/main/java/com/baeldung/drools/model/Product.java new file mode 100644 index 0000000000..3d49ca4ec3 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/model/Product.java @@ -0,0 +1,38 @@ +package com.baeldung.drools.model; + +public class Product { + private String name; + private String type; + + private String label; + + public Product(String name, String type) { + this.name = name; + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + +} diff --git a/drools/src/main/java/com/baeldung/drools/model/SuggestedRole.java b/drools/src/main/java/com/baeldung/drools/model/SuggestedRole.java new file mode 100644 index 0000000000..3e9763aef2 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/model/SuggestedRole.java @@ -0,0 +1,14 @@ +package com.baeldung.drools.model; + +public class SuggestedRole { + + private String role; + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } +} diff --git a/drools/src/main/java/com/baeldung/drools/service/ApplicantService.java b/drools/src/main/java/com/baeldung/drools/service/ApplicantService.java new file mode 100644 index 0000000000..f74298ef05 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/service/ApplicantService.java @@ -0,0 +1,23 @@ +package com.baeldung.drools.service; + +import com.baeldung.drools.config.DroolsBeanFactory; +import com.baeldung.drools.model.Applicant; +import com.baeldung.drools.model.SuggestedRole; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; + +import java.io.IOException; + +public class ApplicantService { + + KieSession kieSession=new DroolsBeanFactory().getKieSession(); + + public SuggestedRole suggestARoleForApplicant(Applicant applicant,SuggestedRole suggestedRole) throws IOException { + kieSession.insert(applicant); + kieSession.setGlobal("suggestedRole",suggestedRole); + kieSession.fireAllRules(); + System.out.println(suggestedRole.getRole()); + return suggestedRole; + + } +} diff --git a/drools/src/main/java/com/baeldung/drools/service/ProductService.java b/drools/src/main/java/com/baeldung/drools/service/ProductService.java new file mode 100644 index 0000000000..be5e43ed7b --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/service/ProductService.java @@ -0,0 +1,20 @@ +package com.baeldung.drools.service; + +import com.baeldung.drools.config.DroolsBeanFactory; +import com.baeldung.drools.model.Product; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; + +public class ProductService { + + private KieSession kieSession=new DroolsBeanFactory().getKieSession(); + + public Product applyLabelToProduct(Product product){ + kieSession.insert(product); + kieSession.fireAllRules(); + System.out.println(product.getLabel()); + return product; + + } + +} diff --git a/drools/src/main/resources/com/baeldung/drools/rules/Product_rules.xls b/drools/src/main/resources/com/baeldung/drools/rules/Product_rules.xls new file mode 100644 index 0000000000..4cb18c7420 Binary files /dev/null and b/drools/src/main/resources/com/baeldung/drools/rules/Product_rules.xls differ diff --git a/drools/src/main/resources/com/baeldung/drools/rules/SuggestApplicant.drl b/drools/src/main/resources/com/baeldung/drools/rules/SuggestApplicant.drl new file mode 100644 index 0000000000..3deb037571 --- /dev/null +++ b/drools/src/main/resources/com/baeldung/drools/rules/SuggestApplicant.drl @@ -0,0 +1,31 @@ +package com.baeldung.drools.rules; + +import com.baeldung.drools.model.Applicant; + +global com.baeldung.drools.model.SuggestedRole suggestedRole; + +dialect "mvel" + +rule "Suggest Manager Role" + when + Applicant(experienceInYears > 10) + Applicant(currentSalary > 1000000 && currentSalary <= 2500000) + then + suggestedRole.setRole("Manager"); +end + +rule "Suggest Senior developer Role" + when + Applicant(experienceInYears > 5 && experienceInYears <= 10) + Applicant(currentSalary > 500000 && currentSalary <= 1500000) + then + suggestedRole.setRole("Senior developer"); +end + +rule "Suggest Developer Role" + when + Applicant(experienceInYears > 0 && experienceInYears <= 5) + Applicant(currentSalary > 200000 && currentSalary <= 1000000) + then + suggestedRole.setRole("Developer"); +end diff --git a/drools/src/test/java/com/baeldung/drools/service/ApplicantServiceIntegrationTest.java b/drools/src/test/java/com/baeldung/drools/service/ApplicantServiceIntegrationTest.java new file mode 100644 index 0000000000..71f33f2db4 --- /dev/null +++ b/drools/src/test/java/com/baeldung/drools/service/ApplicantServiceIntegrationTest.java @@ -0,0 +1,53 @@ +package com.baeldung.drools.service; + +import com.baeldung.drools.model.Applicant; +import com.baeldung.drools.model.SuggestedRole; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static junit.framework.Assert.assertNull; +import static junit.framework.TestCase.assertEquals; + + +public class ApplicantServiceIntegrationTest { + + + private ApplicantService applicantService; + + @Before + public void setup(){ + applicantService = new ApplicantService(); + } + + @Test + public void whenCriteriaMatching_ThenSuggestManagerRole() throws IOException { + Applicant applicant=new Applicant("Davis",37,1600000.0,11); + SuggestedRole suggestedRole=new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant,suggestedRole); + assertEquals("Manager",suggestedRole.getRole()); + } + + @Test + public void whenCriteriaMatching_ThenSuggestSeniorDeveloperRole() throws IOException { + Applicant applicant=new Applicant("John",37,1200000.0,8); + SuggestedRole suggestedRole=new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant,suggestedRole); + assertEquals("Senior developer",suggestedRole.getRole()); + } + @Test + public void whenCriteriaMatching_ThenSuggestDeveloperRole() throws IOException { + Applicant applicant=new Applicant("Davis",37,800000.0,3); + SuggestedRole suggestedRole=new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant,suggestedRole); + assertEquals("Developer",suggestedRole.getRole()); + } + @Test + public void whenCriteriaNotMatching_ThenNoRole() throws IOException { + Applicant applicant=new Applicant("John",37,1200000.0,5); + SuggestedRole suggestedRole=new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant,suggestedRole); + assertNull(suggestedRole.getRole()); + } +} diff --git a/drools/src/test/java/com/baeldung/drools/service/ProductServiceIntegrationTest.java b/drools/src/test/java/com/baeldung/drools/service/ProductServiceIntegrationTest.java new file mode 100644 index 0000000000..08c3fceb7d --- /dev/null +++ b/drools/src/test/java/com/baeldung/drools/service/ProductServiceIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.drools.service; + +import com.baeldung.drools.model.Product; +import org.junit.Before; +import org.junit.Test; +import static junit.framework.TestCase.assertEquals; + + +public class ProductServiceIntegrationTest { + + private ProductService productService; + + @Before + public void setup(){ + productService=new ProductService(); + } + + + @Test + public void whenProductTypeElectronic_ThenLabelBarcode(){ + Product product=new Product("Microwave","Electronic"); + product=productService.applyLabelToProduct(product); + assertEquals("BarCode",product.getLabel()); + } + + @Test + public void whenProductTypeBook_ThenLabelIsbn(){ + Product product=new Product("AutoBiography","Book"); + product=productService.applyLabelToProduct(product); + assertEquals("ISBN",product.getLabel()); + } +} diff --git a/pom.xml b/pom.xml index b652df1724..18f161efb7 100644 --- a/pom.xml +++ b/pom.xml @@ -221,6 +221,7 @@ spring-data-gemfire mybatis spring-drools + drools