Package org.drools.util

Source Code of org.drools.util.BinaryRuleBaseLoader

package org.drools.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;

import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.RuntimeDroolsException;
import org.drools.common.DroolsObjectInputStream;
import org.drools.rule.Package;

/**
* This loads up rulebases from binary packages.
* Can work with an existing or a new rulebase.
* This is useful for deployment.
*
* @author Michael Neale
*/
public class BinaryRuleBaseLoader {

    private RuleBase    ruleBase;
    private ClassLoader classLoader;

    /**
     * This will create a new default rulebase (which is initially empty).
     * Optional parent classLoader for the Package's internal ClassLoader
     * is Thread.currentThread.getContextClassLoader()
     */
    public BinaryRuleBaseLoader() {
        this( RuleBaseFactory.newRuleBase(), null );
    }   

    /**
     * This will add any binary packages to the rulebase.
     * Optional parent classLoader for the Package's internal ClassLoader
     * is Thread.currentThread.getContextClassLoader()
     */
    public BinaryRuleBaseLoader(RuleBase rb) {
        this( rb, null);
    }

    /**
     * This will add any binary packages to the rulebase.
     * Optional classLoader to be used as the parent ClassLoader
     * for the Package's internal ClassLoader, is Thread.currentThread.getContextClassLoader()
     * if not user specified.
     */
    public BinaryRuleBaseLoader(RuleBase rb, ClassLoader classLoader) {
        if ( classLoader == null ) {
            classLoader = Thread.currentThread().getContextClassLoader();
            if ( classLoader == null ) {
                classLoader = this.getClass().getClassLoader();
            }
        }       
        this.ruleBase = rb;
        this.classLoader = classLoader;
    }
   
    /**
     * This will add the BINARY package to the rulebase.
     * Uses the member ClassLoader as the Package's internal parent classLoader
     * which is Thread.currentThread.getContextClassLoader if not user specified
     * @param in An input stream to the serialized package.
     */   
    public void addPackage(InputStream in) {
        addPackage(in, this.classLoader);
    }

    /**
     * This will add the BINARY package to the rulebase.
     * @param in An input stream to the serialized package.
     * @param optional classLoader used as the parent ClassLoader for the Package's internal ClassLaoder 
     */   
    public void addPackage(InputStream in, ClassLoader classLoader) {
        if ( classLoader == null ) {
            classLoader = this.classLoader;
        }
       
        try {
            ObjectInputStream oin = new DroolsObjectInputStream( in, classLoader);
            Object opkg = oin.readObject();
            if ( !(opkg instanceof Package) ) {
                throw new IllegalArgumentException( "Can only add instances of org.drools.rule.Package to a rulebase instance." );
            }
            Package binPkg = (Package) opkg;

            if ( !binPkg.isValid() ) {
                throw new IllegalArgumentException( "Can't add a non valid package to a rulebase." );
            }

            try {
                this.ruleBase.addPackage( binPkg );
            } catch ( Exception e ) {
                throw new RuntimeDroolsException( "Unable to add package to the rulebase.",
                                                  e );
            }

        } catch ( IOException e ) {
            throw new RuntimeDroolsException( e );
        } catch ( ClassNotFoundException e ) {
            throw new RuntimeDroolsException( e );
        } finally {
            try {
                in.close();
            } catch ( IOException e ) {
                throw new RuntimeException( e );
            }
        }

    }

    public RuleBase getRuleBase() {
        return this.ruleBase;
    }

}
TOP

Related Classes of org.drools.util.BinaryRuleBaseLoader

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.