I was experimenting with ways of avoiding having to put literal strings 
into my rules (it is very fragile and bugs can be silent for a long 
time). I tried declaring a global and then tried supplying it to a 
query. This generates a backtrace during the newKieSession. A simple 
example to provoke the problem:


             KieServices ks = KieServices.Factory.get();
             KieContainer kContainer = ks.getKieClasspathContainer();
             KieSession kSession = 
kContainer.newKieSession("ksession-rules");

             kSession.setGlobal("AString", "Hello World");

             kSession.fireAllRules();



package com.sample

global java.lang.String AString;

declare Thing
     name: String @key
end

rule init
     when
     then
         insert( new Thing( AString ) );
end

query test(String $in)
     Thing( $in; )
end

rule spot
     when
         test( "Hello World"; )
         Thing( "Hello World"; )
         test( AString; )
         Thing( AString; )
     then
         System.out.println("found msg\n");
end


java.lang.NullPointerException
     at 
org.drools.core.rule.LogicTransformer.processElement(LogicTransformer.java:243)
     at 
org.drools.core.rule.LogicTransformer.processElement(LogicTransformer.java:263)
     at 
org.drools.core.rule.LogicTransformer.fixClonedDeclarations(LogicTransformer.java:134)
     at 
org.drools.core.rule.LogicTransformer.transform(LogicTransformer.java:99)
     at 
org.drools.core.definitions.rule.impl.RuleImpl.getTransformedLhs(RuleImpl.java:560)
     at 
org.drools.core.reteoo.builder.ReteooRuleBuilder.addRule(ReteooRuleBuilder.java:105)
     at org.drools.core.reteoo.ReteooBuilder.addRule(ReteooBuilder.java:100)
     at 
org.drools.core.impl.KnowledgeBaseImpl.addRule(KnowledgeBaseImpl.java:1455)
     at 
org.drools.core.impl.KnowledgeBaseImpl.addRule(KnowledgeBaseImpl.java:1435)
     at 
org.drools.core.impl.KnowledgeBaseImpl.addPackages(KnowledgeBaseImpl.java:838)
     at 
org.drools.core.impl.KnowledgeBaseImpl.addKnowledgePackages(KnowledgeBaseImpl.java:266)
     at 
org.drools.compiler.kie.builder.impl.KieContainerImpl.createKieBase(KieContainerImpl.java:412)
     at 
org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:346)
     at 
org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:498)
     at 
org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:469)
     at com.sample.DroolsTest.main(DroolsTest.java:17)


The 3rd action in the spot rule causes the null exception during 
initialise, if it is present. Comment out just that line and no 
exceptions happen and behaviour is as expected.

Are globals permitted in the way I am trying to use them, as a parameter 
to a query?

Borris




_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to