Package org.drools.agent

Source Code of org.drools.agent.KnowledgeAgentIncrementalWithTMSTest

package org.drools.agent;

import org.drools.ChangeSet;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.Message;
import org.drools.builder.*;
import org.drools.common.DefaultFactHandle;
import org.drools.common.EqualityKey;
import org.drools.common.LogicalDependency;
import org.drools.common.TruthMaintenanceSystem;
import org.drools.core.util.*;
import org.drools.definition.KnowledgePackage;
import org.drools.impl.StatefulKnowledgeSessionImpl;
import org.drools.io.ResourceFactory;
import org.drools.io.impl.ChangeSetImpl;
import org.drools.io.impl.FileSystemResource;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
import org.junit.Test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.fail;


/**
* JBRULES 3543 KnowledgeAgent: Doesn't remove insertLogical() Facts correctly on incremental build
*/
public class KnowledgeAgentIncrementalWithTMSTest extends BaseKnowledgeAgentTest {

    private KnowledgeAgentConfiguration agentConfig;
    private KnowledgeAgent kAgent;
    private StatefulKnowledgeSession ksession;
    private File res;
    private FileManager fileManager = new FileManager();



    @Test
    public void testKnowledgeAgentIncrementalWithTMS() {
        try {
            createRuleResource();

            KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
            KnowledgeAgent kAgent = createKAgent( kbase, false );

            ChangeSetHelperImpl cs = new ChangeSetHelperImpl();
            FileSystemResource f = (FileSystemResource) ResourceFactory.newFileResource(res);
            f.setResourceType( ResourceType.DRL );
            cs.addNewResource( f );
            kAgent.applyChangeSet( cs.getChangeSet() );

            ksession = kAgent.getKnowledgeBase().newStatefulKnowledgeSession();

            TruthMaintenanceSystem tms = ((StatefulKnowledgeSessionImpl)ksession).session.getTruthMaintenanceSystem();


            Message message = new Message( );
            message.setMessage("Hello World");
            message.setStatus(Message.HELLO);
            FactHandle fact = ksession.insert(message);

            Message message2 = new Message();
            message2.setMessage("Hello World 2");
            message2.setStatus(Message.HELLO);
            FactHandle fact2 = ksession.insert(message2);

            Message message3 = new Message();
            message3.setMessage("Hello World 3");
            message3.setStatus(Message.HELLO);
            FactHandle fact3 = ksession.insert(message3);

            ksession.fireAllRules();

            assertEquals( 12, ksession.getObjects().size() );

            ChangeSetHelperImpl cs2 = new ChangeSetHelperImpl();
            cs2.addRemovedResource( ResourceFactory.newFileResource( res ) );

            kAgent.applyChangeSet( cs2.getChangeSet() );

            KnowledgePackage kp = kAgent.getKnowledgeBase().getKnowledgePackage( "com.sample" );
            assertEquals(0, kp.getRules().size());

            ksession.fireAllRules();

            assertEquals(3, ksession.getObjects().size() );

            //logger.close();

            ksession.dispose();
            kAgent.dispose();
        } catch ( Throwable t ) {
            t.printStackTrace();
            fail( t.getMessage() );
        }

    }

    private void reportDependencies( TruthMaintenanceSystem tms, int expectedNum ) {
        ObjectHashMap jhm = tms.getJustifiedMap();
        for ( Object o : ksession.getObjects() ) {
            EqualityKey key = tms.get( o );
            if ( Object.class.equals(o.getClass()) ) {
                assertEquals( EqualityKey.JUSTIFIED, key.getStatus() );
                DefaultFactHandle handle = (DefaultFactHandle) ksession.getFactHandle( o );
                List<LogicalDependency> justifiers = collectJustifiers( handle, jhm );

                assertEquals( expectedNum, justifiers.size() );

                System.out.println( "-------------------------------");
                System.out.println( "Justified Object " + o );
                System.out.println( "\t\t " + justifiers );
                System.out.println( "-------------------------------");

            } else if ( Message.class.equals( o.getClass() ) ) {
                assertEquals( EqualityKey.STATED, key.getStatus() );
            }
        }
    }

    private List<LogicalDependency> collectJustifiers(DefaultFactHandle handle, ObjectHashMap jhm) {
        List<LogicalDependency> justifiers = new ArrayList<LogicalDependency>();
        LinkedList entryList = (LinkedList) jhm.get( handle.getId() );
        Iterator sub = entryList.iterator();
        LinkedListEntry lle;
        while ( ( lle = (LinkedListEntry) sub.next() ) != null ) {
            LogicalDependency dep = (LogicalDependency) lle.getObject();
            justifiers.add( dep );
        }

        return justifiers;
    }




    private void createRuleResource() {
        String ruleString = "package com.sample\n" +
                " \n" +
                "import org.drools.Message;\n" +
                " \n" +
                "rule \"Hello World\"\n" +
                "    when\n" +
                "        Message()\n" +
                "        Message(status == Message.HELLO)\n" +
                "    then\n" +
                "        insertLogical( new Object() );\n" +
                "end";
        try {
            res = fileManager.write( "rule.drl", ruleString );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void removeRuleResource() {
        fileManager.deleteFile(res);
    }


}
TOP

Related Classes of org.drools.agent.KnowledgeAgentIncrementalWithTMSTest

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.