[rules-dev] Spring support for drools-api

Mark Proctor mproctor at codehaus.org
Tue Nov 25 11:02:01 EST 2008


I'm going to get the basics done, then I'm really hoping that you or 
paul or someone else will pick up the rest and polish it off (like your 
suggestion below) and do javadocs - as I need to get on with core work - 
I'm just trying to get the ball rolling.

I'll try and have something committed today, that you people can roll with.

Mark
Michal Bali wrote:
> Hi,
>
> I think the xml looks good. 
> Spring's PropertyEditors 
> - http://static.springframework.org/spring/docs/2.5.x/reference/validation.html#beans-beans-conversion could 
> be used to even further simplify it. Using convention over 
> configuration to guess the resource type from file's extension. The 
> configuration will then become:
>
> <bean id="rb1" 
> class="org.drools.ioc.spring.KnowledgeBaseFactoryBean">       
>       <property name="resources">
>           <list>
>              
>  <value>file:src/main/java/org/drools/ioc/spring/testSpring.drl</value>
>              
>  <value>file:src/main/java/org/drools/ioc/spring/IntegrationExampleTest.xls</value>
>           </list>
>       </property>      
> </bean>
>
> I am not that familiar with PropertyEditors to know if this is 
> possible to do or not. I am just throwing it out here, maybe somebody 
> else will know better. It is not that important just nice to have..
>
> Best Regards,
> Michal
>
>
> On Tue, Nov 25, 2008 at 6:07 AM, Mark Proctor <mproctor at codehaus.org 
> <mailto:mproctor at codehaus.org>> wrote:
>
>     This is now what the spring XML looks like:
>       <bean id="rb1"
>     class="org.drools.ioc.spring.KnowledgeBaseFactoryBean">      
>           <property name="resources">
>               <list>
>                   <bean
>     class="org.drools.ioc.spring.KnowledgeResourceFactoryBean">
>
>                       <property name="knowledgeType" value="DRL" />
>                       <property name="source"
>     value="file:src/main/java/org/drools/ioc/spring/testSpring.drl"
>     />                 
>                   </bean>
>                  
>                   <bean
>     class="org.drools.ioc.spring.KnowledgeResourceFactoryBean">
>
>                       <property name="knowledgeType" value="DTABLE" />
>                       <property name="source"
>     value="file:src/main/java/org/drools/ioc/spring/IntegrationExampleTest.xls"
>     />                 
>                       <property name="knowledgeResourceConfiguration">   
>                           <bean
>     class="org.drools.ioc.spring.DTableResourceConfigurationFactoryBean">
>                               <property name="inputType" value="XLS" />
>                           </bean>
>                       </property>
>                   </bean>                     
>               </list>
>           </property>     
>       </bean>
>
>     How is that looking? Most people happy with that, it's very
>     generic. I've dropped the agent side for the moment, just focusing
>     on scripting of a KnowledgeBase via spring. It now more closely
>     follows the KnowedgeBuilder api.  The above spring configuration
>     will return a rulebase of two resources, on is a simple DRL, the
>     other is a decisiontable of type XLS.
>
>     I'll extend this further to make sure that ALL knowledge types can
>     be built for a knowledge base via the spring api. I'll also make
>     sure it can take a KnowledgeBaseConfiguration and
>     KnowledgeBuilderConfiguration. Then I'll also make sure there is a
>     spring configuration to return a stateful or stateless session
>     given a knowlebasefactorybean ref. Finally I might add some basic
>     agent facilities.
>
>     I think this should give spring users everything they need, i.e.
>     the capability to build knowledge bases and wire sessions and
>     knowledge bases to other beans - all via xml.
>
>     Mark
>
>     Mark Proctor wrote:
>>     I'm updating drools-api as we speak, based on the spring Resource
>>     idea. the following Factory will provide a set of ready to go
>>     Resources, that should satisfy most people's needs. So drools-api
>>     will be spimplied to
>>     kbuilder.addResource( Resource, KnowledgeType )
>>     kbuilder.addResource( Resource, KnowledgeType,
>>     ResourceConfiguration )
>>
>>     And the Resources available, and ofcourse people can implement
>>     the interface themselves is:
>>     public class ResourceFactory {
>>      
>>         public static Resource newURLResource(URL url) {
>>             return null;
>>         }
>>      
>>         public static Resource newURLResource(URI uri) {
>>             return null;
>>         }
>>      
>>         public static Resource newURLResource(String url) {
>>             return null;
>>         }    
>>      
>>         public static Resource newFileResource(File file) {
>>             return null;
>>         }
>>      
>>         public static Resource newFileResource(String file) {
>>             return null;
>>         }
>>      
>>      
>>         public static Resource newByteArrayResource(byte[] bytes) {
>>             return null;
>>         }
>>      
>>         public static Resource newInputStreamResource(InputStream stream) {
>>             return null;
>>         }
>>      
>>         public static Resource newReaderResource(Reader reader) {
>>             return null;
>>         }
>>      
>>         public static Resource newReaderResource(Reader reader, String encoding) {
>>             return null;
>>         }  
>>      
>>         public static Resource newClassPathResource(String path) {
>>             return null;
>>         }
>>      
>>         public static Resource newClassPathResource(String path, ClassLoader classLoader) {
>>             return null;
>>         }    
>>
>>     }
>>
>>     It can take a Reader, which underneath will open an InputStream, it'll use default encoding unless the encoding is
>>     specified as otherwise in the alternative param. 
>>
>>     So typically it'll be
>>     kbuilder.addResource( ResourceFactory.newClassPathResource( "some path" ), KnowledgeType.DRL );
>>
>>     don't forget you can import static methods, so it can actually be:
>>     kbuilder.addResource( newClassPathResource( "some path" ), KnowledgeType.DRL );
>>
>>
>>     Mark
>>       
>>
>>
>>
>>     Greg Barton wrote:
>>>     Well, if you look at String.getBytes() it uses the default encoding, then ISO-8859-1 if that fails. (Default is UTF-8 unless otherwise specified in the "file.encoding" property.) As long as that's documented I guess it's not a problem, unless someone wants to specify their own charset for a particular file.  Java 1.6 has String.getBytes(Charset) and that could allow someone to use an alternate charset.
>>>
>>>     I figure for the vast majority of cases it won't be a problem.
>>>
>>>     --- On Sun, 11/23/08, Mark Proctor <mproctor at codehaus.org> <mailto:mproctor at codehaus.org> wrote:
>>>
>>>       
>>>>     From: Mark Proctor <mproctor at codehaus.org> <mailto:mproctor at codehaus.org>
>>>>     Subject: Re: [rules-dev] Spring support for drools-api
>>>>     To: "Rules Dev List" <rules-dev at lists.jboss.org> <mailto:rules-dev at lists.jboss.org>
>>>>     Date: Sunday, November 23, 2008, 9:09 PM
>>>>     I'm thinking of adopting the Spring approach to
>>>>     Resources for 
>>>>     drools-api, obviously not tieing drools-api to spring -
>>>>     just copying the 
>>>>     concept. Resource however doesn't seem to work with
>>>>     Readers. Readers in 
>>>>     general are only needed for in memory generation , using
>>>>     StringReader, 
>>>>     otherwise file/url/classpath resources suffice. So it seems
>>>>     to do the 
>>>>     Spring way you would do a ByteArrayResource( "this is
>>>>     my drl 
>>>>     file".getBytes() ). I'm wondering what people
>>>>     think of that, and what 
>>>>     about encoding issues? Compared to the way at the moment
>>>>     that we just 
>>>>     take a Reader, and that's it.
>>>>
>>>>     Mark
>>>>
>>>>     Mark Proctor wrote:
>>>>         
>>>>>     now my spring skills are improving, I'm looking to
>>>>>           
>>>>     improve the xml and 
>>>>         
>>>>>     leverage spring Resource framework - so that we can
>>>>>           
>>>>     get complete 
>>>>         
>>>>>     scripting of the entire KnowlegeBuilder api. I've
>>>>>           
>>>>     come up with the two 
>>>>         
>>>>>     xmls so far:
>>>>>          <property name="drls">
>>>>>              <list>
>>>>>                  
>>>>>
>>>>>           
>>>>     <value>file:src/main/java/org/drools/ioc/spring/testSpring.drl</value>
>>>>         
>>>>>              </list>       </property>   
>>>>>          <property name="dtables">
>>>>>              <list>
>>>>>                      <bean 
>>>>>
>>>>>           
>>>>     class="org.drools.ioc.spring.DtableResourceFactoryBean">
>>>>         
>>>>>                          <property
>>>>>           
>>>>     name="resource" 
>>>>         
>>>>     value="file:src/main/java/org/drools/ioc/spring/dt.xls"
>>>>     />
>>>>         
>>>>>                          <property
>>>>>           
>>>>     name="inputType" value="XLS" />
>>>>         
>>>>>                      
>>>>>     </bean>                                         
>>>>>           
>>>>                        
>>>>         
>>>>>     </list>       </property>
>>>>>     This one has a property per knowledge type, the
>>>>>           
>>>>     advantage is on 
>>>>         
>>>>>     knowledge types which are just string, we can use a
>>>>>           
>>>>     simple <value>. 
>>>>         
>>>>>     Although knowlege tyep that require additional
>>>>>           
>>>>     information, like the 
>>>>         
>>>>>     DT input type, will need a bean.
>>>>>
>>>>>          <property name="resources">
>>>>>              <list>
>>>>>                  <bean 
>>>>>
>>>>>           
>>>>     class="org.drools.ioc.spring.KnowledgeResourceBeanFactory">
>>>>         
>>>>>                      <property
>>>>>           
>>>>     name="knowledgeType" value="DRL" />
>>>>         
>>>>>                      <property
>>>>>           
>>>>     name="resource" 
>>>>         
>>>>     value="file:src/main/java/org/drools/ioc/spring/testSpring.drl"
>>>>
>>>>         
>>>>>     />                              </bean>
>>>>>
>>>>>                  <bean 
>>>>>
>>>>>           
>>>>     class="org.drools.ioc.spring.KnowledgeResourceBeanFactory">
>>>>         
>>>>>                      <property
>>>>>           
>>>>     name="knowledgeType" value="DTABLE"
>>>>     />
>>>>         
>>>>>                      <property
>>>>>           
>>>>     name="resource" 
>>>>         
>>>>     value="file:src/main/java/org/drools/ioc/spring/dt.xls"
>>>>     />
>>>>         
>>>>>                      <property
>>>>>           
>>>>     name="resourceConfiguration">   
>>>>         
>>>>>                          <bean 
>>>>>
>>>>>           
>>>>     class="org.drools.ioc.spring.DtableResourceFactoryBean">
>>>>         
>>>>>                              <property
>>>>>           
>>>>     name="inputType" value="XLS" />
>>>>         
>>>>>                          </bean>                 
>>>>>           
>>>>     </property>
>>>>         
>>>>>                  </bean>                            
>>>>>           
>>>>      </list>
>>>>         
>>>>>          </property>
>>>>>     This approach more closely resembles the kbuilder api.
>>>>>           
>>>>     We have  simple 
>>>>         
>>>>>     resources list. Everything is a bean, so it's very
>>>>>           
>>>>     flexible, but we 
>>>>         
>>>>>     lose the shortcut approach of the first one where we
>>>>>           
>>>>     can just give a 
>>>>         
>>>>>     list of strings. As each one must be a bean, so that
>>>>>           
>>>>     it can contain 
>>>>         
>>>>>     atleast the knowledge type, as well as the resource
>>>>>           
>>>>     string.
>>>>         
>>>>>     My preference currently is for the second one, as I
>>>>>           
>>>>     don't tink it's 
>>>>         
>>>>>     too verbose, and it provides better consistency than
>>>>>           
>>>>     the first.
>>>>         
>>>>>     Mark
>>>>>
>>>>>
>>>>>     Geoffrey De Smet wrote:
>>>>>           
>>>>>>     It doesn't indeed sound overkill to me to
>>>>>>             
>>>>     create a FactoryBean for 
>>>>         
>>>>>>     the Builder.
>>>>>>     Though I would probably reuse the Builder inside
>>>>>>             
>>>>     the 
>>>>         
>>>>>>     KnowlegdeBaseFactory to build the Knowlegde base.
>>>>>>
>>>>>>     The real issue is concurrency.
>>>>>>     Spring promotes the idea of stateless beans which
>>>>>>             
>>>>     do have global 
>>>>         
>>>>>>     variables, but those global variables are either
>>>>>>             
>>>>     synchronised 
>>>>         
>>>>>>     thread-safe or also follow the stateless bean
>>>>>>             
>>>>     pattern.
>>>>         
>>>>>>     This in fact makes the stateless beans thread
>>>>>>             
>>>>     safe, without any need 
>>>>         
>>>>>>     for synchronization/locking.
>>>>>>
>>>>>>     So the question is: is your KnowlegdeBase
>>>>>>             
>>>>     thread-safe?
>>>>         
>>>>>>     Thread safe objects are usually put into global
>>>>>>             
>>>>     variables,
>>>>         
>>>>>>     while not thread unsafe objects are always put
>>>>>>             
>>>>     into local variables.
>>>>         
>>>>>>     class A {
>>>>>>       private B b; // thread-safe by synchronization
>>>>>>             
>>>>     (JDBCConnection, ...)
>>>>         
>>>>>>       private C c; // thread-safe by the stateless
>>>>>>             
>>>>     pattern:
>>>>         
>>>>>>       // both b and c are set during initialization
>>>>>>             
>>>>     (constr. or setter), 
>>>>         
>>>>>>     before A is exposed to other threads
>>>>>>
>>>>>>       public void metho(D d) { // d is not thread-safe
>>>>>>         E e = ...; // e is not thread-safe
>>>>>>       }
>>>>>>
>>>>>>     }
>>>>>>
>>>>>>     In drools 4. B is the RuleBase, while E is the
>>>>>>             
>>>>     working memory instance.
>>>>         
>>>>>>     With kind regards,
>>>>>>     Geoffrey De Smet
>>>>>>
>>>>>>
>>>>>>     Mark Proctor schreef:
>>>>>>             
>>>>>>>     Geoffrey De Smet wrote:
>>>>>>>               
>>>>>>>>     With kind regards,
>>>>>>>>     Geoffrey De Smet
>>>>>>>>
>>>>>>>>
>>>>>>>>     Mark Proctor schreef:
>>>>>>>>
>>>>>>>>                 
>>>>>>>>>>     I'd also maybe consider
>>>>>>>>>>                     
>>>>     dropping the Spring prefix, as it's in a 
>>>>         
>>>>>>>>>>     package called spring?
>>>>>>>>>>     =>
>>>>>>>>>>                     
>>>>     org.drools.spring.KnowledgeAgentFactoryBean
>>>>         
>>>>>>>>>     My worry here is it might be a
>>>>>>>>>                   
>>>>     duplicate of the same name used in 
>>>>         
>>>>>>>>>     the future - although it'll be in
>>>>>>>>>                   
>>>>     a different package namespace, 
>>>>         
>>>>>>>>>     it's still not good practice.
>>>>>>>>>                   
>>>>     Anyone else have any opinions on this?
>>>>         
>>>>>>>>     Good point, prefixing it with Spring
>>>>>>>>                 
>>>>     can't hurt :)
>>>>         
>>>>>>>     I'm just wondering about
>>>>>>>               
>>>>     KnowledgeBuilderFactory and 
>>>>         
>>>>>>>     KnowledgeBaseFactory. While it makes sense to
>>>>>>>               
>>>>     put the 
>>>>         
>>>>>>>     KnowledgeAgentFactory into spring, does it
>>>>>>>               
>>>>     make sense for those 
>>>>         
>>>>>>>     other factories? What are they gonna do other
>>>>>>>               
>>>>     than return 
>>>>         
>>>>>>>     KnowledgeBuilder or a KnowledgeBase, only
>>>>>>>               
>>>>     possible advantage is that 
>>>>         
>>>>>>>     it would allow spring to inject the
>>>>>>>               
>>>>     KnowledgeBuilderConfiguration 
>>>>         
>>>>>>>     and KnowledgeBaseConfiguration. And ideas?
>>>>>>>
>>>>>>>               
>>>>     http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/KnowledgeBuilderFactory.java
>>>>
>>>>         
>>>>>>>               
>>>>     http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-api/src/main/java/org/drools/builder/KnowledgeBuilder.java
>>>>
>>>>         
>>>>>>>               
>>>>     http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBaseFactory.java
>>>>
>>>>         
>>>>>>>               
>>>>     http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-api/src/main/java/org/drools/KnowledgeBase.java
>>>>
>>>>         
>>>>>>>     This is typically how those two factories are
>>>>>>>               
>>>>     used:
>>>>         
>>>>>>>     KnowledgeBuilder kbuilder = 
>>>>>>>     KnowledgeBuilderFactory.newKnowledgeBuilder();
>>>>>>>     kbuilder.addResource( new URL(
>>>>>>>               
>>>>     "file://myrules.drl" ),
>>>>         
>>>>>>>                                      
>>>>>>>               
>>>>     KnowledgeType.DRL);
>>>>         
>>>>>>>     KnowledgeBase kbase =
>>>>>>>               
>>>>     KnowledgeBaseFactory.newKnowledgeBase();
>>>>         
>>>>>>>     If we use spring to automate the adding of
>>>>>>>               
>>>>     resources, that's pretty 
>>>>         
>>>>>>>     much what the agent is doing anyway, so
>>>>>>>               
>>>>     wouldn't that be pointless?
>>>>         
>>>>>>>     Mark
>>>>>>>
>>>>>>>
>>>>>>>               
>>>>>>>>                 
>>>>     _______________________________________________
>>>>         
>>>>>>>>     rules-dev mailing list
>>>>>>>>     rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>>>>>>>>
>>>>>>>>                 
>>>>     https://lists.jboss.org/mailman/listinfo/rules-dev
>>>>         
>>>>>>>>                 
>>>>>>>               
>>>>     _______________________________________________
>>>>         
>>>>>>>     rules-dev mailing list
>>>>>>>     rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>>>>>>>
>>>>>>>               
>>>>     https://lists.jboss.org/mailman/listinfo/rules-dev
>>>>         
>>>>>>     _______________________________________________
>>>>>>     rules-dev mailing list
>>>>>>     rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>>>>>>     https://lists.jboss.org/mailman/listinfo/rules-dev
>>>>>>
>>>>>>
>>>>>>             
>>>>>     _______________________________________________
>>>>>     rules-dev mailing list
>>>>>     rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>>>>>     https://lists.jboss.org/mailman/listinfo/rules-dev
>>>>>
>>>>>
>>>>>           
>>>>     _______________________________________________
>>>>     rules-dev mailing list
>>>>     rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>>>>     https://lists.jboss.org/mailman/listinfo/rules-dev
>>>>         
>>>           
>>>     _______________________________________________
>>>     rules-dev mailing list
>>>     rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>>>     https://lists.jboss.org/mailman/listinfo/rules-dev
>>>
>>>
>>>       
>>
>>     ------------------------------------------------------------------------
>>     _______________________________________________ rules-dev mailing
>>     list rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>>     https://lists.jboss.org/mailman/listinfo/rules-dev
>
>
>     _______________________________________________
>     rules-dev mailing list
>     rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>     https://lists.jboss.org/mailman/listinfo/rules-dev
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> rules-dev mailing list
> rules-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev
>   

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


More information about the rules-dev mailing list