org.drools.container.spring.SpringDroolsTest.java Source code

Java tutorial

Introduction

Here is the source code for org.drools.container.spring.SpringDroolsTest.java

Source

/*
 * Copyright 2010 JBoss Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.drools.container.spring;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;

import org.drools.ClockType;
import org.drools.Person;
import org.drools.RuleBaseConfiguration;
import org.drools.SessionConfiguration;
import org.drools.RuleBaseConfiguration.AssertBehaviour;
import org.drools.agent.impl.KnowledgeAgentImpl;
import org.drools.common.InternalRuleBase;
import org.drools.conf.EventProcessingOption;
import org.drools.container.spring.beans.DroolsResourceAdapter;
import org.drools.grid.GridNode;
import org.drools.impl.KnowledgeBaseImpl;
import org.drools.impl.StatefulKnowledgeSessionImpl;
import org.drools.impl.StatelessKnowledgeSessionImpl;
import org.drools.io.Resource;
import org.drools.io.ResourceFactory;
import org.drools.io.impl.ResourceChangeScannerImpl;
import org.drools.io.impl.UrlResource;
import org.drools.io.internal.InternalResource;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.StatelessKnowledgeSession;
import org.drools.runtime.process.WorkItemHandler;
import org.jbpm.process.instance.impl.humantask.HumanTaskHandler;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDroolsTest {

    @Test
    public void testNoConnection() throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "org/drools/container/spring/beans.xml");

        GridNode node1 = (GridNode) context.getBean("node1");
        assertNotNull(node1);

        GridNode node2 = (GridNode) context.getBean("node2");
        assertNotNull(node2);
    }

    @Test
    public void testNoNodeKSessions() throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "org/drools/container/spring/no-node-beans.xml");

        List<String> list = new ArrayList<String>();
        StatelessKnowledgeSession kstateless = (StatelessKnowledgeSession) context.getBean("ksession1");
        kstateless.setGlobal("list", list);
        kstateless.execute(new Person("Darth", "Cheddar", 50));
        assertEquals(1, list.size());

        list = new ArrayList<String>();
        StatefulKnowledgeSession kstateful = ((StatefulKnowledgeSession) context.getBean("ksession2"));
        kstateful.setGlobal("list", list);
        kstateful.insert(new Person("Darth", "Cheddar", 50));
        kstateful.fireAllRules();
        assertEquals(1, list.size());
    }

    @Test
    public void testSimpleKSessions() throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "org/drools/container/spring/beans.xml");

        List<String> list = new ArrayList<String>();
        StatelessKnowledgeSession kstateless = (StatelessKnowledgeSession) context.getBean("ksession1");
        kstateless.setGlobal("list", list);
        kstateless.execute(new Person("Darth", "Cheddar", 50));
        assertEquals(2, list.size());

        list = new ArrayList<String>();
        StatefulKnowledgeSession kstateful = ((StatefulKnowledgeSession) context.getBean("ksession2"));
        kstateful.setGlobal("list", list);
        kstateful.insert(new Person("Darth", "Cheddar", 50));
        kstateful.fireAllRules();
        assertEquals(2, list.size());
    }

    @Test
    public void testAgents() throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "org/drools/container/spring/kagents-beans.xml");

        ResourceChangeScannerImpl scanner = (ResourceChangeScannerImpl) ResourceFactory
                .getResourceChangeScannerService();
        assertEquals(5, scanner.getInterval());

        KnowledgeBaseImpl kbase1 = (KnowledgeBaseImpl) context.getBean("kbase1");
        KnowledgeBaseImpl kbase2 = (KnowledgeBaseImpl) context.getBean("kbase2");

        KnowledgeAgentImpl kagent1 = (KnowledgeAgentImpl) context.getBean("kagent1");
        assertSame(kagent1.getKnowledgeBase(), kbase1);
        assertEquals(0, kagent1.getResourceDirectories().size());
        assertFalse(kagent1.isNewInstance());
        assertFalse(kagent1.isUseKBaseClassLoaderForCompiling());

        KnowledgeAgentImpl kagent2 = (KnowledgeAgentImpl) context.getBean("kagent2");
        assertSame(kagent2.getKnowledgeBase(), kbase2);
        assertEquals(1, kagent2.getResourceDirectories().size());
        assertFalse(kagent2.isNewInstance());
        assertFalse(kagent2.isUseKBaseClassLoaderForCompiling());

        KnowledgeAgentImpl kagent3 = (KnowledgeAgentImpl) context.getBean("kagent3");
        assertTrue(kagent3.isNewInstance());
        assertTrue(kagent3.isUseKBaseClassLoaderForCompiling());

        StatelessKnowledgeSessionImpl ksession1 = (StatelessKnowledgeSessionImpl) context.getBean("ksession1");
        assertSame(kbase1.getRuleBase(), ksession1.getRuleBase());
        assertSame(kagent1, ksession1.getKnowledgeAgent());

        StatefulKnowledgeSessionImpl ksession2 = (StatefulKnowledgeSessionImpl) context.getBean("ksession2");
        assertSame(kbase1.getRuleBase(), ksession2.getRuleBase());

        StatelessKnowledgeSessionImpl ksession3 = (StatelessKnowledgeSessionImpl) context.getBean("ksession3");
        assertSame(kagent2, ksession3.getKnowledgeAgent());
        assertSame(kbase2.getRuleBase(), ksession3.getRuleBase());

    }

    @Test
    public void testNode() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "org/drools/container/spring/beans.xml");

        GridNode node = (GridNode) context.getBean("node1");
        List<String> list = new ArrayList<String>();
        StatelessKnowledgeSession kstateless = node.get("stateless1", StatelessKnowledgeSession.class);
        assertNotNull("can't obtain session named: stateless1", kstateless);
        kstateless.setGlobal("list", list);
        kstateless.execute(new Person("Darth", "Cheddar", 50));
        assertEquals(2, list.size());

        list = new ArrayList<String>();
        StatefulKnowledgeSession kstateful = node.get("ksession2", StatefulKnowledgeSession.class);
        kstateful.setGlobal("list", list);
        kstateful.insert(new Person("Darth", "Cheddar", 50));
        kstateful.fireAllRules();
        assertEquals(2, list.size());
    }

    @Test
    public void testConfiguration() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "org/drools/container/spring/session-conf-beans.xml");
        KnowledgeBaseImpl kbase1 = (KnowledgeBaseImpl) context.getBean("kbase1");
        RuleBaseConfiguration rconf = ((InternalRuleBase) kbase1.getRuleBase()).getConfiguration();
        assertTrue(rconf.isAdvancedProcessRuleIntegration());
        assertFalse(rconf.isMultithreadEvaluation());
        assertEquals(EventProcessingOption.STREAM, rconf.getEventProcessingMode());
        assertEquals(AssertBehaviour.IDENTITY, rconf.getAssertBehaviour());
        assertEquals("org.drools.container.spring.MockConsequenceExceptionHandler",
                rconf.getConsequenceExceptionHandler());

        KnowledgeBaseImpl kbase2 = (KnowledgeBaseImpl) context.getBean("kbase2");
        rconf = ((InternalRuleBase) kbase2.getRuleBase()).getConfiguration();
        assertFalse(rconf.isAdvancedProcessRuleIntegration());
        assertFalse(rconf.isMultithreadEvaluation());
        assertEquals(3, rconf.getMaxThreads());
        assertEquals(EventProcessingOption.CLOUD, rconf.getEventProcessingMode());
        assertEquals(AssertBehaviour.EQUALITY, rconf.getAssertBehaviour());

        StatefulKnowledgeSessionImpl ksession1 = (StatefulKnowledgeSessionImpl) context.getBean("ksession1");
        SessionConfiguration sconf = ksession1.session.getSessionConfiguration();
        assertTrue(sconf.isKeepReference());
        assertEquals(ClockType.REALTIME_CLOCK, sconf.getClockType());
        Map<String, WorkItemHandler> wih = sconf.getWorkItemHandlers();
        assertEquals(4, wih.size());
        assertTrue(wih.containsKey("wih1"));
        assertTrue(wih.containsKey("wih2"));
        assertTrue(wih.containsKey("Human Task"));
        assertTrue(wih.containsKey("MyWork"));
        assertNotSame(wih.get("wih1"), wih.get("wih2"));
        assertEquals(HumanTaskHandler.class, wih.get("wih1").getClass());
        assertEquals(HumanTaskHandler.class, wih.get("wih2").getClass());

        StatefulKnowledgeSessionImpl ksession2 = (StatefulKnowledgeSessionImpl) context.getBean("ksession2");
        sconf = ksession2.session.getSessionConfiguration();
        assertFalse(sconf.isKeepReference());
        assertEquals(ClockType.PSEUDO_CLOCK, sconf.getClockType());

    }

    @Test
    public void testResourceAuthenication() throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "org/drools/container/spring/beans.xml");

        //Secure Resource
        DroolsResourceAdapter resourceAdapter = (DroolsResourceAdapter) context.getBean("secureResource");
        assertNotNull(resourceAdapter);

        Resource resource = resourceAdapter.getDroolsResource();
        assertTrue(resource instanceof UrlResource);

        UrlResource ur = (UrlResource) resource;

        assertEquals("enabled", ur.getBasicAuthentication());
        assertEquals("someUser", ur.getUsername());
        assertEquals("somePassword", ur.getPassword());

        //Insecure Resource
        resourceAdapter = (DroolsResourceAdapter) context.getBean("insecureResource");
        assertNotNull(resourceAdapter);

        resource = resourceAdapter.getDroolsResource();
        assertTrue(resource instanceof UrlResource);

        ur = (UrlResource) resource;

        assertEquals("disabled", ur.getBasicAuthentication());
        assertEquals("", ur.getUsername());
        assertEquals("", ur.getPassword());
    }

    @Test
    public void testResourceNameAndDescription() throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "org/drools/container/spring/beans.xml");

        DroolsResourceAdapter resource = (DroolsResourceAdapter) context.getBean("secureResource");
        assertNotNull(resource);
        InternalResource secureResource = (InternalResource) resource.getDroolsResource();

        assertNull(secureResource.getName());
        assertNull(secureResource.getDescription());

        resource = (DroolsResourceAdapter) context.getBean("resourceWithNameAndDescription");
        assertNotNull(resource);
        InternalResource resourceWithNameAndDescription = (InternalResource) resource.getDroolsResource();

        assertEquals("A Name", resourceWithNameAndDescription.getName());
        assertEquals("A Description", resourceWithNameAndDescription.getDescription());

    }
}