Package org.drools.integrationtests

Source Code of org.drools.integrationtests.ScannerChangeSetTest

package org.drools.integrationtests;

import static org.junit.Assert.assertEquals;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

import org.drools.KnowledgeBase;
import org.drools.SystemEventListenerFactory;
import org.drools.agent.KnowledgeAgent;
import org.drools.agent.KnowledgeAgentFactory;
import org.drools.agent.impl.PrintStreamSystemEventListener;
import org.drools.compiler.PackageBuilder;
import org.drools.core.util.DroolsStreamUtils;
import org.drools.io.ResourceChangeScannerConfiguration;
import org.drools.io.ResourceFactory;
import org.drools.rule.Package;
import org.drools.rule.Rule;
import org.junit.Test;

public class ScannerChangeSetTest {

    public static final String TMP_DIR = "target/classes/";
   
    @Test
    public void testPKGByResourceChangeScanner() throws Exception {
       
        SystemEventListenerFactory.setSystemEventListener(new PrintStreamSystemEventListener(System.out));       

        // create a PKG file
        PackageBuilder builder = new PackageBuilder();
        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "Sample.drl" ) ) );
        Package pkg = builder.getPackage();
       
        byte[] blob1 = DroolsStreamUtils.streamOut( pkg );
        File file = new File( TMP_DIR + "rules.pkg");
        writeBinaryFile( file,
                         blob1 );
        Thread.sleep(1100);
       
        // changeset
        String XLS_CHANGESET =
            "<change-set xmlns=\"http://drools.org/drools-5.0/change-set\"\n" +
            "            xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
            "            xs:schemaLocation=\"http://drools.org/drools-5.0/change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd\">\n" +
            "  <add>\n" +
            "    <resource source=\"file:" + file.getAbsolutePath() + "\" type=\"PKG\" />\n" +
            "  </add>\n" +
            "</change-set>\n";
        File xlsChangeset = new File(TMP_DIR + "pkgChangeset.xml");
        xlsChangeset.deleteOnExit();
        writeToFile(xlsChangeset, XLS_CHANGESET);
       
        // scan every second
        ResourceChangeScannerConfiguration config = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
        config.setProperty("drools.resource.scanner.interval", "1");
        ResourceFactory.getResourceChangeScannerService().configure(config);
       
        // create knowledge agent
        KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent("xls agent");
        kagent.applyChangeSet(ResourceFactory.newFileResource(xlsChangeset));
        KnowledgeBase kbase = kagent.getKnowledgeBase();

        ResourceFactory.getResourceChangeNotifierService().start();
        ResourceFactory.getResourceChangeScannerService().start();

        assertEquals(1, kbase.getKnowledgePackages().size());
        assertEquals(2, kbase.getKnowledgePackages().iterator().next()
                .getRules().size());

        // after some waiting we change number of rules in the file
        Rule hw = pkg.getRule( "Hello World" );
        pkg.removeRule( hw );
        byte[] blob2 = DroolsStreamUtils.streamOut( pkg );
       
        // scanner should notice the change
        Thread.sleep(1500);
        writeBinaryFile( file,
                         blob2 );
        Thread.sleep(1500);
        try {
            kbase = kagent.getKnowledgeBase();
            assertEquals(1, kbase.getKnowledgePackages().size());
            assertEquals(1, kbase.getKnowledgePackages().iterator().next()
                    .getRules().size());
        } finally {
            ResourceFactory.getResourceChangeNotifierService().stop();
            ResourceFactory.getResourceChangeScannerService().stop();
            file.delete();
            kagent.dispose();
        }
    }

    private void writeBinaryFile( File file, byte[] blob1 ) throws FileNotFoundException, IOException {
        file.delete();
        FileOutputStream out = new FileOutputStream( file );
        out.write( blob1 );
        out.close();
    }
   
    private static void writeToFile(File file, String content) throws Exception {
        FileWriter fw = null;

        try {
            fw = new FileWriter(file);
            fw.write(content);
        } finally {
            if (fw != null) fw.close();
        }
    }
}
TOP

Related Classes of org.drools.integrationtests.ScannerChangeSetTest

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.