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

NoSuchElementException on addKnowledgePackages when a "not" follows an "eval"

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • None
    • 5.5.0.Final
    • None
    • None

      I apologize if this has already been reported, but I did not see anything in search results for which this looked like a duplicate.

      With the following 2 rules, compiling the first and adding it to a knowledge base causes subsequent package additions to fail with a NoSuchElementException.

      rule "Problem"
      when
      eval(true == true)
      not String() from "Problem"
      then
      end

      rule "Test1"
      when
      $test : String() from "Test"
      then
      end

      The following java code will produce the exception on the second call to addKnowledgePackages (tried with Drools 5.4 and 5.5)

      package com.chiprewards.droolsbug;
      
      import org.drools.KnowledgeBase;
      import org.drools.KnowledgeBaseFactory;
      import org.drools.builder.KnowledgeBuilder;
      import org.drools.builder.KnowledgeBuilderErrors;
      import org.drools.builder.KnowledgeBuilderFactory;
      import org.drools.io.Resource;
      import org.drools.builder.ResourceType;
      import org.drools.io.ResourceFactory;
      
      /**
       * Hello world!
       *
       */
      public class App 
      {
          public static void main( String[] args )
          {        
              KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
              KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
              
              String problem_rule = "rule \"Problem\"\n  when\n    eval(true == true)\n    not String() from \"Problem\"\n  then\nend";
              
              Resource resource = ResourceFactory.newByteArrayResource(problem_rule.getBytes());
              kbuilder.add(resource, ResourceType.DRL);
              if(kbuilder.hasErrors()) {
                  System.out.println("First rule had error parsing");
                  System.exit(1);
              }
              
              kBase.addKnowledgePackages(kbuilder.getKnowledgePackages());
              
              //Add second rule
              
              String next_rule = "rule \"Test\"\n  when\n    String() from \"Test\"\n  then\nend";
              
              resource = ResourceFactory.newByteArrayResource(next_rule.getBytes());
              kbuilder.add(resource, ResourceType.DRL);
              if(kbuilder.hasErrors()) {
                  System.out.println("Second rule had error parsing");
                  System.exit(1);
              }
              
              kBase.addKnowledgePackages(kbuilder.getKnowledgePackages());       
          }
      }
      

            mproctor@redhat.com Mark Proctor
            jason.saint.chiprewards.com Jason Saint (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: