use of org.kie.api.definition.rule.Rule in project drools by kiegroup.
the class KnowledgeBaseImpl method mergePackage.
/**
* Merge a new package with an existing package.
* Most of the work is done by the concrete implementations,
* but this class does some work (including combining imports, compilation data, globals,
* and the actual Rule objects into the package).
*/
private void mergePackage(InternalKnowledgePackage pkg, InternalKnowledgePackage newPkg) {
// Merge imports
final Map<String, ImportDeclaration> imports = pkg.getImports();
imports.putAll(newPkg.getImports());
// Merge static imports
for (String staticImport : newPkg.getStaticImports()) {
pkg.addStaticImport(staticImport);
}
String lastIdent = null;
String lastType = null;
try {
// merge globals
if (newPkg.getGlobals() != null && newPkg.getGlobals() != Collections.EMPTY_MAP) {
Map<String, String> globals = pkg.getGlobals();
// Add globals
for (final Map.Entry<String, String> entry : newPkg.getGlobals().entrySet()) {
final String identifier = entry.getKey();
final String type = entry.getValue();
lastIdent = identifier;
lastType = type;
if (globals.containsKey(identifier) && !globals.get(identifier).equals(type)) {
throw new RuntimeException(pkg.getName() + " cannot be integrated");
} else {
pkg.addGlobal(identifier, this.rootClassLoader.loadClass(type));
// this isn't a package merge, it's adding to the rulebase, but I've put it here for convienience
addGlobal(identifier, this.rootClassLoader.loadClass(type));
}
}
}
} catch (ClassNotFoundException e) {
throw new RuntimeException("Unable to resolve class '" + lastType + "' for global '" + lastIdent + "'");
}
// merge entry point declarations
if (newPkg.getEntryPointIds() != null) {
for (String ep : newPkg.getEntryPointIds()) {
pkg.addEntryPointId(ep);
}
}
// merge the type declarations
if (newPkg.getTypeDeclarations() != null) {
// add type declarations
for (TypeDeclaration type : newPkg.getTypeDeclarations().values()) {
// @TODO should we allow overrides? only if the class is not in use.
if (!pkg.getTypeDeclarations().containsKey(type.getTypeName())) {
// add to package list of type declarations
pkg.addTypeDeclaration(type);
}
}
}
// merge window declarations
if (newPkg.getWindowDeclarations() != null) {
// add window declarations
for (WindowDeclaration window : newPkg.getWindowDeclarations().values()) {
if (!pkg.getWindowDeclarations().containsKey(window.getName()) || pkg.getWindowDeclarations().get(window.getName()).equals(window)) {
pkg.addWindowDeclaration(window);
} else {
throw new RuntimeException("Unable to merge two conflicting window declarations for window named: " + window.getName());
}
}
}
// Merge rules into the RuleBase package
// as this is needed for individual rule removal later on
List<RuleImpl> rulesToBeRemoved = new ArrayList<RuleImpl>();
for (Rule newRule : newPkg.getRules()) {
// remove the rule if it already exists
RuleImpl oldRule = pkg.getRule(newRule.getName());
if (oldRule != null) {
rulesToBeRemoved.add(oldRule);
}
}
if (!rulesToBeRemoved.isEmpty()) {
removeRules(rulesToBeRemoved);
}
for (Rule newRule : newPkg.getRules()) {
pkg.addRule((RuleImpl) newRule);
}
// Merge The Rule Flows
if (newPkg.getRuleFlows() != null) {
for (Process flow : newPkg.getRuleFlows().values()) {
pkg.addProcess(flow);
}
}
if (!newPkg.getResourceTypePackages().isEmpty()) {
for (ResourceTypePackage rtkKpg : newPkg.getResourceTypePackages().values()) {
ResourceType rt = rtkKpg.getResourceType();
KieWeavers weavers = ServiceRegistry.getInstance().get(KieWeavers.class);
KieWeaverService weaver = weavers.getWeavers().get(rt);
weaver.merge(this, pkg, rtkKpg);
}
}
}
use of org.kie.api.definition.rule.Rule in project drools by kiegroup.
the class DRLTest method testRuleMetaAttributes.
@Test
public void testRuleMetaAttributes() throws Exception {
String drl = "";
drl += "package test\n";
drl += "rule \"test meta attributes\"\n";
drl += " @id(1234 ) @author( john_doe ) @text(\"It's an escaped\\\" string\" )\n";
drl += "when\n";
drl += "then\n";
drl += " // some comment\n";
drl += "end\n";
final KieBase kbase = loadKnowledgeBaseFromString(drl);
final Rule rule = kbase.getRule("test", "test meta attributes");
assertNotNull(rule);
assertThat(rule.getMetaData().get("id"), is(1234));
assertThat(rule.getMetaData().get("author"), is("john_doe"));
assertThat(rule.getMetaData().get("text"), is("It's an escaped\" string"));
}
use of org.kie.api.definition.rule.Rule in project drools by kiegroup.
the class IncrementalCompilationTest method testRuleRemoval.
@Test
public void testRuleRemoval() throws Exception {
String drl1 = "package org.drools.compiler\n" + "rule R1 when\n" + " $m : Message()\n" + "then\n" + "end\n";
String drl2 = "rule R2 when\n" + " $m : Message( message == \"Hi Universe\" )\n" + "then\n" + "end\n";
String drl3 = "rule R3 when\n" + " $m : Message( message == \"Hello World\" )\n" + "then\n" + "end\n";
KieServices ks = KieServices.Factory.get();
// Create an in-memory jar for version 1.0.0
ReleaseId releaseId1 = ks.newReleaseId("org.kie", "test-upgrade", "1.0.0");
KieModule km = createAndDeployJar(ks, releaseId1, drl1 + drl2 + drl3);
// Create a session and fire rules
KieContainer kc = ks.newKieContainer(km.getReleaseId());
KiePackage kpkg = kc.getKieBase().getKiePackage("org.drools.compiler");
assertEquals(3, kpkg.getRules().size());
Map<String, Rule> rules = rulestoMap(kpkg.getRules());
assertNotNull(rules.get("R1"));
assertNotNull(rules.get("R2"));
assertNotNull(rules.get("R3"));
RuleTerminalNode rtn1_1 = (RuleTerminalNode) ((KnowledgeBaseImpl) kc.getKieBase()).getReteooBuilder().getTerminalNodes("org.drools.compiler.R1")[0];
RuleTerminalNode rtn2_1 = (RuleTerminalNode) ((KnowledgeBaseImpl) kc.getKieBase()).getReteooBuilder().getTerminalNodes("org.drools.compiler.R2")[0];
RuleTerminalNode rtn3_1 = (RuleTerminalNode) ((KnowledgeBaseImpl) kc.getKieBase()).getReteooBuilder().getTerminalNodes("org.drools.compiler.R3")[0];
// Create a new jar for version 1.1.0
ReleaseId releaseId2 = ks.newReleaseId("org.kie", "test-upgrade", "1.1.0");
km = createAndDeployJar(ks, releaseId2, drl1 + drl3);
// try to update the container to version 1.1.0
kc.updateToVersion(releaseId2);
KnowledgeBaseImpl rb_2 = ((KnowledgeBaseImpl) kc.getKieBase());
RuleTerminalNode rtn1_2 = (RuleTerminalNode) rb_2.getReteooBuilder().getTerminalNodes("org.drools.compiler.R1")[0];
RuleTerminalNode rtn3_2 = (RuleTerminalNode) rb_2.getReteooBuilder().getTerminalNodes("org.drools.compiler.R3")[0];
assertNull(rb_2.getReteooBuilder().getTerminalNodes("org.drools.compiler.R2"));
assertSame(rtn3_1, rtn3_2);
assertSame(rtn1_1, rtn1_2);
kpkg = kc.getKieBase().getKiePackage("org.drools.compiler");
assertEquals(2, kpkg.getRules().size());
rules = rulestoMap(kpkg.getRules());
assertNotNull(rules.get("R1"));
assertNull(rules.get("R2"));
assertNotNull(rules.get("R3"));
}
use of org.kie.api.definition.rule.Rule in project drools by kiegroup.
the class AddRemoveRulesTest method testRemoveChildLeftTupleThatWasMiddle.
@Test
public void testRemoveChildLeftTupleThatWasMiddle() {
final String[] rules = getRules3Pattern();
final KieSession kieSession = TestUtil.createSession(rules);
try {
final List resultsList = new ArrayList();
kieSession.setGlobal("list", resultsList);
TestUtil.insertFacts(kieSession, 3);
kieSession.fireAllRules();
Assertions.assertThat(resultsList).containsOnly(TestUtil.RULE1_NAME, TestUtil.RULE2_NAME, TestUtil.RULE3_NAME);
resultsList.clear();
TestUtil.removeRules(kieSession, TestUtil.RULES_PACKAGE_NAME, TestUtil.RULE2_NAME);
kieSession.fireAllRules();
final Map<String, Rule> rulesMap = rulestoMap(kieSession.getKieBase());
final InternalFactHandle fh1 = (InternalFactHandle) kieSession.getFactHandle(3);
final LeftTuple lt = fh1.getFirstLeftTuple().getFirstChild();
assertSame(lt, fh1.getFirstLeftTuple().getLastChild());
assertEquals(1, lt.getTupleSink().getAssociatedRuleSize());
assertTrue(lt.getTupleSink().isAssociatedWith(rulesMap.get(TestUtil.RULE1_NAME)));
final LeftTuple peer = lt.getPeer();
assertEquals(1, peer.getTupleSink().getAssociatedRuleSize());
assertTrue(peer.getTupleSink().isAssociatedWith(rulesMap.get(TestUtil.RULE3_NAME)));
} finally {
kieSession.dispose();
}
}
use of org.kie.api.definition.rule.Rule in project drools by kiegroup.
the class AddRemoveRulesTest method testRemoveChildLeftTupleThatWasFirst.
@Test
public void testRemoveChildLeftTupleThatWasFirst() {
final String[] rules = getRules3Pattern();
final KieSession kieSession = TestUtil.createSession(rules[0], rules[1]);
try {
final List resultsList = new ArrayList();
kieSession.setGlobal("list", resultsList);
TestUtil.insertFacts(kieSession, 3);
kieSession.fireAllRules();
Assertions.assertThat(resultsList).containsOnly(TestUtil.RULE1_NAME, TestUtil.RULE2_NAME);
resultsList.clear();
TestUtil.removeRules(kieSession, TestUtil.RULES_PACKAGE_NAME, TestUtil.RULE1_NAME);
kieSession.fireAllRules();
final Map<String, Rule> rulesMap = rulestoMap(kieSession.getKieBase());
final InternalFactHandle fh1 = (InternalFactHandle) kieSession.getFactHandle(3);
final LeftTuple lt = fh1.getFirstLeftTuple().getFirstChild().getFirstChild();
assertSame(lt, fh1.getFirstLeftTuple().getFirstChild().getLastChild());
assertNull(lt.getPeer());
assertEquals(1, lt.getTupleSink().getAssociatedRuleSize());
assertTrue(lt.getTupleSink().isAssociatedWith(rulesMap.get(TestUtil.RULE2_NAME)));
} finally {
kieSession.dispose();
}
}
Aggregations