I reached a point where I need to make a design decision and would like your opinion about it.
   Imagine the following scenario:

   A user has a domain model like this:

package a.b.c ;
public interface Event { ... }

package x.y.z;
public class MyEvent implements a.b.c.Event {...}

   Then, in his DRL file he writes:

package p.q.r;
import event a.b.c.*;  
rule X
    Event( ... )

   So, it is clear that a.b.c.Event should be handled as an event by the engine.
   At runtime, the user asserts an object of the class x.y.z.MyEvent into the working memory. Seems clear to me (and probably to the user) that MyEvent should be handled as an event, since by DRL semantics, a.b.c.* are all events, and by OO class hierarchy concept, since a.b.c.Event is an event, x.y.z.MyEvent is an event too.

   My question is: how the engine knows that MyEvent is an event, since it only has the x.y.z.MyEvent class as input?
   The only answer I have is that when the first MyEvent instance is asserted into the working memory, we must get the class name and iterate over all event import declarations checking for a match. In case no one is found, we need to repeat the process for each interface and each class up in the MyEvent hierarchy. Once this process is complete, we cache the results in the ObjectTypeConf.
   This may be a quite heavy process to be executed each time a fact of a different class is asserted in the working memory for the first time, but I can't think a different user-friendly way to solve the question.

   The alternatives would be intrusive, IMO, breaking the drools premise to work with user-defined POJOs as facts: use anotations to annotate classes that are events, or mandate users implement a specific interface for events.

    Any better idea?



  Edson Tirelli
  Software Engineer - JBoss Rules Core Developer
  Office: +55 11 3529-6000
  Mobile: +55 11 9287-5646
  JBoss, a division of Red Hat @