-
Bug
-
Resolution: Done
-
Major
-
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