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

Drools invokes superclass static method

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • 6.1.0.Beta1
    • None
    • None
    • None

      For a very simple rule, with same parameter, the result is sometimes different.

      Drools invokes superclass static method.

      package test;
      
      public class ARef {
          private String ref;
      
          protected ARef(String ref) {
              this.ref = ref;
          }
      
          public static ARef valueOf(String ref) {
              System.out.println("ARef> " + ref);
              return new ARef(ref);
          }
      
          @Override
          public String toString() {
              return ref;
          }
      
          @Override
          public int hashCode() {
              final int prime = 31;
              int result = 1;
              result = prime * result + ((ref == null) ? 0 : ref.hashCode());
              return result;
          }
      
          @Override
          public boolean equals(Object obj) {
              if (this == obj) return true;
              if (obj == null) return false;
              if (getClass() != obj.getClass()) return false;
              ARef other = (ARef) obj;
              if (ref == null) {
                  if (other.ref != null) return false;
              } else if (!ref.equals(other.ref)) return false;
              return true;
          }
      }
      
      package test;
      
      public class BRef extends ARef {
          private BRef(String ref) {
              super(ref);
          }
      
          public static BRef valueOf(String ref) {
              System.out.println("BRef> " + ref);
              return new BRef(ref);
          }
      }
      
      package test;
      
      public class Criteria {
          private BRef ref;
      
          private boolean ok = false;
      
          public Criteria(BRef ref) {
              this.ref = ref;
          }
      
          public BRef getRef() {
              return ref;
          }
      
          public boolean isOk() {
              return ok;
          }
      
          public void setOk() {
              this.ok = true;
          }
      }
      
      package test;
      
      import java.io.StringReader;
      
      import org.drools.RuleBase;
      import org.drools.RuleBaseFactory;
      import org.drools.StatelessSession;
      import org.drools.compiler.PackageBuilder;
      import org.drools.rule.Package;
      
      public class Test {
          private static final String DRL = "package test\r\n" + "dialect \"mvel\"\r\n" + "import test.*;\r\n" + "rule \"myRule\"\r\n" + "when\r\n"
                  + "  criteria:Criteria(ref == BRef.valueOf(\"toto\"))\r\n" + "then\r\n" + "  criteria.setOk();\r\n" + "end";
      
          public static void main(String[] args) {
              System.out.println(DRL);
              try {
                  PackageBuilder builder = new PackageBuilder();
                  builder.addPackageFromDrl(new StringReader(DRL));
                  Package pkg = builder.getPackage();
                  RuleBase ruleBase = RuleBaseFactory.newRuleBase();
                  ruleBase.addPackage(pkg);
      
                  for (int i = 0; i < 1000; i++) {
                      Criteria criteria = new Criteria(BRef.valueOf("toto"));
      
                      StatelessSession session = ruleBase.newStatelessSession();
                      session.execute(criteria);
      
                      System.out.println("[" + i + "] " + criteria.isOk());
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      

      Output:

      package test
      dialect "mvel"
      import test.*;
      rule "myRule"
      when
        criteria:Criteria(ref == BRef.valueOf("toto"))
      then
        criteria.setOk();
      end
      BRef> toto
      BRef> toto
      BRef> toto
      [0] true
      BRef> toto
      BRef> toto
      [1] true
      BRef> toto
      BRef> toto
      [2] true
      ...
      BRef> toto
      ARef> toto
      [109] false
      BRef> toto
      ARef> toto
      [110] false
      ...
      BRef> toto
      ARef> toto
      [998] false
      BRef> toto
      ARef> toto
      [999] false
      

              mfusco@redhat.com Mario Fusco
              michael.mathieu_jira Michaƫl Mathieu (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Created:
                Updated:
                Resolved: