I'm pretty sure that this is a bug. When compiling a DRL from a Chenge Set, the resulting package
in the Knowledge Base does not contain declare'd types that do not contain fields; it only contains declares with at least one field.

This results in a ClassObjectTypeConf with a typeDecl == null, and the damage is done.

I'd say that this is a show stopper for any combination of ChangeSet / Pojo as Event.

-W


On 12 July 2011 19:32, John <jfullard@progeny.net> wrote:
Hello,

I've been messing with this for days now and can't get to the bottom of
this.  I'm using drools 5.2.0 Final and setting up my KnowledgeBase with a
KnowledgeAgent which is pulling a package from guvnor (also 5.2.0 Final).  I
do NOT get this error if I use a KnowledgeBuilder and add the exact same drl
file as a resource.

If the DRL in guvnor has a rule that uses a sliding window, i get an NPE
when trying to insert an object and the following stack trace:

java.lang.NullPointerException
       at
org.drools.reteoo.ReteooFactHandleFactory.newFactHandle(ReteooFactHandleFactory.java:56)
       at
org.drools.common.AbstractFactHandleFactory.newFactHandle(AbstractFactHandleFactory.java:80)
       at
org.drools.common.AbstractFactHandleFactory.newFactHandle(AbstractFactHandleFactory.java:65)
       at org.drools.common.NamedEntryPoint.createHandle(NamedEntryPoint.java:705)
       at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:282)
       at
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:905)
       at
org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:864)
       at
org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:255)
       at john.DroolsError.runRules(DroolsError.java:48)
       at john.DroolsError.main(DroolsError.java:40)

Here is the DRL:

1.      |       package drools
2.      |       import simple.SimpleType
3.      |
4.      |
5.      |
6.      |
7.      |
8.      |
9.      |       import simple.SimpleType;
10.     |
11.     |       declare SimpleType
12.     |           @role(event)
13.     |       end
14.     |
15.     |       rule "timer"
16.     |       timer (cron:5/5 * * * * ?)
17.     |       when
18.     |           $newest : Number()
19.     |               from accumulate( SimpleType ($num : number) over
window:time(5s),
20.     |                   max($num) )
21.     |           $st : SimpleType( number == $newest.intValue )
22.     |       then
23.     |           System.out.println("SimpleType: " + $st.number);
24.     |       end
(note: the first import of simple.SimpleType comes from the package
configuration in guvnor, the second is in the drl file itself. the file will
not validate without the import explicitly listed there, saying the type is
not declared as an event...)

Here is the Java code:

ResourceChangeScannerConfiguration sconf = ResourceFactory
                               .getResourceChangeScannerService()
                               .newResourceChangeScannerConfiguration();
               sconf.setProperty("drools.resource.scanner.interval", "20");
               ResourceFactory.getResourceChangeScannerService().configure(sconf);

               KnowledgeBaseConfiguration config = KnowledgeBaseFactory
                               .newKnowledgeBaseConfiguration();
               config.setOption(EventProcessingOption.STREAM);

               KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory
                               .newKnowledgeAgentConfiguration();
               aconf.setProperty("drools.agent.scanDirectories", "true");
               aconf.setProperty("drools.agent.scanResources", "true");
               aconf.setProperty("drools.agent.newInstance", "false");
               KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(config);
               KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
                               "drools agent", kbase, aconf);

               String urlString =
"http://localhost:8080/drools-guvnor/org.drools.guvnor.Guvnor/package/drools/LATEST/ChangeSet.xml";
               try {
                       URL url = new URL(urlString);
                       UrlResource urlResource = (UrlResource) ResourceFactory
                                       .newUrlResource(url);
                       urlResource.setBasicAuthentication("enabled");
                       urlResource.setUsername("John");
                       urlResource.setPassword("");
                       kagent.applyChangeSet(urlResource);
               } catch (Exception e) {
                       System.out.println("Caught exception: " + e.getMessage());
                       e.printStackTrace();
               }

               ResourceFactory.getResourceChangeNotifierService().start();
               ResourceFactory.getResourceChangeScannerService().start();

               StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
               System.out.println("Initialize drools complete");

               SimpleType simp = new SimpleType();
               simp.setNumber(5);

               ksession.insert(simp);

Thanks,
John

--
View this message in context: http://drools.46999.n3.nabble.com/NPE-on-fact-insertion-if-rule-has-sliding-window-tp3163261p3163261.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users