Rule Templates do not completely ignore single commented lines which are invalid
Issue
- This issue is related to the capabilities of
Drools compilerto ignoreSingle line commentinRule Templatefiles. Imagine there is aRule Templatewhich 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
headerinformation 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 doesDrools compilerthrows this issue?
Environment
- Red Hat JBoss BRMS (BRMS)
- 6.1.0
Subscriber exclusive content
A Red Hat subscription provides unlimited access to our knowledgebase of over 48,000 articles and solutions.
Welcome! Check out the Getting Started with Red Hat page for quick tours and guides for common tasks.
