/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.core.util;
import java.io.IOException;
import java.io.InputStream;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.RuntimeDroolsException;
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 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 {
Object opkg = DroolsStreamUtils.streamIn(in, classLoader);
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;
}
}