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