[jboss-jira] [JBoss JIRA] (DROOLS-770) Query order can to lead to a NPE

Mario Fusco (JIRA) issues at jboss.org
Tue Aug 11 13:32:03 EDT 2015


     [ https://issues.jboss.org/browse/DROOLS-770?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Mario Fusco reassigned DROOLS-770:
----------------------------------

    Assignee: Mario Fusco  (was: Mark Proctor)


> Query order can to lead to a NPE
> --------------------------------
>
>                 Key: DROOLS-770
>                 URL: https://issues.jboss.org/browse/DROOLS-770
>             Project: Drools
>          Issue Type: Bug
>            Reporter: Jonathan MERCIER
>            Assignee: Mario Fusco
>            Priority: Critical
>
> This bug is already reported to the drools team via email on 13th february.
> To follow efficiently any progress on this critical bug, I open a ticket.
> So, the reproducer code is:
> {code:java|title=NpeOnQueryTest|borderStyle=solid}
> package org.drools.compiler.integrationtests;
> import org.junit.Test;
> import org.kie.api.io.ResourceType;
> import org.kie.api.runtime.KieSession;
> import org.kie.internal.utils.KieHelper;
> import java.util.List;
> public class NpeOnQueryTest {
>     @Test
>     public void test() {
>         String drl =
>                 "import " + FiveState.class.getCanonicalName() + ";\n" +
>                 "import " + NodeType.class.getCanonicalName() + ";\n" +
>                 "import " + Knowledge.class.getCanonicalName() + ";\n" +
>                 "import " + List.class.getCanonicalName() + ";\n" +
>                 "\n" +
>                 "rule \"Or Knowledge is unknown\"\n" +
>                 "    when\n" +
>                 "        $k: Knowledge( presence == FiveState.UNEVALUATED, nodeType == NodeType.OR )\n" +
>                 "        allSubKnowledgeAreEvaluated( $k, $childs; )\n" +
>                 "        not( Knowledge( presence == FiveState.TRUE ) )\n" +
>                 "    then\n" +
>                 "        modify( $k ){\n" +
>                 "            setPresence( FiveState.UNKNOWN )\n" +
>                 "        }\n" +
>                 "end\n" +
>                 "\n" +
>                 "rule \"Or Knowledge is present\"\n" +
>                 "    when\n" +
>                 "        $k: Knowledge( presence == FiveState.UNEVALUATED, nodeType == NodeType.OR )\n" +
>                 "        allSubKnowledgeAreEvaluated( $k, $childs; )\n" +
>                 "    then\n" +
>                 "        modify( $k ){\n" +
>                 "            setPresence( FiveState.TRUE )\n" +
>                 "        }\n" +
>                 "end\n" +
>                 "\n" +
>                 "query allSubKnowledgeAreEvaluated( Knowledge parent, List childs )\n" +
>                 "    childs:= List() from collect ( Knowledge( parent memberOf partOf ))\n" +
>                 "    forall( Knowledge( presence != FiveState.UNEVALUATED ) from childs )\n" +
>                 "end\n";
>         KieSession ksession = new KieHelper().addContent(drl, ResourceType.DRL)
>                                      .build()
>                                      .newKieSession();
>         Knowledge bk0 = new Knowledge(new Knowledge[0], NodeType.OR, "bk0", FiveState.UNEVALUATED);
>         Knowledge bk1 = new Knowledge(new Knowledge[] { bk0 }, NodeType.LEAF, "bk1", FiveState.TRUE);
>         ksession.insert( bk0 );
>         ksession.insert( bk1 );
>         ksession.fireAllRules();
>     }
>     public enum FiveState {
>         TRUE,
>         FALSE,
>         BOTH,
>         UNKNOWN,
>         UNEVALUATED
>     }
>     public enum NodeType {
>         LEAF,
>         AND,
>         OR
>     }
>     public static class Knowledge {
>         private final Knowledge[] partOf;
>         private final NodeType nodeType;
>         private final String name;
>         private FiveState presence;
>         public Knowledge(Knowledge[] partOf, NodeType nodeType, String name, FiveState presence) {
>             this.partOf = partOf;
>             this.nodeType = nodeType;
>             this.name = name;
>             this.presence = presence;
>         }
>         public void setPresence(final FiveState presence) {
>             this.presence = presence;
>         }
>         public String getName() {
>             return name;
>         }
>         public FiveState getPresence() {
>             return presence;
>         }
>         public NodeType getNodeType() {
>             return nodeType;
>         }
>         public Knowledge[] getPartOf() {
>             return partOf;
>         }
>     }
> }
> {code}
>  
> The interesting thing to be noticed is that if I move the query before the 2 rules in that DRL the problem disappears.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)


More information about the jboss-jira mailing list