Uploaded image for project: 'Drools'
  1. Drools
  2. DROOLS-76

Incorrect parsing of negative integers in decision tables resulting in NumberFormatException

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • 6.0.0.Alpha9
    • 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

            etirelli@redhat.com Edson Tirelli
            syargey Syargey Z (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: