@Override protected Collection<RuleBaseElementId> listElementsInPackage(KnowledgePackage p) { Collection<RuleBaseElementId> result = new HashSet<RuleBaseElementId>(); String path = p.getName().replace(".", File.separator); File directory = new File(source.getPath(), path); @SuppressWarnings("unchecked") Collection<File> listFiles = FileUtils.listFiles(directory, new String[] {DirectoryRuleSource.FUNC_EXTENSION}, false); for (File f : listFiles) { String s = f.getName().replace("." + DirectoryRuleSource.FUNC_EXTENSION, ""); result.add(new RuleBaseElementId(RuleBaseElementType.Function, p.getName(), s)); } return result; }
@Test public void testDslRulesKnowledge() throws IOException, ClassNotFoundException { try { executeTarget("dslRulesKnowledge"); } catch (Exception e) { e.printStackTrace(); fail("Should not throw any exception: " + e.getMessage()); } KnowledgePackage kpackage1 = (KnowledgePackage) DroolsStreamUtils.streamIn(new FileInputStream("target/cheese.rules.pkg")); assertNotNull(kpackage1); assertEquals(1, kpackage1.getRules().size()); }
@Test @Ignore public void testDeletePackageUrl() throws Exception { String rule1 = this.createDefaultRule("rule1", "org.drools.test1"); String rule2 = this.createDefaultRule("rule2", "org.drools.test2"); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newByteArrayResource(rule1.getBytes()), ResourceType.DRL); kbuilder.add(ResourceFactory.newByteArrayResource(rule2.getBytes()), ResourceType.DRL); if (kbuilder.hasErrors()) { fail(kbuilder.getErrors().toString()); } Map<String, KnowledgePackage> map = new HashMap<String, KnowledgePackage>(); for (KnowledgePackage pkg : kbuilder.getKnowledgePackages()) { map.put(pkg.getName(), pkg); } writePackage((KnowledgePackage) map.get("org.drools.test1"), fileManager.newFile("pkg1.pkg")); writePackage((KnowledgePackage) map.get("org.drools.test2"), fileManager.newFile("pkg2.pkg")); String xml = ""; xml += "<change-set xmlns='http://drools.org/drools-5.0/change-set'"; xml += " xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'"; xml += " xs:schemaLocation='http://drools.org/drools-5.0/change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd' >"; xml += " <add> "; xml += " <resource source='http://localhost:" + this.getPort() + "/pkg1.pkg' type='PKG' />"; xml += " <resource source='http://localhost:" + this.getPort() + "/pkg2.pkg' type='PKG' />"; xml += " </add> "; xml += "</change-set>"; KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); KnowledgeAgent kagent = this.createKAgent(kbase, false); applyChangeSet(kagent, ResourceFactory.newByteArrayResource(xml.getBytes())); StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession(); List<String> list = new ArrayList<String>(); ksession.setGlobal("list", list); ksession.fireAllRules(); ksession.dispose(); assertEquals(2, list.size()); assertTrue(list.contains("rule1")); assertTrue(list.contains("rule2")); list.clear(); xml = ""; xml += "<change-set xmlns='http://drools.org/drools-5.0/change-set'"; xml += " xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'"; xml += " xs:schemaLocation='http://drools.org/drools-5.0/change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd' >"; xml += " <remove> "; xml += " <resource source='http://localhost:" + this.getPort() + "/pkg2.pkg' type='PKG' />"; xml += " </remove> "; xml += "</change-set>"; applyChangeSet(kagent, xml); ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession(); list = new ArrayList<String>(); ksession.setGlobal("list", list); ksession.fireAllRules(); ksession.dispose(); assertEquals(1, list.size()); assertTrue(list.contains("rule1")); kagent.dispose(); }
@Test public void testLogicalInsertionsDynamicRule() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource("test_LogicalInsertionsDynamicRule.drl", getClass()), ResourceType.DRL); if (kbuilder.hasErrors()) { fail(kbuilder.getErrors().toString()); } Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages(); KnowledgeBase kbase = getKnowledgeBase(); kbase.addKnowledgePackages(kpkgs); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); final Cheese c1 = new Cheese("a", 1); final Cheese c2 = new Cheese("b", 2); final Cheese c3 = new Cheese("c", 3); List list; ksession.insert(c1); FactHandle h = ksession.insert(c2); ksession.insert(c3); ksession.fireAllRules(); ksession = getSerialisedStatefulKnowledgeSession(ksession, true); // Check logical Insertions where made for c2 and c3 list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class))); assertEquals(2, list.size()); assertFalse(list.contains(new Person(c1.getType()))); assertTrue(list.contains(new Person(c2.getType()))); assertTrue(list.contains(new Person(c3.getType()))); // this rule will make a logical assertion for c1 too kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource("test_LogicalInsertionsDynamicRule2.drl", getClass()), ResourceType.DRL); if (kbuilder.hasErrors()) { fail(kbuilder.getErrors().toString()); } Collection<KnowledgePackage> kpkgs2 = kbuilder.getKnowledgePackages(); kbase.addKnowledgePackages(kpkgs2); kbase = SerializationHelper.serializeObject(kbase); ksession.fireAllRules(); ksession = getSerialisedStatefulKnowledgeSession(ksession, true); kbase = ksession.getKnowledgeBase(); // check all now have just one logical assertion each list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class))); assertEquals(3, list.size()); assertTrue(list.contains(new Person(c1.getType()))); assertTrue(list.contains(new Person(c2.getType()))); assertTrue(list.contains(new Person(c3.getType()))); ksession = getSerialisedStatefulKnowledgeSession(ksession, true); // check the packages are correctly populated assertEquals(2, kbase.getKnowledgePackages().size()); KnowledgePackage test = null, test2 = null; // different JVMs return the package list in different order for (KnowledgePackage kpkg : kbase.getKnowledgePackages()) { if (kpkg.getName().equals("org.drools.test")) { test = kpkg; } else if (kpkg.getName().equals("org.drools.test2")) { test2 = kpkg; } } assertNotNull(test); assertNotNull(test2); assertEquals("rule1", test.getRules().iterator().next().getName()); assertEquals("rule2", test2.getRules().iterator().next().getName()); // now remove the first rule kbase.removeRule(test.getName(), test.getRules().iterator().next().getName()); // different JVMs return the package list in different order for (KnowledgePackage kpkg : kbase.getKnowledgePackages()) { if (kpkg.getName().equals("org.drools.test")) { test = kpkg; } else if (kpkg.getName().equals("org.drools.test2")) { test2 = kpkg; } } assertNotNull(test); assertNotNull(test2); // Check the rule was correctly remove assertEquals(0, test.getRules().size()); assertEquals(1, test2.getRules().size()); assertEquals("rule2", test2.getRules().iterator().next().getName()); list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class))); assertEquals( "removal of the rule should result in retraction of c3's logical assertion", 2, list.size()); assertTrue( "c1's logical assertion should not be retracted", list.contains(new Person(c1.getType()))); assertTrue( "c2's logical assertion should not be retracted", list.contains(new Person(c2.getType()))); assertFalse( "c3's logical assertion should be retracted", list.contains(new Person(c3.getType()))); c2.setPrice(3); h = getFactHandle(h, ksession); ksession.update(h, c2); ksession = getSerialisedStatefulKnowledgeSession(ksession, true); list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class))); assertEquals( "c2 now has a higher price, its logical assertion should be cancelled", 1, list.size()); assertFalse( "The logical assertion cor c2 should have been retracted", list.contains(new Person(c2.getType()))); assertTrue( "The logical assertion for c1 should exist", list.contains(new Person(c1.getType()))); // different JVMs return the package list in different order for (KnowledgePackage kpkg : kbase.getKnowledgePackages()) { if (kpkg.getName().equals("org.drools.test")) { test = kpkg; } else if (kpkg.getName().equals("org.drools.test2")) { test2 = kpkg; } } assertNotNull(test); assertNotNull(test2); kbase.removeRule(test2.getName(), test2.getRules().iterator().next().getName()); kbase = SerializationHelper.serializeObject(kbase); // different JVMs return the package list in different order for (KnowledgePackage kpkg : kbase.getKnowledgePackages()) { if (kpkg.getName().equals("org.drools.test")) { test = kpkg; } else if (kpkg.getName().equals("org.drools.test2")) { test2 = kpkg; } } assertNotNull(test); assertNotNull(test2); assertEquals(0, test.getRules().size()); assertEquals(0, test2.getRules().size()); list = new ArrayList(ksession.getObjects(new ClassObjectFilter(Person.class))); assertEquals(0, list.size()); }