package org.drools.template.jdbc;
import junit.framework.TestCase;
import org.drools.RuleBase;
import org.drools.WorkingMemory;
import org.drools.RuleBaseFactory;
import org.drools.compiler.PackageBuilder;
import java.sql.*;
import java.io.InputStream;
import java.io.StringReader;
import java.util.List;
import java.util.ArrayList;
/**
* /**
* <p>A simple example of using the ResultSetGenerator.
* The template used is "Cheese.drt" the same used by SimpleRuleTemplateExample.
* Rather than use the spreadsheet ExampleCheese.xls, this example reads the data
* from an HSQL database (which is created in this example.)</p>
* @author Michael Neale
* @author Bill Tarr
*/
public class ResultSetGeneratorTest extends TestCase {
public void testResultSet() throws Exception {
// setup the HSQL database with our rules.
Class.forName("org.hsqldb.jdbcDriver");
Connection conn = DriverManager.getConnection("jdbc:hsqldb:RULES", "sa", "");
try {
update("CREATE TABLE cheese_rules ( id INTEGER IDENTITY, persons_age INTEGER, birth_date DATE, cheese_type VARCHAR(256), log VARCHAR(256) )", conn);
update("INSERT INTO cheese_rules(persons_age,birth_date,cheese_type,log) VALUES(42, '1950-01-01', 'stilton', 'Old man stilton')", conn);
update("INSERT INTO cheese_rules(persons_age,birth_date,cheese_type,log) VALUES(10, '2009-01-01', 'cheddar', 'Young man cheddar')", conn);
} catch (SQLException e) {
// catch exception for table already existing
}
// query the DB for the rule rows, convert them using the template.
Statement sta = conn.createStatement();
ResultSet rs = sta.executeQuery("SELECT persons_age, cheese_type, log " +
" FROM cheese_rules");
final ResultSetGenerator converter = new ResultSetGenerator();
final String drl1 = converter.compile(rs, getRulesStream());
System.out.println(drl1);
sta.close();
String drl = drl1;
// test that our rules can execute.
final RuleBase rb = buildRuleBase(drl);
WorkingMemory wm = rb.newStatefulSession();
//now create some test data
wm.insert(new Cheese("stilton",
42));
wm.insert(new Person("michael",
"stilton",
42));
final List<String> list = new ArrayList<String>();
wm.setGlobal("list",
list);
wm.fireAllRules();
assertEquals(1, list.size());
}
/**
* Build the rule base from the generated DRL.
* Same method from SimpleRuleTemplateExample.
*
* @param drls variable length of Drools rules as strings
* @return RuleBase built from the rules
* @throws Exception Add Exception handling to a real implementation.
*/
private RuleBase buildRuleBase(String... drls) throws Exception {
//now we build the rule package and rulebase, as if they are normal rules
PackageBuilder builder = new PackageBuilder();
for (String drl : drls) {
builder.addPackageFromDrl(new StringReader(drl));
}
//add the package to a rulebase (deploy the rule package).
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage(builder.getPackage());
return ruleBase;
}
/**
* simple getter method looks up our template as a Resource
*
* @return the template as an InputStream
*/
private InputStream getRulesStream() {
return this.getClass().getResourceAsStream("/templates/Cheese.drt");
}
/**
* An HSQL update wrapper from http://hsqldb.org/doc/guide/apb.html
*
* @param expression SQL expression
* @throws SQLException just rethrowing all the errors for the example
*/
private void update(String expression, Connection conn) throws SQLException {
Statement st;
st = conn.createStatement();
int i = st.executeUpdate(expression);
if (i == -1) {
System.out.println("db error : " + expression);
}
st.close();
}
}