Rule Templates do not completely ignore single commented lines which are invalid

Solution Verified - Updated -

Issue

  • This issue is related to the capabilities of Drools compiler to ignore Single line comment in Rule Template files. Imagine there is a Rule Template which has the following template headers defined inside it.
    e.g.
template header
age
type
log
  • However, by mistake users write a template rule which uses a header information which is not listed above. Now, user would definitely want to comment that line so as to ensure that the Drools compiler ignores it.
    e.g.
template "cheesefans"

rule "Cheese fans_@{row.rowNumber}"
dialect "java" 
    when
        $person: Person(age == "@{age}")
        $cheese: Cheese(type == "@{type}")

        // $cheeseInvalid: Cheese(type == "@{typeFault}") 
    ... 
  • Now, if user tries to execute this template inside ExternalSpreadsheetCompiler.compile(..) method it complains with the following exception.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" Exception executing consequence for rule "cheesefans" in org.drools.template.parser: java.lang.RuntimeException: [Error: unable to resolve method: java.util.HashMap.typeFault() [arglength=0]]
[Near : {... rule "Cheese fans_@{row.rowNum ....}]
             ^
[Line: 1, Column: 1]
    at org.drools.core.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
    at org.drools.core.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1125)
    at org.drools.core.phreak.RuleExecutor.fire(RuleExecutor.java:160)
    at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:108)
    at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1016)
    at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1302)
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1289)
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1262)
    at org.drools.template.parser.TemplateDataListener.finishSheet(TemplateDataListener.java:119)
    at org.drools.decisiontable.parser.xls.ExcelParser.finishSheet(ExcelParser.java:244)
    at org.drools.decisiontable.parser.xls.ExcelParser.processSheet(ExcelParser.java:186)
    at org.drools.decisiontable.parser.xls.ExcelParser.parseFile(ExcelParser.java:86)
    at org.drools.decisiontable.ExternalSpreadsheetCompiler.compile(ExternalSpreadsheetCompiler.java:140)
    at org.drools.decisiontable.ExternalSpreadsheetCompiler.compile(ExternalSpreadsheetCompiler.java:168)
    at org.drools.decisiontable.ExternalSpreadsheetCompiler.compile(ExternalSpreadsheetCompiler.java:99)
    at org.drools.decisiontable.ExternalSpreadsheetCompiler.compile(ExternalSpreadsheetCompiler.java:85)
    at org.drools.examples.templates.SimpleRuleTemplateExample.buildKBase(SimpleRuleTemplateExample.java:85)
    at org.drools.examples.templates.SimpleRuleTemplateExample.executeExample(SimpleRuleTemplateExample.java:50)
    at org.drools.examples.templates.SimpleRuleTemplateExample.main(SimpleRuleTemplateExample.java:44)
Caused by: java.lang.RuntimeException: [Error: unable to resolve method: java.util.HashMap.typeFault() [arglength=0]]
[Near : {... rule "Cheese fans_@{row.rowNum ....}]
             ^
[Line: 1, Column: 1]
    at org.drools.template.parser.DefaultGenerator.generate(DefaultGenerator.java:80)
    at org.drools.template.parser.Rule_cheesefans1206731317.defaultConsequence(Rule_cheesefans1206731317.java:7)
    at org.drools.template.parser.Rule_cheesefans1206731317DefaultConsequenceInvokerGenerated.evaluate(Unknown Source)
    at org.drools.template.parser.Rule_cheesefans1206731317DefaultConsequenceInvoker.evaluate(Unknown Source)
    at org.drools.core.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1114)
    ... 17 more
Caused by: [Error: unable to resolve method: java.util.HashMap.typeFault() [arglength=0]]
[Near : {... rule "Cheese fans_@{row.rowNum ....}]
             ^
[Line: 1, Column: 1]
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:1094)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:1003)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(ReflectiveAccessorOptimizer.java:693)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:360)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:163)
    at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)
    at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)
    at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:117)
    at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:42)
    at org.mvel2.MVEL.executeExpression(MVEL.java:930)
    at org.mvel2.MVEL.executeExpression(MVEL.java:991)
    at org.mvel2.templates.res.CompiledIfNode.eval(CompiledIfNode.java:43)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.TerminalNode.eval(TerminalNode.java:35)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:46)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledIfNode.eval(CompiledIfNode.java:44)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.TerminalNode.eval(TerminalNode.java:35)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:46)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledIfNode.eval(CompiledIfNode.java:44)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:46)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.res.TextNode.eval(TextNode.java:42)
    at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:285)
    at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:247)
    at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:255)
    at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:207)
    at org.drools.template.parser.DefaultGenerator.generate(DefaultGenerator.java:73)
    ... 21 more

  • The question is , even user has commented that mistaken line with single line comment (//) , why does Drools compiler throws this issue?

Environment

  • Red Hat JBoss BRMS (BRMS)
    • 6.1.0

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content