Search in sources :

Example 1 with BatchExecutionCommandImpl

use of org.drools.core.command.runtime.BatchExecutionCommandImpl in project drools by kiegroup.

the class StatelessKnowledgeSessionImpl method execute.

public <T> T execute(Command<T> command) {
    StatefulKnowledgeSession ksession = newWorkingMemory();
    RegistryContext context = new ContextImpl().register(KieSession.class, ksession);
    try {
        if (command instanceof BatchExecutionCommand) {
            ((RegistryContext) context).register(ExecutionResultImpl.class, new ExecutionResultImpl());
        }
        ((StatefulKnowledgeSessionImpl) ksession).startBatchExecution();
        Object o = ((ExecutableCommand) command).execute(context);
        // did the user take control of fireAllRules, if not we will auto execute
        boolean autoFireAllRules = true;
        if (command instanceof FireAllRulesCommand) {
            autoFireAllRules = false;
        } else if (command instanceof BatchExecutionCommandImpl) {
            for (Command nestedCmd : ((BatchExecutionCommandImpl) command).getCommands()) {
                if (nestedCmd instanceof FireAllRulesCommand) {
                    autoFireAllRules = false;
                    break;
                }
            }
        }
        if (autoFireAllRules) {
            ksession.fireAllRules();
        }
        if (command instanceof BatchExecutionCommand) {
            return (T) ((RegistryContext) context).lookup(ExecutionResultImpl.class);
        } else {
            return (T) o;
        }
    } finally {
        ((StatefulKnowledgeSessionImpl) ksession).endBatchExecution();
        dispose(ksession);
    }
}
Also used : FireAllRulesCommand(org.drools.core.command.runtime.rule.FireAllRulesCommand) StatefulKnowledgeSession(org.kie.internal.runtime.StatefulKnowledgeSession) RegistryContext(org.drools.core.command.impl.RegistryContext) ContextImpl(org.drools.core.command.impl.ContextImpl) BatchExecutionCommandImpl(org.drools.core.command.runtime.BatchExecutionCommandImpl) FireAllRulesCommand(org.drools.core.command.runtime.rule.FireAllRulesCommand) ExecutableCommand(org.drools.core.command.impl.ExecutableCommand) Command(org.kie.api.command.Command) BatchExecutionCommand(org.kie.api.command.BatchExecutionCommand) ExecutionResultImpl(org.drools.core.runtime.impl.ExecutionResultImpl) BatchExecutionCommand(org.kie.api.command.BatchExecutionCommand) ExecutableCommand(org.drools.core.command.impl.ExecutableCommand)

Example 2 with BatchExecutionCommandImpl

use of org.drools.core.command.runtime.BatchExecutionCommandImpl in project drools by kiegroup.

the class StatelessSessionTest method testInsertObject.

@Test
public void testInsertObject() throws Exception {
    String str = "";
    str += "package org.kie \n";
    str += "import org.drools.compiler.Cheese \n";
    str += "rule rule1 \n";
    str += "  when \n";
    str += "    $c : Cheese() \n";
    str += " \n";
    str += "  then \n";
    str += "    $c.setPrice( 30 ); \n";
    str += "end\n";
    Cheese stilton = new Cheese("stilton", 5);
    final StatelessKieSession ksession = getSession2(ResourceFactory.newByteArrayResource(str.getBytes()));
    final ExecutableCommand cmd = (ExecutableCommand) CommandFactory.newInsert(stilton, "outStilton");
    final BatchExecutionCommandImpl batch = new BatchExecutionCommandImpl(Arrays.asList(new ExecutableCommand<?>[] { cmd }));
    final ExecutionResults result = (ExecutionResults) ksession.execute(batch);
    stilton = (Cheese) result.getValue("outStilton");
    assertEquals(30, stilton.getPrice());
}
Also used : BatchExecutionCommandImpl(org.drools.core.command.runtime.BatchExecutionCommandImpl) ExecutionResults(org.kie.api.runtime.ExecutionResults) StatelessKieSession(org.kie.api.runtime.StatelessKieSession) ExecutableCommand(org.drools.core.command.impl.ExecutableCommand) Cheese(org.drools.compiler.Cheese) Test(org.junit.Test)

Example 3 with BatchExecutionCommandImpl

use of org.drools.core.command.runtime.BatchExecutionCommandImpl 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 4 with BatchExecutionCommandImpl

use of org.drools.core.command.runtime.BatchExecutionCommandImpl in project jbpm by kiegroup.

the class PerCaseRuntimeManager method destroyCase.

public void destroyCase(CaseContext caseContext) {
    KieSession kieSession = null;
    RuntimeEngine localRuntime = findLocalRuntime(caseContext.getContextId());
    if (localRuntime != null) {
        kieSession = localRuntime.getKieSession();
    } else {
        Long ksessionId = mapper.findMapping(caseContext, this.identifier);
        if (ksessionId != null) {
            kieSession = factory.findKieSessionById(ksessionId);
        }
    }
    factory.onDispose(kieSession.getIdentifier());
    List<ExecutableCommand<?>> cmds = new ArrayList<>();
    RemoveMappingCommand removeMapping = new RemoveMappingCommand(mapper, caseContext, getIdentifier());
    cmds.add(removeMapping);
    DestroyKSessionCommand destroy = new DestroyKSessionCommand(kieSession, this);
    cmds.add(destroy);
    BatchExecutionCommand batchCmd = new BatchExecutionCommandImpl(cmds);
    kieSession.execute(batchCmd);
}
Also used : RuntimeEngine(org.kie.api.runtime.manager.RuntimeEngine) BatchExecutionCommandImpl(org.drools.core.command.runtime.BatchExecutionCommandImpl) ArrayList(java.util.ArrayList) BatchExecutionCommand(org.kie.api.command.BatchExecutionCommand) ExecutableCommand(org.drools.core.command.impl.ExecutableCommand) KieSession(org.kie.api.runtime.KieSession)

Aggregations

BatchExecutionCommandImpl (org.drools.core.command.runtime.BatchExecutionCommandImpl)4 ExecutableCommand (org.drools.core.command.impl.ExecutableCommand)3 ArrayList (java.util.ArrayList)2 Test (org.junit.Test)2 BatchExecutionCommand (org.kie.api.command.BatchExecutionCommand)2 Command (org.kie.api.command.Command)2 Field (java.lang.reflect.Field)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 Pattern (java.util.regex.Pattern)1 XmlElement (javax.xml.bind.annotation.XmlElement)1 XmlElements (javax.xml.bind.annotation.XmlElements)1 Cheese (org.drools.compiler.Cheese)1 ClassObjectFilter (org.drools.core.ClassObjectFilter)1 ClassObjectSerializationFilter (org.drools.core.ClassObjectSerializationFilter)1 RuleNameEndsWithAgendaFilter (org.drools.core.base.RuleNameEndsWithAgendaFilter)1 RuleNameEqualsAgendaFilter (org.drools.core.base.RuleNameEqualsAgendaFilter)1 RuleNameMatchesAgendaFilter (org.drools.core.base.RuleNameMatchesAgendaFilter)1 RuleNameStartsWithAgendaFilter (org.drools.core.base.RuleNameStartsWithAgendaFilter)1