BAEL-1258 Added example code for Jess and JSR94 (#9693)
* BAEL-1258 Added example code for Jess and JSR94 * BAEL-1258 Relocate to rule-modules * BAEL-1258 Remove README as per PR review * BAEL-1258 Declared exceptions and replace System.out.println with log statements * BAEL-1258 Removed Lombok * BAEL-1258 Removed Lombok * BAEL-1258 Rename artifactId to match directory name
This commit is contained in:
parent
9f5396e448
commit
4128525f00
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.baeldung.rules.jess</groupId>
|
||||||
|
<artifactId>jess</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/jsr94/jsr94 -->
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>jsr94</groupId>
|
||||||
|
<artifactId>jsr94</artifactId>
|
||||||
|
<version>1.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>gov.sandia</groupId>
|
||||||
|
<artifactId>jess</artifactId>
|
||||||
|
<version>7.1p2</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.baeldung.rules.jess;
|
||||||
|
|
||||||
|
import jess.JessException;
|
||||||
|
import jess.Rete;
|
||||||
|
|
||||||
|
public class JessHello {
|
||||||
|
public static final String RULES_FILE = "helloJess.clp";
|
||||||
|
|
||||||
|
public static void main(String[] args) throws JessException {
|
||||||
|
Rete engine = new Rete();
|
||||||
|
engine.reset();
|
||||||
|
|
||||||
|
engine.batch(RULES_FILE);
|
||||||
|
|
||||||
|
engine.run();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.baeldung.rules.jess;
|
||||||
|
|
||||||
|
import com.baeldung.rules.jess.model.Answer;
|
||||||
|
import com.baeldung.rules.jess.model.Question;
|
||||||
|
import jess.Filter;
|
||||||
|
import jess.JessException;
|
||||||
|
import jess.Rete;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class JessWithData {
|
||||||
|
public static final String RULES_BONUS_FILE = "bonus.clp";
|
||||||
|
private static Logger log = Logger.getLogger("JessWithData");
|
||||||
|
|
||||||
|
public static void main(String[] args) throws JessException {
|
||||||
|
Rete engine = new Rete();
|
||||||
|
engine.reset();
|
||||||
|
|
||||||
|
engine.batch(RULES_BONUS_FILE);
|
||||||
|
|
||||||
|
prepareData(engine);
|
||||||
|
|
||||||
|
engine.run();
|
||||||
|
|
||||||
|
checkResults(engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkResults(Rete engine) {
|
||||||
|
Iterator results = engine.getObjects(new Filter.ByClass(Answer.class));
|
||||||
|
while (results.hasNext()) {
|
||||||
|
Answer answer = (Answer) results.next();
|
||||||
|
log.info(answer.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void prepareData(Rete engine) throws JessException {
|
||||||
|
Question question = new Question("Can I have a bonus?", -5);
|
||||||
|
log.info(question.toString());
|
||||||
|
engine.add(question);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
package com.baeldung.rules.jess;
|
||||||
|
|
||||||
|
import com.baeldung.rules.jess.model.Answer;
|
||||||
|
import com.baeldung.rules.jess.model.Question;
|
||||||
|
|
||||||
|
import javax.rules.*;
|
||||||
|
import javax.rules.admin.RuleAdministrator;
|
||||||
|
import javax.rules.admin.RuleExecutionSet;
|
||||||
|
import javax.rules.admin.RuleExecutionSetCreateException;
|
||||||
|
import javax.rules.admin.RuleExecutionSetRegisterException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.rmi.RemoteException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class JessWithJsr94 {
|
||||||
|
public static final String RULES_BONUS_FILE = "/bonus.clp";
|
||||||
|
public static final String RULES_URI = "com/baeldung/rules/bonus";
|
||||||
|
private static final String RULE_SERVICE_PROVIDER = "jess.jsr94";
|
||||||
|
private static Logger log = Logger.getLogger("JessWithData");
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
RuleServiceProvider ruleServiceProvider = instantiateJessInstance();
|
||||||
|
|
||||||
|
// load our rules and register them with the rules provider
|
||||||
|
registerRules(RULES_BONUS_FILE, RULES_URI, ruleServiceProvider);
|
||||||
|
|
||||||
|
runRules(RULES_URI, ruleServiceProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RuleServiceProvider instantiateJessInstance() throws ClassNotFoundException, ConfigurationException {
|
||||||
|
// Load the rule service provider of the reference implementation.
|
||||||
|
// Loading this class will automatically register this provider with the provider manager.
|
||||||
|
Class.forName(RULE_SERVICE_PROVIDER + ".RuleServiceProviderImpl");
|
||||||
|
|
||||||
|
// Get the rule service provider from the provider manager.
|
||||||
|
return RuleServiceProviderManager.getRuleServiceProvider(RULE_SERVICE_PROVIDER);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void runRules(String rulesURI, RuleServiceProvider ruleServiceProvider)
|
||||||
|
throws ConfigurationException, RuleSessionTypeUnsupportedException, RuleSessionCreateException, RuleExecutionSetNotFoundException, RemoteException, InvalidRuleSessionException {
|
||||||
|
// Get a RuleRuntime and invoke the rule engine.
|
||||||
|
RuleRuntime ruleRuntime = ruleServiceProvider.getRuleRuntime();
|
||||||
|
|
||||||
|
//Create a statelessRuleSession.
|
||||||
|
StatelessRuleSession statelessRuleSession = (StatelessRuleSession) ruleRuntime.createRuleSession(rulesURI, new HashMap(), RuleRuntime.STATELESS_SESSION_TYPE);
|
||||||
|
|
||||||
|
calculateResults(statelessRuleSession);
|
||||||
|
|
||||||
|
statelessRuleSession.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void calculateResults(StatelessRuleSession statelessRuleSession) throws InvalidRuleSessionException, RemoteException {
|
||||||
|
List data = prepareData();
|
||||||
|
|
||||||
|
// execute the rules
|
||||||
|
List results = statelessRuleSession.executeRules(data);
|
||||||
|
|
||||||
|
checkResults(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List prepareData() {
|
||||||
|
List data = new ArrayList();
|
||||||
|
data.add(new Question("Can I have a bonus?", -5));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkResults(List results) {
|
||||||
|
Iterator itr = results.iterator();
|
||||||
|
while (itr.hasNext()) {
|
||||||
|
Object obj = itr.next();
|
||||||
|
if (obj instanceof Answer) {
|
||||||
|
log.info(obj.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void registerRules(String rulesFile, String rulesURI, RuleServiceProvider serviceProvider) throws ConfigurationException, RuleExecutionSetCreateException, IOException, RuleExecutionSetRegisterException {
|
||||||
|
// Get the rule administrator.
|
||||||
|
RuleAdministrator ruleAdministrator = serviceProvider.getRuleAdministrator();
|
||||||
|
|
||||||
|
// load the rules
|
||||||
|
InputStream ruleInput = JessWithJsr94.class.getResourceAsStream(rulesFile);
|
||||||
|
HashMap vendorProperties = new HashMap();
|
||||||
|
|
||||||
|
// Create the RuleExecutionSet
|
||||||
|
RuleExecutionSet ruleExecutionSet = ruleAdministrator
|
||||||
|
.getLocalRuleExecutionSetProvider(vendorProperties)
|
||||||
|
.createRuleExecutionSet(ruleInput, vendorProperties);
|
||||||
|
|
||||||
|
// Register the rule execution set.
|
||||||
|
ruleAdministrator.registerRuleExecutionSet(rulesURI, ruleExecutionSet, vendorProperties);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.baeldung.rules.jess.model;
|
||||||
|
|
||||||
|
public class Answer {
|
||||||
|
private String answer;
|
||||||
|
private int newBalance;
|
||||||
|
|
||||||
|
public Answer(String answer, int newBalance) {
|
||||||
|
this.answer = answer;
|
||||||
|
this.newBalance = newBalance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNewBalance() {
|
||||||
|
return newBalance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNewBalance(int newBalance) {
|
||||||
|
this.newBalance = newBalance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAnswer() {
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAnswer(String answer) {
|
||||||
|
this.answer = answer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "Answer(answer=" + answer + ", newBalance=" + newBalance + ")";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.baeldung.rules.jess.model;
|
||||||
|
|
||||||
|
public class Question {
|
||||||
|
private String question;
|
||||||
|
private int balance;
|
||||||
|
|
||||||
|
public Question(String question, int balance) {
|
||||||
|
this.question = question;
|
||||||
|
this.balance = balance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getQuestion() {
|
||||||
|
return question;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQuestion(String question) {
|
||||||
|
this.question = question;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBalance() {
|
||||||
|
return balance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBalance(int balance) {
|
||||||
|
this.balance = balance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "Question(question=" + question + ", balance=" + balance + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
(import com.baeldung.rules.jess.model.*)
|
||||||
|
(deftemplate Question (declare (from-class Question)))
|
||||||
|
(deftemplate Answer (declare (from-class Answer)))
|
||||||
|
|
||||||
|
(defrule avoid-overdraft "Give $50 to anyone overdrawn"
|
||||||
|
?q <- (Question { balance < 0 })
|
||||||
|
=>
|
||||||
|
(add (new Answer "Overdrawn bonus" (+ ?q.balance 50))))
|
|
@ -0,0 +1,3 @@
|
||||||
|
;; Hello, world in Jess!
|
||||||
|
|
||||||
|
(printout t "Hello from Jess!" crlf)
|
Loading…
Reference in New Issue