[jboss-jira] [JBoss JIRA] (DROOLS-3583) A comment creates an infinite loop
Mario Fusco (Jira)
issues at jboss.org
Mon Dec 16 13:06:49 EST 2019
[ https://issues.redhat.com/browse/DROOLS-3583?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Mario Fusco updated DROOLS-3583:
--------------------------------
Sprint: 2019 Week 50-52 (from Dec 9)
> A comment creates an infinite loop
> ----------------------------------
>
> Key: DROOLS-3583
> URL: https://issues.redhat.com/browse/DROOLS-3583
> Project: Drools
> Issue Type: Bug
> Affects Versions: 7.16.0.Final
> Reporter: Osira Ben
> Assignee: Mario Fusco
> Priority: Minor
>
> 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.13.8#713008)
More information about the jboss-jira
mailing list