I started by creating a simple Drools project that had a JUnit 4 test in it; this runs. It contains two java files and a DRL file. (Shown at very bottom of this post)
I then created a Hello World RCP application from the Eclipse templates. I copied the Drools project files (2 Java files and 1 DRL file) into the same package as my RCP stuff. When I run the test, I get the following error, which is exactly the same error I have been getting with my much more complicated project:
I then removed all the source files relating to the RCP itself, and the error persists. If I now remove the plugin dependencies from this project from the build path, the problem goes away and the tests run. If I add the plugin dependencies back into the project, the error resumes. Finally, if I make my ORIGINAL Drools project depend on this second one with the plugin dependencies, the test fails there too. If I remove the plugin dependencies, the tests run.
Thanks for any assistance.
package rcp_with_drool;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import rcp_with_drool.DroolsTest.Message;
public class mikeTest {
public static RuleBase ruleBase;
public static WorkingMemory workingMemory;
public static Message message;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
message = new Message();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
Reader source = new InputStreamReader( DroolsTest.class.getResourceAsStream( "Sample.drl" ) );
PackageBuilder builder = new PackageBuilder();
try {
builder.addPackageFromDrl(source);
} catch (DroolsParserException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
Package pkg = builder.getPackage();
ruleBase = RuleBaseFactory.newRuleBase();
try {
ruleBase.addPackage( pkg );
} catch (Exception e) {
e.printStackTrace();
}
workingMemory = ruleBase.newStatefulSession();
}
@After
public void tearDown() throws Exception {
}
@Test
public void testMain() {
//Message message = new Message();
message.setMessage( "Hello World" );
message.setStatus( Message.HELLO );
workingMemory.insert( message );
assertEquals("Message status set", message.getStatus(), Message.HELLO);
workingMemory.fireAllRules();
assertEquals("Message status set",message.getStatus(),Message.GOODBYE);
}
@Test
public void testMain1() {
//Message message = new Message();
message.setMessage( "Hello World" );
message.setStatus( Message.HELLO );
workingMemory.insert( message );
assertEquals("Message status set", message.getStatus(), Message.HELLO);
workingMemory.fireAllRules();
assertEquals("Message status set",message.getStatus(),Message.GOODBYE);
}
@Test
public void testMain2() {
//Message message = new Message();
message.setMessage( "Hello World" );
message.setStatus( Message.HELLO );
workingMemory.insert( message );
assertEquals("Message status set", message.getStatus(), Message.HELLO);
workingMemory.fireAllRules();
assertEquals("Message status set",message.getStatus(),Message.GOODBYE);
}
@Test
public void testMain3() {
//Message message = new Message();
message.setMessage( "Hello World" );
message.setStatus( Message.HELLO );
workingMemory.insert( message );
assertEquals("Message status set", message.getStatus(), Message.HELLO);
workingMemory.fireAllRules();
assertEquals("Message status set",message.getStatus(),Message.GOODBYE);
}
}
package rcp_with_drool;
import java.io.InputStreamReader;
import java.io.Reader;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;
/**
* This is a sample file to launch a rule package from a rule source file.
*/
public class DroolsTest {
public static final void main(String[] args) {
try {
//load up the rulebase
RuleBase ruleBase = readRule();
WorkingMemory workingMemory = ruleBase.newStatefulSession();
//go !
Message message = new Message();
message.setMessage( "Hello World" );
message.setStatus( Message.HELLO );
workingMemory.insert( message );
workingMemory.fireAllRules();
} catch (Throwable t) {
t.printStackTrace();
}
}
/**
* Please note that this is the "low level" rule assembly API.
*/
private static RuleBase readRule() throws Exception {
//read in the source
Reader source = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/Sample.drl" ) );
//optionally read in the DSL (if you are using it).
//Reader dsl = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );
//Use package builder to build up a rule package.
//An alternative lower level class called "DrlParser" can also be used...
PackageBuilder builder = new PackageBuilder();
//this wil parse and compile in one step
//NOTE: There are 2 methods here, the one argument one is for normal DRL.
builder.addPackageFromDrl( source );
//Use the following instead of above if you are using a DSL:
//builder.addPackageFromDrl( source, dsl );
//get the compiled package (which is serializable)
Package pkg = builder.getPackage();
//add the package to a rulebase (deploy the rule package).
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
return ruleBase;
}
public static class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
private String message;
private int status;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
public int getStatus() {
return this.status;
}
public void setStatus( int status ) {
this.status = status;
}
}
}
package glucose.rules
import rcp_with_drool.DroolsTest.Message;
rule "Hello World"
when
m : Message( status == Message.HELLO, message : message )
then
System.out.println( message );
m.setMessage( "Goodbye crueller world" );
m.setStatus( Message.GOODBYE );
update( m );
end
rule "GoodBye"
no-loop true
when
m : Message( status == Message.GOODBYE, message : message )
then
System.out.println( message );
m.setMessage( message );
end