1 Reply Latest reply on May 22, 2009 6:08 PM by Tihomir Surdilovic

    Drool Decision Tables from Seam.

    Matthew Demerath Newbie

      I have been struggling with this for a few days and thought someone out there may benefit from my pain.

      I couldn’t figure out how to configure my excel spreadsheets for use in Seam. I tried this in my components.xml:

      <drools:rule-base name="ruleBase" rule-files="Sample.xls"/ >
      <drools:managed-working-memory name="workingMemory" auto-create="true" rule-base="#{ruleBase}"/>

      While this worked with my Sample.drl it didn’t work with Sample.xls.

      So now I have a new class that creates the rule base from the excel spreadsheet. The base of the code was taken from the samples provided by the Drools IDE.

      package edu.umich.med.psi.drools;
      import java.io.StringReader;
      import org.drools.RuleBase;
      import org.drools.RuleBaseFactory;
      import org.drools.compiler.PackageBuilder;
      import org.drools.decisiontable.InputType;
      import org.drools.decisiontable.SpreadsheetCompiler;
      import org.drools.rule.Package;
      import org.jboss.seam.ScopeType; 
      import org.jboss.seam.annotations.Name;
      import org.jboss.seam.annotations.Scope;
      import org.jboss.seam.annotations.Startup;
      public class XlsCompiler
          public RuleBase readDecisionTable(String xlsFile) throws Exception
              // read in the source
              final SpreadsheetCompiler converter = new SpreadsheetCompiler();
              final String drl = converter.compile(xlsFile, InputType.XLS);
              PackageBuilder builder = new PackageBuilder();
              builder.addPackageFromDrl(new StringReader(drl));
              Package pkg = builder.getPackage();
              RuleBase ruleBase = RuleBaseFactory.newRuleBase();
              return ruleBase;

      Now in my components.xml I wire them together like this.

      <drools:managed-working-memory name="workingMemory" auto-create="true" scope="session" rule-base="#{xlsCompiler.readDecisionTable('/Sample.xls')}"/>

      It works great.
      PS I also had to include the jxl-n-n-jar in my ear.