[
https://issues.jboss.org/browse/DROOLS-410?page=com.atlassian.jira.plugin...
]
RH Bugzilla Integration commented on DROOLS-410:
------------------------------------------------
Mario Fusco <mfusco(a)redhat.com> changed the Status of [bug
1057550|https://bugzilla.redhat.com/show_bug.cgi?id=1057550] from ASSIGNED to MODIFIED
Drools invokes superclass static method
---------------------------------------
Key: DROOLS-410
URL:
https://issues.jboss.org/browse/DROOLS-410
Project: Drools
Issue Type: Bug
Security Level: Public(Everyone can see)
Reporter: Michaƫl Mathieu
Assignee: Mario Fusco
Fix For: 6.1.0.Beta1
For a very simple rule, with same parameter, the result is sometimes different.
Drools invokes superclass static method.
{code}
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;
}
}
{code}
{code}
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);
}
}
{code}
{code}
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;
}
}
{code}
{code}
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();
}
}
}
{code}
Output:
{code}
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
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:
http://www.atlassian.com/software/jira