package org.drools.compiler.command;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.drools.compiler.CommonTestMethodBase;
import org.drools.compiler.integrationtests.DroolsTest;
import org.drools.core.command.builder.KnowledgeBuilderAddCommand;
import org.drools.core.command.builder.KnowledgeBuilderGetErrorsCommand;
import org.drools.core.command.builder.KnowledgeBuilderGetKnowledgePackagesCommand;
import org.drools.core.command.builder.KnowledgeBuilderHasErrorsCommand;
import org.drools.core.command.builder.NewKnowledgeBuilderCommand;
import org.drools.compiler.integrationtests.DroolsTest.Bar;
import org.drools.compiler.integrationtests.DroolsTest.Foo;
import org.junit.After;
import org.junit.Test;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderError;
import org.kie.internal.builder.KnowledgeBuilderErrors;
import org.kie.api.command.Command;
import org.kie.internal.command.CommandFactory;
import org.kie.internal.definition.KnowledgePackage;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.ExecutionResults;
public class KBuilderBatchExecutionTest extends CommonTestMethodBase {
private static final String source = "org/drools/compiler/lang/misplaced_parenthesis.drl";
private StatefulKnowledgeSession ksession = null;
@After
public void disposeKSession() throws Exception {
if( ksession != null ) {
ksession.dispose();
ksession = null;
}
}
@Test
public void testKBuilderAdd() throws Exception {
Resource res = ResourceFactory.newClassPathResource(source);
assertNotNull(res);
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
ksession = createKnowledgeSession(kbase);
List<Command<?>> commands = new ArrayList<Command<?>>();
commands.add(new NewKnowledgeBuilderCommand("kbuilder"));
commands.add(new KnowledgeBuilderAddCommand(res, ResourceType.DRL, null));
Command<?> cmds = CommandFactory.newBatchExecution( commands );
ExecutionResults result = (ExecutionResults) ksession.execute( cmds );
assertNotNull(result);
Object kbuilder = result.getValue("kbuilder");
assertNotNull(kbuilder);
assertTrue(kbuilder instanceof KnowledgeBuilder);
assertTrue(((KnowledgeBuilder) kbuilder).hasErrors());
}
@Test
public void testHasErrors() throws Exception {
Resource res = ResourceFactory.newClassPathResource(source);
assertNotNull(res);
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
ksession = createKnowledgeSession(kbase);
List<Command<?>> commands = new ArrayList<Command<?>>();
commands.add(new NewKnowledgeBuilderCommand());
commands.add(new KnowledgeBuilderAddCommand(res, ResourceType.DRL, null));
commands.add(new KnowledgeBuilderHasErrorsCommand("hasErrors"));
Command<?> cmds = CommandFactory.newBatchExecution( commands );
ExecutionResults result = (ExecutionResults) ksession.execute( cmds );
assertNotNull(result);
Object hasErrors = result.getValue("hasErrors");
assertNotNull(hasErrors);
assertEquals(Boolean.TRUE, hasErrors);
}
@Test
public void testBatchGetErrors() throws Exception {
Resource res = ResourceFactory.newClassPathResource(source);
assertNotNull(res);
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
ksession = createKnowledgeSession(kbase);
List<Command<?>> commands = new ArrayList<Command<?>>();
commands.add(new NewKnowledgeBuilderCommand());
commands.add(new KnowledgeBuilderAddCommand(res, ResourceType.DRL, null));
commands.add(new KnowledgeBuilderGetErrorsCommand("errors"));
Command<?> cmds = CommandFactory.newBatchExecution( commands );
ExecutionResults result = (ExecutionResults) ksession.execute( cmds );
assertNotNull(result);
Object errors = result.getValue("errors");
assertNotNull(errors);
assertTrue(errors instanceof KnowledgeBuilderErrors);
KnowledgeBuilderErrors kbErrors = (KnowledgeBuilderErrors) errors;
assertEquals( 2, kbErrors.size());
KnowledgeBuilderError kbError = kbErrors.iterator().next();
assertTrue( kbError.getMessage().startsWith("[ERR 102]"));
}
@Test
@SuppressWarnings("unchecked")
public void testGetKnowledgePackages() {
int NUM_FACTS = 5;
String ruleString
= "package org.drools.compiler.integrationtests;\n"
+ "import " + KBuilderBatchExecutionTest.class.getCanonicalName() + ";\n"
+ "import " + DroolsTest.class.getName() + ".Foo;\n"
+ "import " + DroolsTest.class.getName() + ".Bar;\n"
+ "rule test\n"
+ "when\n"
+ " Foo($p : id, id < " + Integer.toString( NUM_FACTS ) + ")\n"
+ " Bar(id == $p)\n"
+ "then\n"
+ " " + KBuilderBatchExecutionTest.class.getSimpleName() + ".incCounter();\n"
+ "end\n";
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
ksession = createKnowledgeSession(kbase);
List<Command<?>> commands = new ArrayList<Command<?>>();
commands.add(new NewKnowledgeBuilderCommand());
commands.add(new KnowledgeBuilderAddCommand( ResourceFactory.newByteArrayResource(ruleString.getBytes()), ResourceType.DRL, null));
commands.add(new KnowledgeBuilderGetKnowledgePackagesCommand("pkgs"));
Command<?> cmds = CommandFactory.newBatchExecution( commands );
ExecutionResults result = (ExecutionResults) ksession.execute( cmds );
assertNotNull(result);
Object pkgsObject = result.getValue("pkgs");
assertTrue(pkgsObject != null && pkgsObject instanceof Collection<?>);
kbase.addKnowledgePackages( ((Collection<KnowledgePackage>) pkgsObject) );
ksession.dispose();
ksession = createKnowledgeSession(kbase);
for ( int i = 0; i < NUM_FACTS; i++ ) {
ksession.insert( new Foo( i ) );
ksession.insert( new Bar( i ) );
}
ksession.fireAllRules();
assertEquals(NUM_FACTS, counter);
}
private static int counter = 0;
public static void incCounter() {
++counter;
}
}