Today was an exercise in frustration, but it was ultimately successful.
Every time I removed one dependency problem, another would raise its head. Some of the modules in Kowari have dependencies I'd never considered, and it was amazing just how many of these I had to deal with. Finally, I seemed to have them all under control, only to discover a new problem.
I've been reading data out of the
kowari-config.xml file for some time, but I'd never tried to add to it. To start with, I naïvely thought that I could just add a new tag, and the code would automatically see it. This is not the case. I believe that Castor (the site is down ATM, but Google cached it just yesterday, so it can't be far away) is capable of just reading from an XML file and building an interface to what it finds, but that is not the configuration being used in Kowari. Instead, it uses an XSD file to describe the structure, and it builds the interface from that. At one point it was a DTD file and that is still to be found, but that is no longer used, and has fallen well behind.
Thanks to Simon for helping me find this schema.
I still had problems though, as my changes did not seem to be working. I added the new
RuleLoader element, but nothing came up in the automatically generated Castor file. After a while I discovered that the field had resulted in it's own class files (
RuleLoaderDescriptor.java), but the field was still not showing up in the
TucanaConfig class. Finally, I worked out what was missing in the XSD file. The
TucanaConfig element wraps a list of references to other elements. All I had to do was enter a reference to the
RuleLoader element, and it finally appeared in the
One other thing that bothered me was when I tried to pass a session into the
run() method of the rules engine. The rules interface can't know about sessions (because of dependency issues), so I thought I'd take the easy way out and pass it as an
Object. However, for some reason the compiler refused to let me do this.
It's late, so maybe I missed something, but I got around this by providing a simple wrapper class for passing parameters to a rule framework for running. After all, different framework types might have difference requirements, so a generic way of passing parameters is probably a good thing. :-)
Monday, May 23, 2005