/**
* 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.reteoo;
/*
* Copyright 2005 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.
*/
import org.drools.DroolsTestCase;
import org.drools.RuleBaseFactory;
import org.drools.SessionConfiguration;
import org.drools.StatefulSession;
import org.drools.base.ClassFieldAccessorCache;
import org.drools.WorkingMemory;
public class ReteooRuleBaseTest extends DroolsTestCase {
ReteooRuleBase ruleBase;
StatefulSession wm1;
StatefulSession wm2;
StatefulSession wm3;
StatefulSession wm4;
public void setUp() {
this.ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
this.wm1 = this.ruleBase.newStatefulSession();
this.wm2 = this.ruleBase.newStatefulSession();
this.wm3 = this.ruleBase.newStatefulSession();
this.wm4 = this.ruleBase.newStatefulSession();
}
public void testKeepReference() throws Exception {
/* Make sure the RuleBase is referencing all 4 Working Memories */
assertLength( 4,
this.ruleBase.getStatefulSessions() );
assertContains( this.wm1, this.ruleBase.getStatefulSessions() );
assertContains( this.wm2, this.ruleBase.getStatefulSessions() );
assertContains( this.wm3, this.ruleBase.getStatefulSessions() );
assertContains( this.wm4, this.ruleBase.getStatefulSessions() );
}
public void testDispose() throws Exception {
/*
* Now lets test the dispose method on the WorkingMemory itself. dispose
* doesn't need GC
*/
this.wm3.dispose();
/* Check only wm3 was removed */
assertLength( 3,
this.ruleBase.getStatefulSessions() );
assertNotContains( this.wm3, this.ruleBase.getStatefulSessions() );
}
public void testNoKeepReference() throws Exception {
SessionConfiguration conf = new SessionConfiguration();
conf.setKeepReference( false );
final WorkingMemory wm5 = this.ruleBase.newStatefulSession( conf, null );
final WorkingMemory wm6 = this.ruleBase.newStatefulSession( conf, null );
assertLength( 4,
this.ruleBase.getStatefulSessions() );
assertNotContains( wm5, this.ruleBase.getStatefulSessions() );
assertNotContains( wm6, this.ruleBase.getStatefulSessions() );
}
public void testAddPackage() throws Exception {
final org.drools.rule.Package pkg1 = new org.drools.rule.Package( "org.droos.test" );
pkg1.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
pkg1.addGlobal( "global1",
Object.class );
pkg1.addGlobal( "global2",
Object.class );
final org.drools.rule.Package pkg2 = new org.drools.rule.Package( "org.droos.test" );
pkg2.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
pkg2.addGlobal( "global1",
Object.class );
pkg2.addGlobal( "global3",
Object.class );
final org.drools.rule.Package pkg3 = new org.drools.rule.Package( "org.droos.test2" );
pkg3.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
pkg3.addGlobal( "global3",
Object.class );
pkg3.addGlobal( "global4",
Object.class );
this.ruleBase.addPackage( pkg1 );
// one package
assertLength( 1,
this.ruleBase.getPackages() );
// two globals
assertLength( 2,
this.ruleBase.getGlobals().values() );
// two globals in the package also
assertLength( 2,
this.ruleBase.getPackages()[0].getGlobals().values() );
this.ruleBase.addPackage( pkg2 );
// packages merged, so still 1 package
assertLength( 1,
this.ruleBase.getPackages() );
// globals merged, so 3 globals total
assertLength( 3,
this.ruleBase.getGlobals().values() );
// three globals in the package also
assertLength( 3,
this.ruleBase.getPackages()[0].getGlobals().values() );
this.ruleBase.addPackage( pkg3 );
// new package, so now we have 2 package
assertLength( 2,
this.ruleBase.getPackages() );
// globals partially merged, so 4 globals total
assertLength( 4,
this.ruleBase.getGlobals().values() );
// two globals in the package
final org.drools.rule.Package[] pkgs = this.ruleBase.getPackages();
for ( int i = 0; i < pkgs.length; i++ ) {
if ( pkgs[i].getName().equals( pkg3.getName() ) ) {
assertLength( 2,
pkgs[i].getGlobals().values() );
}
}
}
public void testRemovePackage() throws Exception {
final org.drools.rule.Package pkg1 = new org.drools.rule.Package( "org.droos.test" );
pkg1.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
pkg1.addGlobal( "global1",
Object.class );
pkg1.addGlobal( "global2",
Object.class );
final org.drools.rule.Package pkg2 = new org.drools.rule.Package( "org.droos.test" );
pkg2.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
pkg2.addGlobal( "global1",
Object.class );
pkg2.addGlobal( "global3",
Object.class );
final org.drools.rule.Package pkg3 = new org.drools.rule.Package( "org.droos.test2" );
pkg3.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
pkg3.addGlobal( "global3",
Object.class );
pkg3.addGlobal( "global4",
Object.class );
this.ruleBase.addPackage( pkg1 );
this.ruleBase.addPackage( pkg2 );
this.ruleBase.addPackage( pkg3 );
this.ruleBase.removePackage( pkg1.getName() );
// packages were partially merged when adding, so removal
// shall left only package 3 behind
assertLength( 1,
this.ruleBase.getPackages() );
assertLength( 2,
this.ruleBase.getGlobals().values() );
this.ruleBase.removePackage( pkg3.getName() );
assertLength( 0,
this.ruleBase.getPackages() );
assertLength( 0,
this.ruleBase.getGlobals().values() );
}
}