-
Bug
-
Resolution: Done
-
Major
-
5.5.0.Final
-
None
-
None
Since Drools 5.5.0 negative integers parsing in decision tables causes NumberFormatException.
The source code of project is attached.
The stack trace:
java.lang.NumberFormatException: For input string: "-1.0"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at org.drools.base.FieldFactory.getFieldValue(FieldFactory.java:142)
at org.drools.rule.builder.PatternBuilder.getFieldValue(PatternBuilder.java:1389)
at org.drools.rule.builder.PatternBuilder.addConstraintToPattern(PatternBuilder.java:765)
at org.drools.rule.builder.PatternBuilder.addConstraintToPattern(PatternBuilder.java:736)
at org.drools.rule.builder.PatternBuilder.buildRelationalExpression(PatternBuilder.java:721)
at org.drools.rule.builder.PatternBuilder.buildExpression(PatternBuilder.java:673)
at org.drools.rule.builder.PatternBuilder.buildCcdDescr(PatternBuilder.java:657)
at org.drools.rule.builder.PatternBuilder.build(PatternBuilder.java:629)
at org.drools.rule.builder.PatternBuilder.processConstraintsAndBinds(PatternBuilder.java:477)
at org.drools.rule.builder.PatternBuilder.build(PatternBuilder.java:302)
at org.drools.rule.builder.PatternBuilder.build(PatternBuilder.java:123)
at org.drools.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:67)
at org.drools.rule.builder.RuleBuilder.build(RuleBuilder.java:84)
at org.drools.compiler.PackageBuilder.addRule(PackageBuilder.java:2830)
at org.drools.compiler.PackageBuilder.compileRules(PackageBuilder.java:970)
at org.drools.compiler.PackageBuilder.compileAllRules(PackageBuilder.java:879)
at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:871)
at org.drools.compiler.PackageBuilder.addPackageFromDecisionTable(PackageBuilder.java:447)
at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:711)
at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:51)
at com.sample.DecisionTableTest.readKnowledgeBase(DecisionTableTest.java:51)
at com.sample.DecisionTableTest.main(DecisionTableTest.java:28)
java.lang.NumberFormatException: For input string: "-1.0"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at org.mvel2.conversion.IntegerCH$4.convert(IntegerCH.java:80)
at org.mvel2.conversion.IntegerCH.convertFrom(IntegerCH.java:41)
at org.mvel2.DataConversion.convert(DataConversion.java:129)
at org.mvel2.ast.BinaryOperation.<init>(BinaryOperation.java:76)
at org.mvel2.util.CompilerTools.finalizePayload(CompilerTools.java:118)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:287)
at org.mvel2.compiler.ExpressionCompiler.compile(ExpressionCompiler.java:62)
at org.mvel2.MVEL.compileExpression(MVEL.java:810)
at org.drools.base.mvel.MVELCompilationUnit.compile(MVELCompilationUnit.java:435)
at org.drools.base.mvel.MVELCompilationUnit.getCompiledExpression(MVELCompilationUnit.java:238)
at org.drools.rule.constraint.MvelConstraint.createMvelConditionEvaluator(MvelConstraint.java:206)
at org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:190)
at org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157)
at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:137)
at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:497)
at org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:382)
at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:235)
at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:240)
at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:350)
at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:311)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:903)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:847)
at org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:269)
at com.sample.DecisionTableTest.main(DecisionTableTest.java:35)
The problem exists in org.drools.decisiontable.parser.xls.ExcelParser:
if (cell.getType() == CellType.NUMBER) { NumberCell nc = (NumberCell) cell; num = nc.getValue(); } if ( Math.abs(num) - Math.ceil(num) != 0 ) { newCell(listeners, i, cellNum, String.valueOf(num), DataListener.NON_MERGED ); } else { newCell( listeners, i, cellNum, cell.getContents(), DataListener.NON_MERGED ); }
The condition "Math.abs(-1.0) - Math.ceil(-1.0) != 0" is true, so a cell with String.valueOf(-1.0) is created, resulting to: java.lang.NumberFormatException: For input string: "-1.0"
The error is not reproduced with Drools 5.3.0