[jboss-jira] [JBoss JIRA] (DROOLS-3583) A comment creates an infinite loop
Osira Ben (Jira)
issues at jboss.org
Wed Jan 30 07:58:05 EST 2019
Osira Ben created DROOLS-3583:
---------------------------------
Summary: A comment creates an infinite loop
Key: DROOLS-3583
URL: https://issues.jboss.org/browse/DROOLS-3583
Project: Drools
Issue Type: Bug
Affects Versions: 7.16.0.Final
Reporter: Osira Ben
Assignee: Mario Fusco
This rule file makes the engine stuck in an infinite loop.
{code:drools}
package com.example
declare Counter
value: int
end
rule "Init" when
not Counter()
then
drools.insert(new Counter(0));
end
rule "Loop"
when
c: Counter()
then
// removing this comment line removes the loop
c.setValue(1);
update(c);
end
{code}
But the loop is not an issue.
The issue is that if the commented line is removed the loop is gone.
This code doesn't cause the loop.
{code:drools}
package com.example
declare Counter
value: int
end
rule "Init" when
not Counter()
then
drools.insert(new Counter(0));
end
rule "Loop"
when
c: Counter()
then
c.setValue(1);
update(c);
end
{code}
Java code used to run the engine.
{code:java}
public class DroolsLoopingTest {
public static class LoopError extends RuntimeException {
}
public static void main(String[] args) {
System.setProperty("drools.dump.dir", ".");
final KieServices ks = KieServices.Factory.get();
final KieRepository kr = ks.getRepository();
final KieFileSystem kfs = ks.newKieFileSystem();
kfs.write("src/main/resources/loop.drl", new ClassPathResource("loop.drl"));
final KieBuilder kb = ks.newKieBuilder(kfs);
kb.buildAll();
if (kb.getResults().hasMessages(Message.Level.ERROR))
throw new RuntimeException(kb.getResults().toString());
final KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId());
KieSession kSession = kContainer.newKieSession();
kSession.addEventListener(new DefaultAgendaEventListener() {
private int i = 0;
@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
System.out.println(event);
if (++i > 10) throw new LoopError();
}
});
try {
kSession.fireAllRules();
throw new RuntimeException("Expected loop error");
} catch (LoopError e) {
System.out.println("Loop detected");
}
}
}
{code}
I noticed a difference in generated code.
The rule file with the comment line generates this code
{code:java}
public static void defaultConsequence(KnowledgeHelper drools, com.example.Counter c, org.kie.api.runtime.rule.FactHandle c__Handle__ ) throws java.lang.Exception { org.kie.api.runtime.rule.RuleContext kcontext = drools;
// removing this comment line removes the loop
c.setValue(1);
{ drools.update( c__Handle__, org.drools.core.util.bitmask.AllSetButLastBitMask.get(), com.example.Counter.class ); };
}
{code}
While the rule file without the comment line generates this code
{code:java}
public static void defaultConsequence(KnowledgeHelper drools, com.example.Counter c, org.kie.api.runtime.rule.FactHandle c__Handle__ ) throws java.lang.Exception { org.kie.api.runtime.rule.RuleContext kcontext = drools;
c.setValue(1);
{ drools.update( c__Handle__, new org.drools.core.util.bitmask.LongBitMask(2L), com.example.Counter.class ); };
}
{code}
Expected result is that comments should not affect engine behavior.
--
This message was sent by Atlassian Jira
(v7.12.1#712002)
More information about the jboss-jira
mailing list