RulesWithSpringFramework

    For folks using the spring framework, the following tips may be handy.

     

    Consider taking a look at:

     

    https://springmodules.dev.java.net/

    https://springmodules.dev.java.net/docs/reference/0.5/html/

     

     

    Or, feel free to use the following FactoryBean from Geoffrey De Smit:

     

    package net.sf.tabudrool.evaluation;
    
    import org.springframework.beans.factory.FactoryBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.core.io.Resource;
    import org.springframework.util.Assert;
    import org.drools.RuleBase;
    import org.drools.RuleBaseFactory;
    import org.drools.compiler.PackageBuilder;
    import org.drools.compiler.PackageBuilderConfiguration;
    import java.util.List;
    import java.io.InputStreamReader;
    
    /**
     * @author Geoffrey De Smet
     */
    public class RuleBaseBeanFactory implements FactoryBean, InitializingBean {
    
        private List<Resource> drlResourceList;
    
        private RuleBase ruleBase;
    
        private  PackageBuilderConfiguration packageBuilderConfiguration;
    
        public void setDrlResourceList(List<Resource> drlResourceList) {
            this.drlResourceList = drlResourceList;
        }
    
        public void afterPropertiesSet() throws Exception {
            Assert.notEmpty(drlResourceList, "drlResourceList must not be
    empty");
            PackageBuilder builder = (packageBuilderConfiguration != null ? new PackageBuilder(packageBuilderConfiguration) : new PackageBuilder());
            for (Resource resource : drlResourceList) {
                builder.addPackageFromDrl(new
    InputStreamReader(resource.getInputStream())); // TODO will use default
    encoding which might not be wanted
            }
            ruleBase = RuleBaseFactory.newRuleBase();
            ruleBase.addPackage(builder.getPackage());
        }
    
    
        public RuleBase getObject() {
            return ruleBase;
        }
    
        public Class getObjectType() {
            return RuleBase.class;
        }
    
        public boolean isSingleton() {
            return true;
        }
    
        public void setPackageBuilderConfiguration(PackageBuilderConfiguration packageBuilderConfiguration) {
            this.packageBuilderConfiguration = packageBuilderConfiguration;
        }
    }
    
    

     

    and the configuration:

     

    
        <bean id="ruleBase"
    class="net.sf.tabudrool.evaluation.RuleBaseBeanFactory">
            <property name="drlResourceList">
                <list>
                    <value
    type="org.springframework.core.io.Resource">classpath:/net/sf/tabudrool/evaluation/rules.drl</value>
                </list>
            </property>
            <property name="packageBuilderConfiguration">
              <bean class="org.drools.compiler.PackageBuilderConfiguration">
                <property name="javaLanguageLevel" value="1.5"></property>
              </bean>
            </property>
        </bean>
    
        <bean id="workflowFrame"
    class="net.sf.tabudrool.swingui.WorkflowFrame" singleton="false">
    ...
            <property name="ruleBase" ref="ruleBase"></property>
        </bean>
    
    

     

    And this is how you use it:

     

    
        private void assertScheduleInWorkingMemory() {
            if (workingMemory != null) {
                workingMemory.dispose();
            }
            workingMemory = ruleBase.newWorkingMemory();
            Schedule schedule = schedulePanel.getSchedule();
            for (Timeslot timeslot : schedule.getTimeslotList()) {
                workingMemory.assertObject(timeslot);
            }
    ...
            workingMemory.fireAllRules();
        }