Package org.drools.integrationtests

Source Code of org.drools.integrationtests.KnowledgeBuilderTest

package org.drools.integrationtests;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.definition.type.FactType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.junit.Test;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

public class KnowledgeBuilderTest {

    @Test
    public void testCompositeKnowledgeBuilder() throws Exception {
        String rule = "package org.drools.test\n" +
                "rule R1 when\n" +
                "   $fieldA : FactA( $fieldB : fieldB )\n" +
                "   FactB( this == $fieldB, fieldA == $fieldA )\n" +
                "then\n" +
                "end";

        String declarationA = "package org.drools.test\n" +
                "declare FactA\n" +
                "    fieldB: FactB\n" +
                "end\n";

        String declarationB = "package org.drools.test\n" +
                "declare FactB\n" +
                "    fieldA: FactA\n" +
                "end\n";

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource(rule.getBytes()), ResourceType.DRL );
        kbuilder.add( ResourceFactory.newByteArrayResource(declarationA.getBytes()), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newByteArrayResource(declarationB.getBytes()), ResourceType.DRL );
        assertTrue(kbuilder.hasErrors());

        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add( ResourceFactory.newByteArrayResource(declarationA.getBytes()), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newByteArrayResource(declarationB.getBytes()), ResourceType.DRL );
        kbuilder.add( ResourceFactory.newByteArrayResource(rule.getBytes()), ResourceType.DRL);
        assertTrue(kbuilder.hasErrors());

        KnowledgeBuilder kbuilder2 = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder2.batch()
                .add(ResourceFactory.newByteArrayResource(rule.getBytes()), ResourceType.DRL)
                .add(ResourceFactory.newByteArrayResource(declarationA.getBytes()), ResourceType.DRL)
                .add(ResourceFactory.newByteArrayResource(declarationB.getBytes()), ResourceType.DRL)
                .build();

        if ( kbuilder2.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder2.getKnowledgePackages() );
        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

        FactType aType = kbase.getFactType( "org.drools.test", "FactA" );
        Object a = aType.newInstance();
        FactType bType = kbase.getFactType( "org.drools.test", "FactB" );
        Object b = bType.newInstance();
        aType.set( a, "fieldB", b );
        bType.set( b, "fieldA", a );
        ksession.insert( a );
        ksession.insert( b );

        int rules = ksession.fireAllRules();
        assertEquals(1, rules);
    }

    @Test
    public void testDifferentPackages() throws Exception {
        String rule = "package org.drools.test.rule\n" +
                "import org.drools.testA.FactA\n" +
                "import org.drools.testB.FactB\n" +
                "rule R1 when\n" +
                "   $fieldA : FactA( $fieldB : fieldB, bigint == 1 )\n" +
                "   FactB( this == $fieldB, fieldA == $fieldA )\n" +
                "then\n" +
                "   list.add(\"OK\");"+
                "end";

        String declarationA = "package org.drools.testA\n" +
                "import org.drools.testB.FactB\n" +
                "import java.math.BigInteger\n" +
                "declare FactA\n" +
                "    fieldB: FactB\n" +
                "    bigint: BigInteger\n" +
                "end\n";

        String declarationB = "package org.drools.testB\n" +
                "import org.drools.testA.FactA\n" +
                "global java.util.List list\n" +
                "declare FactB\n" +
                "    fieldA: FactA\n" +
                "end\n";

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.batch()
                .type(ResourceType.DRL)
                .add(ResourceFactory.newByteArrayResource(rule.getBytes()))
                .add(ResourceFactory.newByteArrayResource(declarationA.getBytes()))
                .add(ResourceFactory.newByteArrayResource(declarationB.getBytes()))
                .build();

        if ( kbuilder.hasErrors() ) {
            fail( kbuilder.getErrors().toString() );
        }

        String declarationC = "package org.drools.testA\n" +
                "declare FactC\n" +
                "    field : UnknownClass\n" +
                "end\n";

        kbuilder.add(ResourceFactory.newByteArrayResource(declarationC.getBytes()), ResourceType.DRL);

        assertTrue(kbuilder.hasErrors());
        kbuilder.undo();
        assertFalse(kbuilder.hasErrors());

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

        List list = new ArrayList();
        ksession.setGlobal( "list", list );

        FactType aType = kbase.getFactType( "org.drools.testA", "FactA" );
        Object a = aType.newInstance();
        FactType bType = kbase.getFactType( "org.drools.testB", "FactB" );
        Object b = bType.newInstance();
        aType.set( a, "fieldB", b );
        aType.set( a, "bigint", new BigInteger("1"));
        bType.set( b, "fieldA", a );
        ksession.insert( a );
        ksession.insert( b );

        int rules = ksession.fireAllRules();
        assertEquals(1, rules);
        assertEquals("OK", list.get(0));
    }

    @Test
    public void testUndoTypeDeclaration() throws Exception {
        String rule = "package org.drools.test\n" +
                "import org.drools.test.FactA\n" +
                "import org.drools.test.FactB\n" +
                "rule R1 when\n" +
                "   FactA( i == 1 )\n" +
                "   FactB( i == 1 )\n" +
                "then\n" +
                "   list.add(\"OK\");"+
                "end\n";

        String declarationA = "package org.drools.test\n" +
                "global java.util.List list\n" +
                "declare FactA\n" +
                "    j : int\n" +
                "end\n";

        String declarationB = "package org.drools.test\n" +
                "declare FactB\n" +
                "    i : int\n" +
                "end\n";

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newByteArrayResource(declarationB.getBytes()), ResourceType.DRL);
        assertFalse(kbuilder.hasErrors());

        kbuilder.batch()
                .type(ResourceType.DRL)
                .add(ResourceFactory.newByteArrayResource(rule.getBytes()))
                .add(ResourceFactory.newByteArrayResource(declarationA.getBytes()))
                .build();

        assertTrue(kbuilder.hasErrors());
        kbuilder.undo();
        assertFalse(kbuilder.hasErrors());

        declarationA = "package org.drools.test\n" +
                "global java.util.List list\n" +
                "declare FactA\n" +
                "    i : int\n" +
                "end\n";

        kbuilder.batch()
                .type(ResourceType.DRL)
                .add(ResourceFactory.newByteArrayResource(rule.getBytes()))
                .add(ResourceFactory.newByteArrayResource(declarationA.getBytes()))
                .build();

        assertFalse(kbuilder.hasErrors());

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

        List list = new ArrayList();
        ksession.setGlobal( "list", list );

        FactType aType = kbase.getFactType( "org.drools.test", "FactA" );
        Object a = aType.newInstance();
        aType.set( a, "i", 1 );

        FactType bType = kbase.getFactType( "org.drools.test", "FactB" );
        Object b = bType.newInstance();
        bType.set( b, "i", 1 );

        ksession.insert( a );
        ksession.insert( b );

        int rules = ksession.fireAllRules();
        assertEquals(1, rules);
        assertEquals("OK", list.get(0));
    }

    @Test
    public void testUndoRule() throws Exception {
        String rule = "package org.drools.test\n" +
                "global java.util.List list\n" +
                "import org.drools.test.FactA\n" +
                "import org.drools.test.FactB\n" +
                "rule R1 when\n" +
                "   FactA( j == 1 )\n" +
                "   FactB( i == 1 )\n" +
                "then\n" +
                "   list.add(\"OK\");"+
                "end\n";

        String declarationA = "package org.drools.test\n" +
                "declare FactA\n" +
                "    i : int\n" +
                "end\n";

        String declarationB = "package org.drools.test\n" +
                "declare FactB\n" +
                "    i : int\n" +
                "end\n";

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newByteArrayResource(declarationB.getBytes()), ResourceType.DRL);
        assertFalse(kbuilder.hasErrors());

        kbuilder.batch()
                .type(ResourceType.DRL)
                .add(ResourceFactory.newByteArrayResource(rule.getBytes()))
                .add(ResourceFactory.newByteArrayResource(declarationA.getBytes()))
                .build();

        assertTrue(kbuilder.hasErrors());
        kbuilder.undo();
        assertFalse(kbuilder.hasErrors());

        rule = "package org.drools.test\n" +
                "global java.util.List list\n" +
                "import org.drools.test.FactA\n" +
                "import org.drools.test.FactB\n" +
                "rule R1 when\n" +
                "   FactA( i == 1 )\n" +
                "   FactB( i == 1 )\n" +
                "then\n" +
                "   list.add(\"OK\");"+
                "end\n";

        kbuilder.batch()
                .type(ResourceType.DRL)
                .add(ResourceFactory.newByteArrayResource(rule.getBytes()))
                .add(ResourceFactory.newByteArrayResource(declarationA.getBytes()))
                .build();

        assertFalse(kbuilder.hasErrors());

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

        List list = new ArrayList();
        ksession.setGlobal( "list", list );

        FactType aType = kbase.getFactType( "org.drools.test", "FactA" );
        Object a = aType.newInstance();
        aType.set( a, "i", 1 );

        FactType bType = kbase.getFactType( "org.drools.test", "FactB" );
        Object b = bType.newInstance();
        bType.set( b, "i", 1 );

        ksession.insert( a );
        ksession.insert( b );

        int rules = ksession.fireAllRules();
        assertEquals(1, rules);
        assertEquals("OK", list.get(0));
    }
}
TOP

Related Classes of org.drools.integrationtests.KnowledgeBuilderTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.