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.