What's new in Drools 6 - London JBUG 2013

104
1 The SkyNet funding bill is passed. The system goes online on August 4th, 1997. Human decisions are removed from strategic defense. SkyNet begins to learn at a geometric rate. It becomes self-aware at 2:14am Eastern time, August 29th In a panic, they try to pull the plug. And, Skynet fights back Mark Proctor Project Lead Monday, 5 August 13

description

Presentation around the time of Beta3 for "What's new in Drools 6.0". Note some aspects have already changed, especially around the spring integration.

Transcript of What's new in Drools 6 - London JBUG 2013

Page 1: What's new in Drools 6 - London JBUG 2013

1

●The SkyNet funding bill is passed. ●The system goes online on August 4th, 1997.●Human decisions are removed from strategic defense. ●SkyNet begins to learn at a geometric rate.●It becomes self-aware at 2:14am Eastern time, August 29th ●In a panic, they try to pull the plug. ●And, Skynet fights back

Mark Proctor

Project Lead

Monday, 5 August 13

Page 2: What's new in Drools 6 - London JBUG 2013

Agenda

•Quick Intro - What are Rule Based Systems•KIE •5.x Critique•6.0 Improvements•UI•Content•Deployment•Spring and Camel•API•CDI•ScoreCards and PMML•JTMS•Phreak•Legacy Migrations

•Backward chaining Example•UberFire

2

Monday, 5 August 13

Page 3: What's new in Drools 6 - London JBUG 2013

Quick Intro

What are Rule Based Systems

3

Monday, 5 August 13

Page 4: What's new in Drools 6 - London JBUG 2013

4

VisionRobotics

Speech

Neural Nets Rule Base Systems/Expert System Tools

Understanding

NaturalLanguageSome Areas of

Artificial Intelligence

Some Areas of Artificial Intelligence

Monday, 5 August 13

Page 5: What's new in Drools 6 - London JBUG 2013

5

Knowledge Representation and Reasoning

The study of Knowledge is Epistemology● Nature Structure and Origins of Knowledge● Core or AI

Rule based systems● Expert System tools● Knowledge Representation and Reasoning● Facilitate the codification of knowledge into a knowledge

base which can be used for reasoning

Monday, 5 August 13

Page 6: What's new in Drools 6 - London JBUG 2013

6

It All Started Here Birth of CDSS

Dendral

Mycin

Baobab

Guidon

Neomycin

Teiresias Emycin WM

Puff

Sacon

Centaur

Gravida

Wheeze Clot

Onccocin

1970s

1980s

Monday, 5 August 13

Page 7: What's new in Drools 6 - London JBUG 2013

7

Because Not Everyone Is As Smart As He Is

Monday, 5 August 13

Page 8: What's new in Drools 6 - London JBUG 2013

1979 Rete Algorithm by Charles Forgy 8

Monday, 5 August 13

Page 9: What's new in Drools 6 - London JBUG 2013

Clips and Jess

Clips 1986

9

Clips 1995

Monday, 5 August 13

Page 10: What's new in Drools 6 - London JBUG 2013

10

And some day we'll build him!!!

Monday, 5 August 13

Page 11: What's new in Drools 6 - London JBUG 2013

11

What is a Rule

rule <rule_name> <attribute><value> when <conditions> then <actions>end

Monday, 5 August 13

Page 12: What's new in Drools 6 - London JBUG 2013

12

Pattern Matching

Person( age >= 18 )field name restriction

constraintobject type

pattern

Monday, 5 August 13

Page 13: What's new in Drools 6 - London JBUG 2013

13Two Phase System

Monday, 5 August 13

Page 14: What's new in Drools 6 - London JBUG 2013

14Classes

AccountAccount

long accountNo

int balance

CashFlowCashFlow

Date date

int amount

AccountPeriodAccountPeriod

Date start

Date end

Monday, 5 August 13

Page 15: What's new in Drools 6 - London JBUG 2013

15

rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, accountNo == $accountNo, date >= ap.start && <= ap.end, $ammount : ammount ) then acc.balance += $amount; end

select * from Account acc, Cashflow cf, AccountPeriod apwhere acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end

trigger : acc.balance += cf.amount

Credit Cashflow Rule

Monday, 5 August 13

Page 16: What's new in Drools 6 - London JBUG 2013

16

rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, accountNo == $accountNo, date >= ap.start && <= ap.end, $ammount : ammount ) then acc.balance += $amount; end

select * from Account acc, Cashflow cf, AccountPeriod apwhere acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end

trigger : acc.balance += cf.amount

Credit Cashflow Rule

Monday, 5 August 13

Page 17: What's new in Drools 6 - London JBUG 2013

17

rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, accountNo == $accountNo, date >= ap.start && <= ap.end, $ammount : ammount ) then acc.balance += $amount; end

select * from Account acc, Cashflow cf, AccountPeriod apwhere acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end

trigger : acc.balance += cf.amount

Credit Cashflow Rule

Monday, 5 August 13

Page 18: What's new in Drools 6 - London JBUG 2013

18

rule “increase balance for AccountPeriod Credits” when ap : AccountPeriod() acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, accountNo == $accountNo, date >= ap.start && <= ap.end, $ammount : ammount ) then acc.balance += $amount; end

select * from Account acc, Cashflow cf, AccountPeriod apwhere acc.accountNo == cf.accountNo and cf.type == CREDIT cf.date >= ap.start and cf.date <= ap.end

trigger : acc.balance += cf.amount

Credit Cashflow Rule

Monday, 5 August 13

Page 19: What's new in Drools 6 - London JBUG 2013

19

Rules as a “view”

rule "Increase balance for AccountPeriod Credits"when ap : AccountPeriod( ) acc : Account( ) cf : CashFlow( type == CashFlowType.CREDIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end )then acc.balance = acc.balance + cf.amount;end

rule "Decrease balance for AccountPeriod Debits"when ap : AccountPeriod( ) acc : Account( ) cf : CashFlow( type == CashFlowType.DEBIT, accountNo == acc.accountNo, date >= ap.start && <= ap.end )then acc.balance = acc.balance - cf.amount;end

CashFlowCashFlowCashFlowCashFlowdate amount type accountNo

12-Jan-12 100 CREDIT 12-Feb-12 200 DEBIT 118-May-12 50 CREDIT 19-May-12 75 CREDIT 1

AccountingPeriodAccountingPeriodstart end01-JAN-2012 31-MAR-2012

AccountAccountaccountNo balance1 0

CashFlowCashFlowCashFlowCashFlowdate amount type accountNo

12-Jan-12 100 CREDIT 19-May-12 75 CREDIT 1

CashFlowCashFlowCashFlowCashFlow

date amount type accountNo

2-Feb-12 200 DEBIT 1

AccountAccountaccountNo balance1 -25

Monday, 5 August 13

Page 20: What's new in Drools 6 - London JBUG 2013

20

rule "Print blance for AccountPeriod" salience -50when ap : AccountPeriod() acc : Account( )then System.out.println( "Account Number " + acc.accountNo + " balance " + acc.balance );end

Conflict Resolution with Salience

AgendaAgendaAgenda

1 increase balance arbitrary

2 decrease balance

arbitrary

3 increase balance

arbitrary

4 print balance

Monday, 5 August 13

Page 21: What's new in Drools 6 - London JBUG 2013

21

rule “increase balance for AccountPeriod Credits” ruleflow-group “calculation” when ap : AccountPeriod() acc : Account( $accountNo : accountNo ) CashFlow( type == CREDIT, accountNo == $accountNo, date >= ap.start && <= ap.end, $ammount : ammount ) then acc.balance += $amount; end

rule “Print blance for AccountPeriod” ruleflow-group “report” when ap : AccountPeriod() acc : Account( ) then System.out.println( acc.accountNo + “ : “ acc.balance ); end

ruleflow-group

RuleFlow

Monday, 5 August 13

Page 22: What's new in Drools 6 - London JBUG 2013

22

Monday, 5 August 13

Page 23: What's new in Drools 6 - London JBUG 2013

Knowledge Is Everything

Platform Changes Overview

23

Monday, 5 August 13

Page 24: What's new in Drools 6 - London JBUG 2013

KIE - Knowledge Is Everything24

KIE

Drools jBPMOptaPlanner UberFire

Guvnor

Drools-WB jBPM-WB

KIE-WB

Monday, 5 August 13

Page 25: What's new in Drools 6 - London JBUG 2013

GitHub

URL:https://github.com/droolsjbpm/

Bootstrap project:https://github.com/droolsjbpm/droolsjbpm-build-bootstrap

25

Monday, 5 August 13

Page 26: What's new in Drools 6 - London JBUG 2013

GitHub26

Monday, 5 August 13

Page 27: What's new in Drools 6 - London JBUG 2013

Changes

Conventions:•droolsjbpm -> kie•knowlege -> kie

Examples•KnowledgeBase -> Kie•StatefulKnowledgeSession -> KieSession•StatelessKnowledgeSession - StatelesKieSession

Legacy API Adapter JAR•Most API’s should work with legacy adapter•KnowledegAgents have not been ported, PKG’s are not longer

the unit of deployment

DRL has not changed

27

Monday, 5 August 13

Page 28: What's new in Drools 6 - London JBUG 2013

5.x Critique

28

Monday, 5 August 13

Page 29: What's new in Drools 6 - London JBUG 2013

5.x Critique

•UI•Content•Deployment•Utilize

29

Monday, 5 August 13

Page 30: What's new in Drools 6 - London JBUG 2013

5.x Critique

UI•GWT•but not easily extended•fixed layouts•no perspectives

30

Monday, 5 August 13

Page 31: What's new in Drools 6 - London JBUG 2013

5.x Critique

Content•JCR•Performance issues•Everything stored as a blob•No tagging, branching etc.•Webdav, with limited Eclipse team provider integration.

•Single tree structure (packages)•Packages created project deployment units•no real alignment with industry stadard

•No easy rule use (only a single global area)•Loading “model” jars into packages•Poor hack, for dependency management

31

Monday, 5 August 13

Page 32: What's new in Drools 6 - London JBUG 2013

5.x Critique32

Deployment•Simple Snapshot system•No real methodology•Doesn’t align with any industry standards

Monday, 5 August 13

Page 33: What's new in Drools 6 - London JBUG 2013

5.x Critique

Utilize•Progmatic API only•Have to select all resources

33

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

kbuilder.batch().add( newClassPathResource( "Model.drl", getClass() ), DRL ) .add( newClassPathResource( "Queries.drl", getClass() ), DRL ) .add( newClassPathResource( "General.drl", getClass() ), DRL ) .add( newClassPathResource( "Response.drl", getClass() ), DRL ) .add( newClassPathResource( "Events.drl", getClass() ), DRL ) .add( newClassPathResource( "UiView.drl", getClass() ), DRL ) .add( newClassPathResource( "Commands.drl", getClass() ), DRL ).build();

if ( kbuilder.hasErrors() ) { System.out.println( kbuilder.getErrors().toString() ); System.exit( 1 );}

KieBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();kbaseConf.setOption( EqualityBehaviorOption.EQUALITY );

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbaseConf );kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

Counter c = new Counter();ksession = kbase.newStatefulKnowledgeSession();

Monday, 5 August 13

Page 34: What's new in Drools 6 - London JBUG 2013

6.0 UI

Improvements

34

Monday, 5 August 13

Page 35: What's new in Drools 6 - London JBUG 2013

6.0 UI

UI•Modular•Extensible

35

•Dynamic and Flexible layouts•Perspectives

UF

Monday, 5 August 13

Page 36: What's new in Drools 6 - London JBUG 2013

VideoUI Overview

https://www.youtube.com/watch?v=ckAznbOOV-4

36

Monday, 5 August 13

Page 37: What's new in Drools 6 - London JBUG 2013

6.0 UI38

Monday, 5 August 13

Page 38: What's new in Drools 6 - London JBUG 2013

6.0 UI Content and Authoring

Improvements

39

Monday, 5 August 13

Page 39: What's new in Drools 6 - London JBUG 2013

6.0 Content

•GIT•Industry standard tooling

•Multiple repositories and projects•All projects are Maven multi-module projects•Projects can be shared, via pom dependencies•Both Kie projects, and any other maven jar

•Local Maven repository management for model jars

40

Monday, 5 August 13

Page 40: What's new in Drools 6 - London JBUG 2013

6.0 Content

Simple POM Editor

41

Monday, 5 August 13

Page 41: What's new in Drools 6 - London JBUG 2013

6.0 Content

Build And Deploy

42

Monday, 5 August 13

Page 42: What's new in Drools 6 - London JBUG 2013

6.0 Content

Local Maven repository and manager

43

Monday, 5 August 13

Page 43: What's new in Drools 6 - London JBUG 2013

VideoMaven, Builder an Deploy

https://www.youtube.com/watch?v=ckAznbOOV-4

44

Monday, 5 August 13

Page 44: What's new in Drools 6 - London JBUG 2013

6.0 Content

Create or Clone Git Repositories

46

Monday, 5 August 13

Page 45: What's new in Drools 6 - London JBUG 2013

6.0 Deployment Improvements

47

Monday, 5 August 13

Page 46: What's new in Drools 6 - London JBUG 2013

6.0 Deployment48

Deployment•Maven JARS•All projects are just maven projects•All projects compile to JARS•JARS are installed to local M2_REPO, which is expose on http•Can “deploy” to external repos.•Uses Maven industry methdologies

Monday, 5 August 13

Page 47: What's new in Drools 6 - London JBUG 2013

6.0 Utilization

Improvemets

49

Monday, 5 August 13

Page 48: What's new in Drools 6 - London JBUG 2013

KieModules

•Discovery•META-INF/kmodule.xml

•Convention based•No programmatic api for building•Multiple Named entities•Inheritence of Resources•Defaults for lazy people•Version built in a standard

50

Monday, 5 August 13

Page 49: What's new in Drools 6 - London JBUG 2013

Git Hub Examples

https://github.com/droolsjbpm/drools/tree/master/drools-examples-api

51

Monday, 5 August 13

Page 50: What's new in Drools 6 - London JBUG 2013

KieModules

Defaults and JAR on Classpath•Creates one KieBase, adds all resources from that JAR•See kmodule.xsd in kie-api jar

52

<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://jboss.org/kie/6.0.0/kmodule"> </kmodule>

KieServices ks = KieServices.Factory.get();KieContainer kContainer = ks.getKieClasspathContainer();

KieSession kSession = kContainer.newKieSession();kSession.setGlobal("out", out);kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));kSession.fireAllRules();

Monday, 5 August 13

Page 51: What's new in Drools 6 - London JBUG 2013

53

Monday, 5 August 13

Page 52: What's new in Drools 6 - London JBUG 2013

KieModules

Named Entities and JAR on Classpath•Creates one KieBase•Includes resources from package matching kbase name

54

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">

<kbase name="namedkiesession"> <ksession name="ksession1"/> </kbase>

</kmodule>

KieServices ks = KieServices.Factory.get();KieContainer kContainer = ks.getKieClasspathContainer();

KieSession kSession = kContainer.newKieSession("ksession1");kSession.setGlobal("out", out);kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));kSession.fireAllRules();

Monday, 5 August 13

Page 53: What's new in Drools 6 - London JBUG 2013

55

Monday, 5 August 13

Page 54: What's new in Drools 6 - London JBUG 2013

KieModules

Named Entities, with inheritence and JAR on Classpath•Two projects, one “includes” from the other

56

<dependency> <groupId>org.drools</groupId> <artifactId>named-kiesession</artifactId> <version>6.0.0-SNAPSHOT</version></dependency>

<kbase name="kiebaseinclusion" includes="namedkiebase"> <ksession name="ksession2"/></kbase>

KieServices ks = KieServices.Factory.get();KieContainer kContainer = ks.getKieClasspathContainer();KieSession kSession = kContainer.newKieSession("ksession2");kSession.setGlobal("out", out);

kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));kSession.fireAllRules();

kSession.insert(new Message("Dave", "Open the pod bay doors, HAL."));kSession.fireAllRules();

Monday, 5 August 13

Page 55: What's new in Drools 6 - London JBUG 2013

KieModules

Package location can over-ride kbase name defaults

57

<kbase name="WumpusMainKB" packages="org.drools.games.wumpus.server, org.drools.games.wumpus.server.view"> <ksession name="WumpusMainKS" /></kbase>

<kbase name="WumpusClientKB" packages="org.drools.games.wumpus.client"> <ksession name="WumpusClientKS"/></kbase>

KieContainer kc = KieServices.Factory.get().getKieClasspathContainer();final KieSession serverKsession = kc.newKieSession( "WumpusMainKS");final KieSession clientKsession = kc.newKieSession("WumpusClientKS");

Monday, 5 August 13

Page 56: What's new in Drools 6 - London JBUG 2013

Dynamic KieModules

•JARs can be loaded from URLs into KieRepository•Once loaded they can be resolved via ReleaseId

58

KieServices ks = KieServices.Factory.get();KieRepository kr = ks.getRepository();

KieModule kModule = kr.addKieModule(ks.getResources().newFileSystemResource( getFile("default-kiesession")));

KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());

KieSession kSession = kContainer.newKieSession();kSession.setGlobal("out", out);

Object msg1 = createMessage(kContainer, "Dave", "Hello, HAL. Do you read me, HAL?");kSession.insert(msg1);kSession.fireAllRules();

Monday, 5 August 13

Page 57: What's new in Drools 6 - London JBUG 2013

Dynamic KieModules

kie-ci use embedded maven for remote discovery

59

<dependency> <groupId>org.kie</groupId> <artifactId>kie-ci</artifactId></dependency>

KieServices ks = KieServices.Factory.get();

// Install example1 in the local maven repo before to do thisKieContainer kContainer = ks.newKieContainer( ks.newReleaseId("org.drools", "named-kiesession", "6.0.0-SNAPSHOT"));

KieSession kSession = kContainer.newKieSession("ksession1");kSession.setGlobal("out", out);

Object msg1 = createMessage(kContainer, "Dave", "Hello, HAL. Do you read me, HAL?");kSession.insert(msg1);kSession.fireAllRules();

Monday, 5 August 13

Page 58: What's new in Drools 6 - London JBUG 2013

Dynamic Modules

•Kie-CI and Automatic updates with KieScanner•Replaces KnowledgeAgent•Mave resolves new artifacts dynamically at runtime•SNAPSHOT, LATEST, STABLE and version ranges supported•See KieRepositoryScannerTest

60

KieServices ks = KieServices.Factory.get();ReleaseId releaseId = ks.newReleaseId("org.kie", "scanner-test", "1.0-SNAPSHOT");

InternalKieModule kJar1 = createKieJar(ks, releaseId, "rule1", "rule2");KieContainer kieContainer = ks.newKieContainer(releaseId);

MavenRepository repository = getMavenRepository();repository.deployArtifact(releaseId, kJar1, kPom);

// create a ksesion and check it works as expectedKieSession ksession = kieContainer.newKieSession("KSession1");checkKSession(ksession, "rule1", "rule2");

Monday, 5 August 13

Page 59: What's new in Drools 6 - London JBUG 2013

Dynamic Modules61

// create a new kjarInternalKieModule kJar2 = createKieJar(ks, releaseId, "rule2", "rule3");

// deploy it on mavenrepository.deployArtifact(releaseId, kJar2, kPom);

// since I am not calling start() on the scanner it means it won't have automatic scheduled scanningKieScanner scanner = ks.newKieScanner(kieContainer);

// scan the maven repo to get the new kjar version and deploy it on the kcontainerscanner.scanNow();

// create a ksesion and check it works as expectedKieSession ksession2 = kieContainer.newKieSession("KSession1");checkKSession(ksession2, "rule2", "rule3");

Monday, 5 August 13

Page 60: What's new in Drools 6 - London JBUG 2013

Programmatic API

•Builder API, for tooling integration•Incremental compilation, and problem reporting

62

KieServices ks = KieServices.Factory.get();KieRepository kr = ks.getRepository();KieFileSystem kfs = ks.newKieFileSystem();

kfs.write("src/main/resources/org/kie/example5/HAL5.drl", getRule());

KieBuilder kb = ks.newKieBuilder(kfs);

kb.buildAll(); // kieModule is automatically deployed to KieRepository if successfully built.if (kb.getResults().hasMessages(Level.ERROR)) { throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());}

KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId());

KieSession kSession = kContainer.newKieSession();kSession.setGlobal("out", out);

kSession.insert(new Message("Dave", "Hello, HAL. Do you read me, HAL?"));kSession.fireAllRules();

Monday, 5 August 13

Page 61: What's new in Drools 6 - London JBUG 2013

kmodule.xml Editor63

Monday, 5 August 13

Page 62: What's new in Drools 6 - London JBUG 2013

6.0 Spring Camel

64

Monday, 5 August 13

Page 63: What's new in Drools 6 - London JBUG 2013

Spring and Camel65

Monday, 5 August 13

Page 64: What's new in Drools 6 - London JBUG 2013

Spring and Camel66

Monday, 5 August 13

Page 65: What's new in Drools 6 - London JBUG 2013

Spring and Camel67

Monday, 5 August 13

Page 66: What's new in Drools 6 - London JBUG 2013

Spring and Camel68

Monday, 5 August 13

Page 67: What's new in Drools 6 - London JBUG 2013

6.0 CDI

69

Monday, 5 August 13

Page 68: What's new in Drools 6 - London JBUG 2013

CDI Context and Dependency Injection

CDI injects named entities from the kmodule.xml

Injectable types•KieServices•KieContainer•KieBase•KieSession•StatelessKieSession

70

Monday, 5 August 13

Page 69: What's new in Drools 6 - London JBUG 2013

KieContainer71

@Injectprivate KieContainer kContainer;

@Inject@KReleaseId(groupId = "jar1", artifactId = "art1", version = "1.1")private KieContainer kContainerv11;

Monday, 5 August 13

Page 70: What's new in Drools 6 - London JBUG 2013

KBase72

@Inject @KBase(value="jar1.KBase1", name="kb2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")private KieBase jar1KBase1kb2;

@Inject@KBase(value="jar1.KBase1", name="kb2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")private KieBase jar1KBase1kb22;

@Injectprivate KieBase defaultClassPathKBase;

@Inject@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0") private KieBase defaultDynamicKBase;

@Inject@KBase("jar1.KBase1") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")private KieBase jar1KBase1v10;

@Inject@KBase("jar1.KBase1") @KReleaseId(groupId = "jar1", artifactId = "art1", version = "1.1")private KieBase jar1KBase1v11;

@Inject@KBase(value="jar1.KBase1", name="kb1")@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0")private KieBase jar1KBase1kb1;

Monday, 5 August 13

Page 71: What's new in Drools 6 - London JBUG 2013

KSession73

@Injectprivate KieSession defaultClassPathKSession;

@Inject@KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0") private KieSession defaultDynamicKSession;

Monday, 5 August 13

Page 72: What's new in Drools 6 - London JBUG 2013

KSession74

@Inject@KSession("jar1.KSession2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0" )private KieSession kbase1ksession2v10;

@Inject@KSession("jar1.KSession2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.1" )private KieSession kbase1ksession2v11;

@Inject@KSession(value="jar1.KSession2", name="ks1") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0" )private KieSession kbase1ksession2ks1;

@Inject@KSession(value="jar1.KSession2", name="ks2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0" )private KieSession kbase1ksession2ks2 ;

@Inject@KSession(value="jar1.KSession2", name="ks2") @KReleaseId( groupId = "jar1", artifactId = "art1", version = "1.0" )private KieSession kbase1ksession2ks22;

Monday, 5 August 13

Page 73: What's new in Drools 6 - London JBUG 2013

6.0 Score Cards

75

Monday, 5 August 13

Page 74: What's new in Drools 6 - London JBUG 2013

Score Cards

a) Setup Parametersb) Characteristic Section

76

Monday, 5 August 13

Page 75: What's new in Drools 6 - London JBUG 2013

Score Cards77

•UI Generates PMML•DRL Generated from PMML •DRL results in•Calculated Score•Ranked Reason Codes

•Can import PMML 4.1•but not exposed yet

•Calculated Scores•Currently Summations•Weight coming

•Not in PMML standard

Monday, 5 August 13

Page 76: What's new in Drools 6 - London JBUG 2013

6.0 JTMS

78

Monday, 5 August 13

Page 77: What's new in Drools 6 - London JBUG 2013

Justification-based Truth Maintenace JTMS

Drools 5.x•Simple logical insertion TMS, like Clips, Jess and others.

•Drools 6.0•Contradiction handling with JTMS•Clean separation of exception logic

•TMS now has pluggable Belief System•Simple TMS support•JTMS now possible.•Defeasible Logic soon

•See drools-compiler•JTMSTest for lots of example tests•https://github.com/droolsjbpm/drools/blob/master/drools-compiler/

src/test/java/org/drools/compiler/beliefsystem/jtms/JTMSTest.java

79

Monday, 5 August 13

Page 78: What's new in Drools 6 - London JBUG 2013

80

JTMS

rule "Issue Child Bus Pass"when $p : Person( age < 16 )then insert(new ChildBusPass( $p ) );endrule "Issue Adult Bus Pass"when $p : Person( age >= 16 )then insert(new AdultBusPass( $p ) );end

Couples the logic

What happens when the Child stops being 16?

Monday, 5 August 13

Page 79: What's new in Drools 6 - London JBUG 2013

81

JTMS

•Bad•Monolithic•Leaky•Brittle integrity - manual maintenance

Monday, 5 August 13

Page 80: What's new in Drools 6 - London JBUG 2013

82

JTMS

•A rule “logically” inserts an object

•When the rule is no longer true, the object is retracted.rule "IsChild"when $p : Person( age < 16 )then logicalInsert( new IsChild( $p ) )endrule "IsAdult"when $p : Person( age >= 16 )then logicalInsert( new IsAdult( $p ) )end

de-couples the logic

Maintains the truth by automatically retracting

Monday, 5 August 13

Page 81: What's new in Drools 6 - London JBUG 2013

83

JTMS

rule "Issue Child Bus Pass"when $p : Person( ) IsChild( person =$p )then logicalInsert(new ChildBusPass( $p ) );endrule "Issue Adult Bus Pass"when $p : Person() IsAdult( person =$p )then logicalInsert(new AdultBusPass( $p ) );end

The truth maintenance cascades

Monday, 5 August 13

Page 82: What's new in Drools 6 - London JBUG 2013

84

JTMS

rule "Issue Child Bus Pass"when $p : Person( ) not( ChildBusPass( person == $p ) )then requestChildBusPass( $p );end The truth maintenance cascades

Monday, 5 August 13

Page 83: What's new in Drools 6 - London JBUG 2013

85

JTMS

• Good

• De-couple knowledge responsibilities

• Encapsulate knowledge

• Provide semantic abstractions for those encapsulation

• Integrity robustness – truth maintenance

Monday, 5 August 13

Page 84: What's new in Drools 6 - London JBUG 2013

JTMS86

IsChild

ChildBusPas

Rule : isChildRule

Rule : IssueBusPas

+

+

Monday, 5 August 13

Page 85: What's new in Drools 6 - London JBUG 2013

JTMS87

rule "Do not issue to banned people"when $p : Person( ) Banned( person =$p )then logicalInsert(new ChildBusPass( $p ) , “neg” );end

Monday, 5 August 13

Page 86: What's new in Drools 6 - London JBUG 2013

JTMS88

IsChild

ChildBusPas

Rule : isChildRule

Rule : IssueBusPas

+

+

Rule : Do Not Issue to Banned People

-

Monday, 5 August 13

Page 87: What's new in Drools 6 - London JBUG 2013

R.I.P RETE

inspirations:•Leaps, Collection Oriented Match, L/R Unlinking

New Innovations•Full Rule, and Rule Segment Unlinking•Lazy Evaluation, with Rule scoping•Set propagations

Previous Innovations•Modify In Place•Property Reactive•Tree Based Graphs•Subnetwork support

89

Monday, 5 August 13

Page 88: What's new in Drools 6 - London JBUG 2013

6.0 Legacy and Backwards Compatability

90

Monday, 5 August 13

Page 89: What's new in Drools 6 - London JBUG 2013

Legacy Systems and Migration

Legacy API Adapter JAR•Most API’s should work with legacy adapter•KnowledegAgents have not been ported, PKG’s are not longer

the unit of deployment

JCR Migration Tool•Command Line Java code•Each Package maps to a GIT project

91

Monday, 5 August 13

Page 90: What's new in Drools 6 - London JBUG 2013

Backward Chaining

Re-introducing an Advanced Feature

Detailed Tutorial here:https://www.youtube.com/watch?v=fCjIRVSRFvA

92

Monday, 5 August 13

Page 91: What's new in Drools 6 - London JBUG 2013

93

Backward Chaining

query isChild( Person p ) $p := Person( age <= 16 )end

rule "Issue Child Bus Pass"when $p : Person( ) isChild( $p; )then logicalInsert(new ChildBusPass( $p ) );end

Monday, 5 August 13

Page 92: What's new in Drools 6 - London JBUG 2013

94

Reasoning with GraphsHouse

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Monday, 5 August 13

Page 93: What's new in Drools 6 - London JBUG 2013

95

Backward Chaining

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Monday, 5 August 13

Page 94: What's new in Drools 6 - London JBUG 2013

Backward Chaining96

ksession.insert( new Location("Office", "House") );ksession.insert( new Location("Kitchen", "House") );ksession.insert( new Location("Knife", "Kitchen") );ksession.insert( new Location("Cheese", "Kitchen") );ksession.insert( new Location("Desk", "Office") );ksession.insert( new Location("Chair", "Office") );ksession.insert( new Location("Computer", "Desk") );ksession.insert( new Location("Draw", "Desk") );

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Monday, 5 August 13

Page 95: What's new in Drools 6 - London JBUG 2013

Backward Chaining97

rule "go1"when String( this == "go1" ) isContainedIn("Office", "House"; )then System.out.println( "office is in the house" );end

rule "go" salience 10when $s : String( )then System.out.println( $s );end

ksession.insert( "go1" );ksession.fireAllRules();---go1office is in the house

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

Does not recurse.Finds Location(“Office, House”) on first call.

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Monday, 5 August 13

Page 96: What's new in Drools 6 - London JBUG 2013

Backward Chaining98

rule "go2"when String( this == "go2" ) isContainedIn("Draw", "House"; )then System.out.println( "Draw in the House" );end

ksession.insert( "go2" );ksession.fireAllRules();---go2Desk in the House

query isContainedIn( String x, String y ) Location( x, y; ) or ( Location( z, y; ) and isContainedIn( x, z; ) )end

Recursive 3 times, note the Z.Location( “Office”, “House”)Location( “Desk”, “Office”)Location( “Draw”, “Desk”)

Out Var (unbound) In Var

(bound)

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Monday, 5 August 13

Page 97: What's new in Drools 6 - London JBUG 2013

Backward Chaining99

rule "go3"when String( this == "go3" ) isContainedIn("Key", "Office"; )then System.out.println( "Key in the Office" );end

ksession.insert( "go3" );ksession.fireAllRules();---go3

ksession.insert( new Location("Key", "Draw") );ksession.fireAllRules();---Key in the Office

Nothing returned.There is no key at any point below Office. But the query stays open and reactive.

Key Inserted 3 levels below, but system detects, reacts and bubbles up the results.

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Monday, 5 August 13

Page 98: What's new in Drools 6 - London JBUG 2013

Backward Chaining100

rule "go4"when String( this == "go4" ) isContainedIn(thing, "Office"; )then System.out.println( "thing " + thing + " is in the Office" );end

ksession.insert( "go4" );ksession.fireAllRules();---go4thing Key is in the Officething Computer is in the Officething Draw is in the Officething Desk is in the Officething Chair is in the Office

Finds all Things in the office, but directly and transitively.

Out Var (unbound)

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Monday, 5 August 13

Page 99: What's new in Drools 6 - London JBUG 2013

Backward Chaining101

rule "go5"when String( this == "go5" ) isContainedIn(thing, location; )then System.out.println( "thing " + thing + " is in " + location );end

ksession.insert( "go5" );ksession.fireAllRules();---go5thing Knife is in Housething Cheese is in Housething Key is in Housething Computer is in Housething Draw is in Housething Desk is in Housething Chair is in Housething Key is in Officething Computer is in Officething Draw is in Officething Key is in Deskthing Office is in House

Find all things in all things.

Out Var (unbound) Out Var

(unbound)

thing Computer is in Deskthing Knife is in Kitchenthing Cheese is in Kitchenthing Kitchen is in Housething Key is in Drawthing Draw is in Deskthing Desk is in Officething Chair is in Office

House

Location("Office", "House ")

Location("Kitchen", "House")

Location("Desk", "Office")

Location("Chair", "Office")

Location("Computer", "Desk")

Location("Draw", "Desk")

Location("Knife", "Kitchen")

Location("Cheese", "Kitchen")

Location("Key", "Draw")

Monday, 5 August 13

Page 100: What's new in Drools 6 - London JBUG 2013

102

UF UberFirehttps://www.youtube.com/watch?v=ckAznbOOV-4

Monday, 5 August 13

Page 101: What's new in Drools 6 - London JBUG 2013

103

Features• Compile time composition of plugins

• modular components, each separate maven module.• Lightweight• Decoupled components• Layout Manager and Perspectives• Embeddable/Reusable (*)• Unified API

• Security• I/O

• VFS• Metadata• Menus, Toolbars, Panels, etc.

• Standard Life Cycle

UF UberFire

Monday, 5 August 13

Page 102: What's new in Drools 6 - London JBUG 2013

UberFire104

@Dependent@WorkbenchScreen(identifier = "MyFirstPanel")public class MyFirstPanel {

private final FlowPanel panel = new FlowPanel();

@PostConstruct private void init() { final Label label = new Label();

label.setText("Hello World!");

panel.add(label); }

@WorkbenchPartTitle public String myTitle() { return "My First and Cool Panel!"; }

@WorkbenchPartView public IsWidget getView() { return panel; }

}

Monday, 5 August 13

Page 103: What's new in Drools 6 - London JBUG 2013

Proof is in the Pudding

•UI Rewrite started in November•Entire BRMS ported•New BPMS built, all integrated•Tasks, Calendars, BPM Designer•Only one person on core UI framework•All team memebers distributed•Despite aggressive schedule•Code remains modular•Easy to maintan and extend•No one is complaining yet :)

105

UF UberFire

Monday, 5 August 13

Page 104: What's new in Drools 6 - London JBUG 2013

106Questions?Questions?

• Dave Bowman: All right, HAL; I'll go in through the emergency airlock.

• HAL: Without your space helmet, Dave, you're going to find that rather difficult.

• Dave Bowman: HAL, I won't argue with you anymore! Open the doors!

• HAL: Dave, this conversation can serve no purpose anymore. Goodbye.

Joshya: Greetings, Professor Falken.Falken: Hello, Joshua.Joshya: A strange game. The only winning move is not to play. How about a nice game of chess?

Monday, 5 August 13