RuntimeException while building KieBase with BRMS 6.2.0

Solution In Progress - Updated -

Environment

  • Red Hat JBoss BRMS
    • 6.2.0

Issue

We are trying to build the KieBase from rule files and loading into memory:

KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem().generateAndWritePomXML(releaseId);
kfs = listFiles(ruleFiles,kfs);
KieBuilder kBuilder = ks.newKieBuilder( kfs );
Results result = kBuilder.buildAll().getResults();

We are getting the following exception:

java.lang.RuntimeException
        at org.drools.compiler.rule.builder.PatternBuilder.rewriteCompositeExpressions(PatternBuilder.java:924)
        at org.drools.compiler.rule.builder.PatternBuilder.rewriteCompositeExpressions(PatternBuilder.java:919)
        at org.drools.compiler.rule.builder.PatternBuilder.rewriteOrExpressions(PatternBuilder.java:893)
        at org.drools.compiler.rule.builder.PatternBuilder.buildExpression(PatternBuilder.java:889)
        at org.drools.compiler.rule.builder.PatternBuilder.buildCcdDescr(PatternBuilder.java:860)
        at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:715)
        at org.drools.compiler.rule.builder.PatternBuilder.processConstraintsAndBinds(PatternBuilder.java:580)
        at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:182)
        at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:146)
        at org.drools.compiler.rule.builder.PatternBuilder.build(PatternBuilder.java:127)
        at org.drools.compiler.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:63)
        at org.drools.compiler.rule.builder.RuleBuilder.build(RuleBuilder.java:97)
        at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addRule(KnowledgeBuilderImpl.java:1820)
        at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileRules(KnowledgeBuilderImpl.java:1111)
        at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileAllRules(KnowledgeBuilderImpl.java:989)
        at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildRules(CompositeKnowledgeBuilderImpl.java:257)
        at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildPackages(CompositeKnowledgeBuilderImpl.java:121)
        at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:105)
        at org.drools.compiler.kie.builder.impl.AbstractKieModule.buildKnowledgePackages(AbstractKieModule.java:241)
        at org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:64)
        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:230)
        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:198)

I debugged the source code and found out that a rule similar to the following was causing the issue:

rule R when
    $p : Person( name == null || (name in ("Alice", "Charlie", "David"))==false )
then
     list.add($p.getName());
end

The same code and the same rule was working fine in BRMS 6.1.

Resolution

  • Rewrite the conditional element to use valid DRL syntax with not in instead:
    $p : Person( name == null || (name not in ("Alice", "Charlie", "David")) )
  • Upgrade to BRMS 6.2.2 patch release (once available)

Root Cause

The reported syntax is not a valid DRL syntax. The only accepted syntaxes are

x in ("foo", "bar") 
x not in ("foo", "bar")

The RuntimeException, however, is a bug in the BRMS 6.2.0 codebase1. The fix for this issue is planned to be included in BRMS 6.2.2 patch release.

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Close

Welcome! Check out the Getting Started with Red Hat page for quick tours and guides for common tasks.