Search in sources :

Example 16 with ClassObjectFilter

use of org.drools.core.ClassObjectFilter in project drools by kiegroup.

the class CommandSerializationTest method batchExecutionImplSerializationTest.

@Test
@Ignore
public void batchExecutionImplSerializationTest() throws Exception {
    DefaultFactHandle factHandle = new DefaultFactHandle(13, "entry-point-id", 42, 84, 400l, "fact");
    BatchExecutionCommandImpl batchCmd = new BatchExecutionCommandImpl();
    batchCmd.setLookup("lookup");
    {
        AbortWorkItemCommand cmd = new AbortWorkItemCommand(23l);
        batchCmd.addCommand(cmd);
    }
    {
        String externalForm = factHandle.toExternalForm();
        assertEquals("FactHandle string", externalForm, DisconnectedFactHandle.newFrom(factHandle).toExternalForm());
        DeleteCommand cmd = new DeleteCommand(factHandle);
        batchCmd.addCommand(cmd);
    }
    {
        GetGlobalCommand cmd = new GetGlobalCommand("global-id");
        cmd.setOutIdentifier("out-id");
        batchCmd.addCommand(cmd);
    }
    {
        SetGlobalCommand cmd = new SetGlobalCommand("global-id", new Integer(23));
        cmd.setOutIdentifier("out-id");
        batchCmd.addCommand(cmd);
    }
    {
        InsertElementsCommand cmd = new InsertElementsCommand();
        cmd.setEntryPoint("entry-point");
        cmd.setOutIdentifier("out-id");
        cmd.setReturnObject(true);
        Map<String, Object> mapObj = new HashMap<String, Object>();
        mapObj.put("key", "value");
        List<Object> objects = new ArrayList<Object>(1);
        objects.add(mapObj);
        cmd.setObjects(objects);
        batchCmd.addCommand(cmd);
    }
    {
        QueryCommand cmd = new QueryCommand();
        List<Object> args = new ArrayList<Object>(3);
        args.add("this");
        args.add(42);
        args.add("other");
        cmd.setArguments(args);
        cmd.setName("query-name");
        cmd.setOutIdentifier("out-id");
        batchCmd.addCommand(cmd);
    }
    {
        InsertObjectCommand cmd = new InsertObjectCommand();
        cmd.setEntryPoint("entry-point");
        cmd.setOutIdentifier("out-id");
        cmd.setReturnObject(true);
        cmd.setObject("object");
        batchCmd.addCommand(cmd);
    }
    {
        ModifyCommand cmd = new ModifyCommand();
        cmd.setFactHandle(DisconnectedFactHandle.newFrom(factHandle));
        List<Setter> setters = new ArrayList<Setter>(2);
        Setter setter = new Setter() {

            @Override
            public String getValue() {
                return "blue";
            }

            @Override
            public String getAccessor() {
                return "heart";
            }
        };
        setters.add(setter);
        setter = new Setter() {

            @Override
            public String getValue() {
                return "hot";
            }

            @Override
            public String getAccessor() {
                return "fingers";
            }
        };
        setters.add(setter);
        cmd.setSetters(setters);
        batchCmd.addCommand(cmd);
    }
    {
        GetObjectCommand cmd = new GetObjectCommand(factHandle, "out-id");
        batchCmd.addCommand(cmd);
    }
    // TODO: implement serialization for agenda filters
    {
        AgendaFilter[] filters = new AgendaFilter[4];
        filters[0] = new RuleNameEndsWithAgendaFilter("suffix", false);
        filters[1] = new RuleNameEqualsAgendaFilter("name", true);
        filters[2] = new RuleNameMatchesAgendaFilter("regexp", false);
        filters[3] = new RuleNameStartsWithAgendaFilter("prefix", false);
        for (AgendaFilter filter : filters) {
            FireAllRulesCommand cmd = new FireAllRulesCommand(randomString(), random.nextInt(1000), filter);
            batchCmd.addCommand(cmd);
        }
    }
    {
        AgendaFilter[] filters = new AgendaFilter[4];
        filters[0] = new RuleNameEndsWithAgendaFilter("suffix", false);
        filters[1] = new RuleNameEqualsAgendaFilter("name", true);
        filters[2] = new RuleNameMatchesAgendaFilter("regexp", false);
        filters[3] = new RuleNameStartsWithAgendaFilter("prefix", false);
        for (AgendaFilter filter : filters) {
            FireUntilHaltCommand cmd = new FireUntilHaltCommand(filter);
            batchCmd.addCommand(cmd);
        }
    }
    {
        Map<String, Object> results = new HashMap<String, Object>(1);
        List<String> resultValList = new ArrayList<String>(2);
        resultValList.add("yellow");
        resultValList.add("chances");
        results.put("list", resultValList);
        CompleteWorkItemCommand cmd = new CompleteWorkItemCommand(random.nextInt(1000), results);
        batchCmd.addCommand(cmd);
    }
    {
        ClassObjectFilter filter = new ClassObjectFilter(String.class);
        GetObjectsCommand cmd = new GetObjectsCommand(filter, "out-id");
        batchCmd.addCommand(cmd);
    }
    {
        AgendaGroupSetFocusCommand cmd = new AgendaGroupSetFocusCommand(randomString());
        batchCmd.addCommand(cmd);
    }
    {
        ClearActivationGroupCommand cmd = new ClearActivationGroupCommand(randomString());
        batchCmd.addCommand(cmd);
    }
    {
        ClearAgendaCommand cmd = new ClearAgendaCommand();
        batchCmd.addCommand(cmd);
    }
    {
        ClearAgendaGroupCommand cmd = new ClearAgendaGroupCommand(randomString());
        batchCmd.addCommand(cmd);
    }
    {
        ClearRuleFlowGroupCommand cmd = new ClearRuleFlowGroupCommand(randomString());
        batchCmd.addCommand(cmd);
    }
    BatchExecutionCommandImpl batchCmdCopy = roundTrip(batchCmd);
    assertEquals("Batch cmd lookup", batchCmd.getLookup(), batchCmdCopy.getLookup());
    assertEquals("Batch cmd num commands", batchCmd.getCommands().size(), batchCmdCopy.getCommands().size());
    // This code should use the utility in kie-test-util when it finally gets moved there..
    for (Command copyCmd : batchCmdCopy.getCommands()) {
        for (Command origCmd : batchCmd.getCommands()) {
            Class cmdClass = origCmd.getClass();
            if (copyCmd.getClass().equals(cmdClass)) {
                if (cmdClass.equals(DeleteCommand.class)) {
                    compareFactHandles(((DeleteCommand) origCmd).getFactHandle(), ((DeleteCommand) copyCmd).getFactHandle(), DeleteCommand.class);
                } else if (cmdClass.equals(FireAllRulesCommand.class)) {
                    AgendaFilter origFilter = ((FireAllRulesCommand) origCmd).getAgendaFilter();
                    AgendaFilter copyFilter = ((FireAllRulesCommand) copyCmd).getAgendaFilter();
                    if (!origFilter.getClass().equals(copyFilter.getClass())) {
                        continue;
                    }
                    Class agendaFilterClass = origFilter.getClass();
                    for (Field agendaFilterField : agendaFilterClass.getDeclaredFields()) {
                        agendaFilterField.setAccessible(true);
                        Object afFieldOrigVal = agendaFilterField.get(origFilter);
                        Object afFieldCopyVal = agendaFilterField.get(copyFilter);
                        if (afFieldOrigVal instanceof Pattern) {
                            afFieldOrigVal = ((Pattern) afFieldOrigVal).pattern();
                            afFieldCopyVal = ((Pattern) afFieldCopyVal).pattern();
                        }
                        assertEquals(agendaFilterClass.getSimpleName() + "." + agendaFilterField.getName(), afFieldOrigVal, afFieldCopyVal);
                    }
                    assertEquals(FireAllRulesCommand.class.getSimpleName() + ".max", ((FireAllRulesCommand) origCmd).getMax(), ((FireAllRulesCommand) copyCmd).getMax());
                    assertEquals(FireAllRulesCommand.class.getSimpleName() + ".outIdentifier", ((FireAllRulesCommand) origCmd).getOutIdentifier(), ((FireAllRulesCommand) copyCmd).getOutIdentifier());
                } else if (cmdClass.equals(FireUntilHaltCommand.class)) {
                    AgendaFilter origFilter = ((FireUntilHaltCommand) origCmd).getAgendaFilter();
                    AgendaFilter copyFilter = ((FireUntilHaltCommand) copyCmd).getAgendaFilter();
                    if (!origFilter.getClass().equals(copyFilter.getClass())) {
                        continue;
                    }
                    Class agendaFilterClass = origFilter.getClass();
                    for (Field agendaFilterField : agendaFilterClass.getDeclaredFields()) {
                        agendaFilterField.setAccessible(true);
                        Object afFieldOrigVal = agendaFilterField.get(origFilter);
                        Object afFieldCopyVal = agendaFilterField.get(copyFilter);
                        if (afFieldOrigVal instanceof Pattern) {
                            afFieldOrigVal = ((Pattern) afFieldOrigVal).pattern();
                            afFieldCopyVal = ((Pattern) afFieldCopyVal).pattern();
                        }
                        assertEquals(agendaFilterClass.getSimpleName() + "." + agendaFilterField.getName(), afFieldOrigVal, afFieldCopyVal);
                    }
                } else {
                    for (Field cmdField : cmdClass.getDeclaredFields()) {
                        cmdField.setAccessible(true);
                        if (Modifier.isTransient(cmdField.getModifiers())) {
                            continue;
                        }
                        Object origVal = cmdField.get(origCmd);
                        assertNotNull(cmdClass.getSimpleName() + "." + cmdField.getName(), origVal);
                        Object copyVal = cmdField.get(copyCmd);
                        assertNotNull("Round-tripped " + cmdClass.getSimpleName() + "." + cmdField.getName(), copyVal);
                        if (origVal instanceof FactHandle) {
                            compareFactHandles((FactHandle) origVal, (FactHandle) copyVal, cmdClass);
                        } else if (origVal instanceof ClassObjectSerializationFilter) {
                            assertEquals("Original compared to Round-tripped " + cmdClass.getSimpleName() + "." + cmdField.getName(), ((ClassObjectSerializationFilter) origVal).getClass(), ((ClassObjectSerializationFilter) copyVal).getClass());
                        } else if (origVal instanceof List) {
                            List origList = (List) origVal;
                            if (((List) copyVal).isEmpty()) {
                                assertTrue("Original compared to Round-tripped " + cmdClass.getSimpleName() + "." + cmdField.getName(), origList.isEmpty());
                            } else {
                                if (origList.get(0) instanceof Setter) {
                                    for (Object obj : (List) origVal) {
                                        assertTrue("Expected a " + Setter.class.getSimpleName() + " instance (not " + obj.getClass().getSimpleName() + " in " + cmdClass.getSimpleName() + "." + cmdField.getName(), obj instanceof Setter);
                                        Iterator<Object> iter = ((List) copyVal).iterator();
                                        while (iter.hasNext()) {
                                            Setter copySetter = (Setter) iter.next();
                                            if (((Setter) obj).getAccessor().equals(copySetter.getAccessor())) {
                                                assertEquals("Original compared to Round-tripped " + cmdClass.getSimpleName() + "." + cmdField.getName(), ((Setter) obj).getValue(), copySetter.getValue());
                                                iter.remove();
                                            }
                                        }
                                    }
                                    assertTrue("Original compared to Round-tripped " + cmdClass.getSimpleName() + "." + cmdField.getName(), ((List) copyVal).isEmpty());
                                } else if (origList.get(0) instanceof Map) {
                                    Map copyMap = (Map) ((List) copyVal).get(0);
                                    for (Object entry : ((Map) origList.get(0)).entrySet()) {
                                        assertTrue("Original compared to Round-tripped " + cmdClass.getSimpleName() + "." + cmdField.getName(), (copyMap).containsKey(((Entry) entry).getKey()));
                                    }
                                }
                            }
                        } else {
                            assertTrue("Original compared to Round-tripped " + cmdClass.getSimpleName() + "." + cmdField.getName(), origVal.equals(copyVal));
                        }
                    }
                }
            }
        }
    }
    // verify that BatchExecutionCommandImpl.commands has been filled with all
    // of the different types
    Field commandsField = BatchExecutionCommandImpl.class.getDeclaredField("commands");
    XmlElements xmlElemsAnno = commandsField.getAnnotation(XmlElements.class);
    List<Class> cmdTypes = new ArrayList<Class>(xmlElemsAnno.value().length);
    for (XmlElement xmlElem : xmlElemsAnno.value()) {
        cmdTypes.add(xmlElem.type());
    }
    // already thoroughly tested..
    cmdTypes.remove(SignalEventCommand.class);
    // already thoroughly tested..
    cmdTypes.remove(StartProcessCommand.class);
    for (Command cmd : batchCmd.getCommands()) {
        cmdTypes.remove(cmd.getClass());
    }
    String cmdInstName = cmdTypes.isEmpty() ? "null" : cmdTypes.get(0).getSimpleName();
    assertTrue("Please add a " + cmdInstName + " instance to the " + BatchExecutionCommandImpl.class.getSimpleName() + " commands!", cmdTypes.isEmpty());
// other tests for this as part of the REST integration tests..
}
Also used : DisconnectedFactHandle(org.drools.core.common.DisconnectedFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) DefaultFactHandle(org.drools.core.common.DefaultFactHandle) ArrayList(java.util.ArrayList) GetGlobalCommand(org.drools.core.command.runtime.GetGlobalCommand) RuleNameEqualsAgendaFilter(org.drools.core.base.RuleNameEqualsAgendaFilter) RuleNameStartsWithAgendaFilter(org.drools.core.base.RuleNameStartsWithAgendaFilter) Field(java.lang.reflect.Field) DefaultFactHandle(org.drools.core.common.DefaultFactHandle) XmlElements(javax.xml.bind.annotation.XmlElements) BatchExecutionCommandImpl(org.drools.core.command.runtime.BatchExecutionCommandImpl) AbortWorkItemCommand(org.drools.core.command.runtime.process.AbortWorkItemCommand) ArrayList(java.util.ArrayList) List(java.util.List) RuleNameEndsWithAgendaFilter(org.drools.core.base.RuleNameEndsWithAgendaFilter) RuleNameStartsWithAgendaFilter(org.drools.core.base.RuleNameStartsWithAgendaFilter) AgendaFilter(org.kie.api.runtime.rule.AgendaFilter) RuleNameMatchesAgendaFilter(org.drools.core.base.RuleNameMatchesAgendaFilter) RuleNameEqualsAgendaFilter(org.drools.core.base.RuleNameEqualsAgendaFilter) ClassObjectSerializationFilter(org.drools.core.ClassObjectSerializationFilter) RuleNameEndsWithAgendaFilter(org.drools.core.base.RuleNameEndsWithAgendaFilter) RuleNameMatchesAgendaFilter(org.drools.core.base.RuleNameMatchesAgendaFilter) Pattern(java.util.regex.Pattern) CompleteWorkItemCommand(org.drools.core.command.runtime.process.CompleteWorkItemCommand) SetGlobalCommand(org.drools.core.command.runtime.SetGlobalCommand) ClassObjectFilter(org.drools.core.ClassObjectFilter) AbortWorkItemCommand(org.drools.core.command.runtime.process.AbortWorkItemCommand) CompleteWorkItemCommand(org.drools.core.command.runtime.process.CompleteWorkItemCommand) Command(org.kie.api.command.Command) StartProcessCommand(org.drools.core.command.runtime.process.StartProcessCommand) SetGlobalCommand(org.drools.core.command.runtime.SetGlobalCommand) GetGlobalCommand(org.drools.core.command.runtime.GetGlobalCommand) SignalEventCommand(org.drools.core.command.runtime.process.SignalEventCommand) Setter(org.kie.api.command.Setter) XmlElement(javax.xml.bind.annotation.XmlElement) HashMap(java.util.HashMap) Map(java.util.Map) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 17 with ClassObjectFilter

use of org.drools.core.ClassObjectFilter in project drools by kiegroup.

the class FromGenericCollectionTest method testGenerics.

@Test
public void testGenerics() {
    final String drl = "package " + TestConstants.PACKAGE_REGRESSION + "\n" + " import java.util.Map.Entry\n" + " import java.util.List\n" + " import " + GenericHolder.class.getCanonicalName() + "\n" + " rule checkCrazyMap\n" + " when\n" + "        GenericHolder( $map : crazyMap )\n" + "        $entry : Entry( $list : value ) from $map.entrySet\n" + "        $string : String ( ) from $list\n" + " then\n" + "        insert(new Boolean(true));\n" + " end\n";
    final KieBase kieBase = KieBaseUtil.getKieBaseAndBuildInstallModuleFromDrl(TestConstants.PACKAGE_REGRESSION, kieBaseTestConfiguration, drl);
    final KieSession ksession = kieBase.newKieSession();
    try {
        final Map<String, List<String>> crazyMap = new HashMap<String, List<String>>();
        crazyMap.put("foo", Arrays.asList("bar"));
        final GenericHolder gh = new GenericHolder();
        gh.setCrazyMap(crazyMap);
        ksession.insert(gh);
        ksession.fireAllRules();
        Assertions.assertThat(ksession.getObjects(new ClassObjectFilter(Boolean.class)).size()).isEqualTo(1);
    } finally {
        ksession.dispose();
    }
}
Also used : ClassObjectFilter(org.drools.core.ClassObjectFilter) HashMap(java.util.HashMap) KieBase(org.kie.api.KieBase) KieSession(org.kie.api.runtime.KieSession) List(java.util.List) Test(org.junit.Test)

Example 18 with ClassObjectFilter

use of org.drools.core.ClassObjectFilter in project drools by kiegroup.

the class Misc2Test method testPhreakTMS.

@Test
public void testPhreakTMS() {
    // DROOLS-7
    String str = "import org.drools.compiler.Person\n" + "import org.drools.compiler.Cheese\n" + "rule R when\n" + "  Person( $age : age, $name : name == \"A\" )\n" + "  not Person( age == $age + 1 )\n" + "then\n" + "  insertLogical(new Cheese(\"gorgonzola\", 10));\n" + "end\n";
    KieBase kbase = loadKnowledgeBaseFromString(str);
    KieSession ksession = kbase.newKieSession();
    Person p1 = new Person("A", 31);
    FactHandle fh1 = ksession.insert(p1);
    ksession.fireAllRules();
    assertEquals(1, ksession.getObjects(new ClassObjectFilter(Cheese.class)).size());
    Person p2 = new Person("A", 32);
    FactHandle fh2 = ksession.insert(p2);
    ksession.fireAllRules();
    assertEquals(1, ksession.getObjects(new ClassObjectFilter(Cheese.class)).size());
}
Also used : ClassObjectFilter(org.drools.core.ClassObjectFilter) InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) DefaultFactHandle(org.drools.core.common.DefaultFactHandle) KieBase(org.kie.api.KieBase) KieSession(org.kie.api.runtime.KieSession) StatelessKieSession(org.kie.api.runtime.StatelessKieSession) Cheese(org.drools.compiler.Cheese) Person(org.drools.compiler.Person) Test(org.junit.Test)

Example 19 with ClassObjectFilter

use of org.drools.core.ClassObjectFilter in project drools by kiegroup.

the class TruthMaintenanceTest method testStatedDeleteLogicalAssertionFromRule.

@Test
public void testStatedDeleteLogicalAssertionFromRule() {
    // BZ-1317026
    String drl = "global java.util.List list;\n" + "rule R1 when\n" + "then\n" + "    insertLogical( \"test\" ); \n" + "end\n" + "rule R2 when\n" + "    $s : String()\n" + "then\n" + "    list.add( $s ); \n" + "    delete( $s, org.kie.api.runtime.rule.FactHandle.State.STATED ); \n" + "end\n";
    KieSession ksession = new KieHelper().addContent(drl, ResourceType.DRL).build().newKieSession();
    List<String> list = new ArrayList<String>();
    ksession.setGlobal("list", list);
    ksession.fireAllRules();
    assertEquals(1, list.size());
    assertEquals("test", list.get(0));
    Collection<FactHandle> fhs = ksession.getFactHandles(new ClassObjectFilter(String.class));
    assertEquals(1, fhs.size());
}
Also used : ClassObjectFilter(org.drools.core.ClassObjectFilter) InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) DefaultFactHandle(org.drools.core.common.DefaultFactHandle) ArrayList(java.util.ArrayList) KieHelper(org.kie.internal.utils.KieHelper) KieSession(org.kie.api.runtime.KieSession) Test(org.junit.Test)

Example 20 with ClassObjectFilter

use of org.drools.core.ClassObjectFilter in project drools by kiegroup.

the class TruthMaintenanceTest method testLogicalInsertionsWithModify.

@Test(timeout = 10000)
public // @Ignore("in Java 8, the byte[] generated by serialization are not the same and requires investigation")
void testLogicalInsertionsWithModify() throws Exception {
    KieBase kbase = loadKnowledgeBase("test_LogicalInsertionsWithUpdate.drl");
    KieSession ksession = kbase.newKieSession();
    final Person p = new Person("person");
    p.setAge(2);
    FactHandle h = ksession.insert(p);
    assertEquals(1, ksession.getObjects().size());
    ksession.fireAllRules();
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, false);
    assertEquals(2, ksession.getObjects().size());
    Collection l = ksession.getObjects(new ClassObjectFilter(CheeseEqual.class));
    assertEquals(1, l.size());
    assertEquals(2, ((CheeseEqual) l.iterator().next()).getPrice());
    h = getFactHandle(h, ksession);
    ksession.retract(h);
    ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession(ksession, false);
    assertEquals(0, ksession.getObjects().size());
    TruthMaintenanceSystem tms = ((NamedEntryPoint) ksession.getEntryPoint(EntryPointId.DEFAULT.getEntryPointId())).getTruthMaintenanceSystem();
    final java.lang.reflect.Field field = tms.getClass().getDeclaredField("equalityKeyMap");
    field.setAccessible(true);
    final ObjectHashMap m = (ObjectHashMap) field.get(tms);
    field.setAccessible(false);
    assertEquals("assertMap should be empty", 0, m.size());
}
Also used : TruthMaintenanceSystem(org.drools.core.common.TruthMaintenanceSystem) InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) DefaultFactHandle(org.drools.core.common.DefaultFactHandle) NamedEntryPoint(org.drools.core.common.NamedEntryPoint) ObjectHashMap(org.drools.core.util.ObjectHashMap) CheeseEqual(org.drools.compiler.CheeseEqual) ClassObjectFilter(org.drools.core.ClassObjectFilter) KieBase(org.kie.api.KieBase) Collection(java.util.Collection) KieSession(org.kie.api.runtime.KieSession) Person(org.drools.compiler.Person) Test(org.junit.Test)

Aggregations

ClassObjectFilter (org.drools.core.ClassObjectFilter)25 Test (org.junit.Test)25 KieSession (org.kie.api.runtime.KieSession)24 DefaultFactHandle (org.drools.core.common.DefaultFactHandle)15 InternalFactHandle (org.drools.core.common.InternalFactHandle)15 FactHandle (org.kie.api.runtime.rule.FactHandle)15 KieBase (org.kie.api.KieBase)11 ArrayList (java.util.ArrayList)9 List (java.util.List)8 Person (org.drools.compiler.Person)8 KieHelper (org.kie.internal.utils.KieHelper)6 Cheese (org.drools.compiler.Cheese)5 InternalKnowledgeBase (org.drools.core.impl.InternalKnowledgeBase)5 KiePackage (org.kie.api.definition.KiePackage)5 KnowledgeBuilder (org.kie.internal.builder.KnowledgeBuilder)5 Collection (java.util.Collection)3 HashMap (java.util.HashMap)3 CheeseEqual (org.drools.compiler.CheeseEqual)3 StatelessKieSession (org.kie.api.runtime.StatelessKieSession)3 InternalKieModule (org.drools.compiler.kie.builder.impl.InternalKieModule)2