[rules-dev] KIE api verbosity

Geoffrey De Smet ge0ffrey.spam at gmail.com
Mon Mar 25 11:56:51 EDT 2013


I've upgraded OptaPlanner to use the KIE api and I have some feedback :)

What I want to do:
*Given of list of DRL's on the classpath, build a KieSession.*

Here's how I did it with the new KIE api:

      public KieBase newKieBase(List<String> scoreDrlList) {
KieServices kieServices = KieServices.Factory.get();
KieResources kieResources = kieServices.getResources();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
             for (String scoreDrl : scoreDrlList) {
                 InputStream scoreDrlIn = 
getClass().getResourceAsStream(scoreDrl);
                 // TODO newClassPathResource() instead, but that breaks 
(mfusco is looking at it)
                 String path = 
"src/main/resources/optaplanner-kie-namespace/" + scoreDrl;
                 kieFileSystem.write(path, 
kieResources.newInputStreamResource(scoreDrlIn, "UTF-8"));
             }
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
             kieBuilder.buildAll();
Results results = kieBuilder.getResults();
             if (results.hasMessages(Message.Level.ERROR)) {
                 throw new IllegalStateException("There are errors in 
the scoreDrl's:\n"
                         + results.toString());
             } else if (results.hasMessages(Message.Level.WARNING)) {
                 logger.warn("There are warning in the scoreDrl's:\n"
                         + results.toString());
             }
KieContainer kieContainer = 
kieServices.newKieContainer(kieBuilder.getKieModule().getReleaseId());
KieBase kieBase = kieContainer.getKieBase();
             return kieBase;
      }

      public KieSession newKieSession() {
             ...
             KieSession kieSession = kieBase.newKieSession();
             return kieSession;
      }

*Feedback* (note: these are suggestions, not demands):

1) To do this, I needed to get acquainted with 9 new concepts:
     KieServices, KieResources, KieFileSystem, KieBuilder, Results, 
KieModule, KieContainer, KieBase, KieSession.
I only care about 2 of those:
- KieSession
- KieBase (= the factory to build a new KieSession, which I do regularly).
The other 7 concepts probably represent wonderful advanced features 
which I might want to use later on,
so they should exist,
But in a simple use case like this, I should not have to see them or 
deal with them.

2) The kie filesystem features leaks into the simple api, even if I 
don't care about the KieFileSystem at all.
- I should not explicitly need to create a KieFileSystem:
     KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
- Adding certain Resource types fails if you don't specify the 
fileSystem's path. This fails for example:
     kieFileSystem.write(kieResources.newInputStreamResource(...));
- For the default KieBase to work, the path needs to start with a 
magical prefix
     String path = "src/main/resources/.../" + ...;

3) To create a KieBase from that kieFileSystem, I need to explicitly do 
5+ calls, in the right order:
- call kieServices.newKieBuilder(...)
- call kieBuilder.buildAll()
- call kieBuilder.getKieModule()
- call kieServices.newKieContainer(...)
- call kieContainer.getKieBase()
Some of these have non-obvious parameters.
I'd rather just call:
   kieFileSystem.buildKieBase()

4) I don't like having to write the boilerplate code to check if the are 
errors:
   if (results.hasMessages(Message.Level.ERROR)) {...}
If there are errors, then kieFileSystem.buildKieBase() should just throw 
a DroolsRuntimeException.

*Solution* proposal:

A) Write a facade class that presumes there is only 1 module and the 
user doesn't need (or want to) to access any of those 7 other concepts.

     public KieBase newKieBase(List<String> scoreDrlList) {
         KieBaseFactory kieBaseFactory = kieServices.newKieBaseFactory();
         for (String scoreDrl : scoreDrlList) {
            kieBaseFactory.addInputStreamResource(scoreDrl, "UTF-8");
         }
         return kieBaseFactory.buildKieBase; // throws exception upon 
compilation error
     }

Mario's KieHelper is similar, but slightly different.

wkr,
Geoffrey

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20130325/e80866a1/attachment.html 


More information about the rules-dev mailing list