📄 packagebuildertest.java
字号:
package org.drools.compiler;
/*
* 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 java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.jci.compilers.EclipseJavaCompiler;
import org.apache.commons.jci.compilers.EclipseJavaCompilerSettings;
import org.apache.commons.jci.compilers.JaninoJavaCompiler;
import org.apache.commons.jci.compilers.JavaCompiler;
import org.drools.Cheese;
import org.drools.DroolsTestCase;
import org.drools.FactHandle;
import org.drools.Primitives;
import org.drools.WorkingMemory;
import org.drools.common.ActivationGroupNode;
import org.drools.common.InternalFactHandle;
import org.drools.common.LogicalDependency;
import org.drools.lang.descr.AndDescr;
import org.drools.lang.descr.ColumnDescr;
import org.drools.lang.descr.ConditionalElementDescr;
import org.drools.lang.descr.EvalDescr;
import org.drools.lang.descr.ExistsDescr;
import org.drools.lang.descr.FieldBindingDescr;
import org.drools.lang.descr.LiteralDescr;
import org.drools.lang.descr.NotDescr;
import org.drools.lang.descr.OrDescr;
import org.drools.lang.descr.PackageDescr;
import org.drools.lang.descr.PatternDescr;
import org.drools.lang.descr.PredicateDescr;
import org.drools.lang.descr.ReturnValueDescr;
import org.drools.lang.descr.RuleDescr;
import org.drools.reteoo.ReteooRuleBase;
import org.drools.rule.And;
import org.drools.rule.BoundVariableConstraint;
import org.drools.rule.Column;
import org.drools.rule.Declaration;
import org.drools.rule.EvalCondition;
import org.drools.rule.Exists;
import org.drools.rule.LiteralConstraint;
import org.drools.rule.Not;
import org.drools.rule.Or;
import org.drools.rule.Package;
import org.drools.rule.PredicateConstraint;
import org.drools.rule.ReturnValueConstraint;
import org.drools.rule.Rule;
import org.drools.spi.CompiledInvoker;
import org.drools.spi.Activation;
import org.drools.spi.KnowledgeHelper;
import org.drools.spi.PropagationContext;
import org.drools.spi.Tuple;
import org.drools.util.LinkedList;
public class PackageBuilderTest extends DroolsTestCase {
public void testErrors() throws Exception {
final PackageBuilder builder = new PackageBuilder();
final PackageDescr packageDescr = new PackageDescr( "p1" );
final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
packageDescr.addRule( ruleDescr );
final AndDescr lhs = new AndDescr();
ruleDescr.setLhs( lhs );
final ColumnDescr column = new ColumnDescr( Cheese.class.getName(),
"stilton" );
lhs.addDescr( column );
FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
"x" );
column.addDescr( fieldBindingDescr );
fieldBindingDescr = new FieldBindingDescr( "price",
"y" );
column.addDescr( fieldBindingDescr );
packageDescr.addGlobal( "map",
"java.util.Map" );
final ReturnValueDescr returnValue = new ReturnValueDescr( "price",
"==",
"x" );
column.addDescr( returnValue );
// There is no m this should produce errors.
ruleDescr.setConsequence( "modify(m);" );
builder.addPackage( packageDescr );
assertLength( 1,
builder.getErrors() );
}
public void testErrorsInParser() throws Exception {
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( this.getClass().getResourceAsStream( "bad_rule.drl" ) ) );
assertTrue( builder.hasErrors() );
}
public void testReload() throws Exception {
final PackageBuilder builder = new PackageBuilder();
final PackageDescr packageDescr = new PackageDescr( "p1" );
final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
packageDescr.addRule( ruleDescr );
final AndDescr lhs = new AndDescr();
ruleDescr.setLhs( lhs );
packageDescr.addGlobal( "map",
"java.util.Map" );
ruleDescr.setConsequence( "map.put(\"value\", new Integer(1) );" );
builder.addPackage( packageDescr );
final Package pkg = builder.getPackage();
Rule rule = pkg.getRule( "rule-1" );
assertLength( 0,
builder.getErrors() );
final ReteooRuleBase ruleBase = new ReteooRuleBase();
ruleBase.getGlobals().put( "map",
Map.class );
final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
final HashMap map = new HashMap();
workingMemory.setGlobal( "map",
map );
final Tuple tuple = new MockTuple( new HashMap() );
final Activation activation = new MockActivation( rule,
tuple );
KnowledgeHelper knowledgeHelper = new org.drools.base.DefaultKnowledgeHelper( activation,
workingMemory );
rule.getConsequence().evaluate( knowledgeHelper,
workingMemory );
assertEquals( new Integer( 1 ),
map.get( "value" ) );
ruleDescr.setConsequence( "map.put(\"value\", new Integer(2) );" );
pkg.removeRule( rule );
// Make sure the compiled classes are also removed
assertEquals( 0,
pkg.getPackageCompilationData().list().length );
builder.addPackage( packageDescr );
rule = pkg.getRule( "rule-1" );
knowledgeHelper = new org.drools.base.DefaultKnowledgeHelper( activation,
workingMemory );
rule.getConsequence().evaluate( knowledgeHelper,
workingMemory );
assertEquals( new Integer( 2 ),
map.get( "value" ) );
}
public void testSerializable() throws Exception {
final PackageBuilder builder = new PackageBuilder();
final PackageDescr packageDescr = new PackageDescr( "p1" );
final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
packageDescr.addRule( ruleDescr );
final AndDescr lhs = new AndDescr();
ruleDescr.setLhs( lhs );
packageDescr.addGlobal( "map",
"java.util.Map" );
ruleDescr.setConsequence( "map.put(\"value\", new Integer(1) );" );
//check that packageDescr is serializable
final byte[] ast = serializeOut( packageDescr );
final PackageDescr back = (PackageDescr) serializeIn( ast );
assertNotNull( back );
assertEquals( "p1",
back.getName() );
builder.addPackage( packageDescr );
final Package pkg = builder.getPackage();
final Rule rule = pkg.getRule( "rule-1" );
assertLength( 0,
builder.getErrors() );
final byte[] bytes = serializeOut( pkg );
// Deserialize from a byte array
final Package newPkg = (Package) serializeIn( bytes );
final Rule newRule = newPkg.getRule( "rule-1" );
final ReteooRuleBase ruleBase = new ReteooRuleBase();
ruleBase.getGlobals().put( "map",
Map.class );
final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
final HashMap map = new HashMap();
workingMemory.setGlobal( "map",
map );
final Tuple tuple = new MockTuple( new HashMap() );
final Activation activation = new MockActivation( newRule,
tuple );
final KnowledgeHelper knowledgeHelper = new org.drools.base.DefaultKnowledgeHelper( activation,
workingMemory );
newRule.getConsequence().evaluate( knowledgeHelper,
workingMemory );
assertEquals( new Integer( 1 ),
map.get( "value" ) );
}
private Object serializeIn(final byte[] bytes) throws IOException,
ClassNotFoundException {
final ObjectInput in = new ObjectInputStream( new ByteArrayInputStream( bytes ) );
final Object obj = in.readObject();
in.close();
return obj;
}
private byte[] serializeOut(final Object obj) throws IOException {
// Serialize to a byte array
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final ObjectOutput out = new ObjectOutputStream( bos );
out.writeObject( obj );
out.close();
// Get the bytes of the serialized object
final byte[] bytes = bos.toByteArray();
return bytes;
}
public void testNoPackageName() {
final PackageBuilder builder = new PackageBuilder();
try {
builder.addPackage( new PackageDescr( null ) );
fail( "should have errored here." );
} catch ( final RuntimeException e ) {
assertNotNull( e.getMessage() );
}
try {
builder.addPackage( new PackageDescr( "" ) );
fail( "should have errored here." );
} catch ( final RuntimeException e ) {
assertNotNull( e.getMessage() );
}
}
public void testLiteral() throws Exception {
final PackageBuilder builder = new PackageBuilder();
final PackageDescr packageDescr = new PackageDescr( "p1" );
final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
packageDescr.addRule( ruleDescr );
final AndDescr lhs = new AndDescr();
ruleDescr.setLhs( lhs );
final ColumnDescr column = new ColumnDescr( Cheese.class.getName(),
"stilton" );
lhs.addDescr( column );
final LiteralDescr listeralDescr = new LiteralDescr( "type",
"==",
"stilton" );
column.addDescr( listeralDescr );
ruleDescr.setConsequence( "modify(stilton);" );
builder.addPackage( packageDescr );
assertLength( 0,
builder.getErrors() );
}
public void testReturnValue() throws Exception {
final PackageBuilder builder = new PackageBuilder();
final PackageDescr packageDescr = new PackageDescr( "p1" );
final RuleDescr ruleDescr = new RuleDescr( "rule-1" );
packageDescr.addRule( ruleDescr );
final AndDescr lhs = new AndDescr();
ruleDescr.setLhs( lhs );
final ColumnDescr column = new ColumnDescr( Cheese.class.getName(),
"stilton" );
lhs.addDescr( column );
FieldBindingDescr fieldBindingDescr = new FieldBindingDescr( "price",
"x" );
column.addDescr( fieldBindingDescr );
fieldBindingDescr = new FieldBindingDescr( "price",
"y" );
column.addDescr( fieldBindingDescr );
packageDescr.addGlobal( "map",
"java.util.Map" );
final ReturnValueDescr returnValue = new ReturnValueDescr( "price",
"==",
"new Integer(( ( ( Integer )map.get(x) ).intValue() * y.intValue()))" );
column.addDescr( returnValue );
ruleDescr.setConsequence( "modify(stilton);" );
builder.addPackage( packageDescr );
assertLength( 0,
builder.getErrors() );
}
public void testReturnValueMethodCompare() {
final PackageBuilder builder1 = new PackageBuilder();
final PackageDescr packageDescr1 = new PackageDescr( "package1" );
createReturnValueRule( packageDescr1,
"new Integer(x.intValue() + y.intValue() )" );
builder1.addPackage( packageDescr1 );
final Column column1 = (Column) builder1.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
final ReturnValueConstraint returnValue1 = (ReturnValueConstraint) column1.getConstraints().get( 2 );
final PackageBuilder builder2 = new PackageBuilder();
final PackageDescr packageDescr2 = new PackageDescr( "package2" );
createReturnValueRule( packageDescr2,
"new Integer(x.intValue() + y.intValue() )" );
builder2.addPackage( packageDescr2 );
final Column column2 = (Column) builder2.getPackage().getRules()[0].getLhs().getChildren().get( 0 );
final ReturnValueConstraint returnValue2 = (ReturnValueConstraint) column2.getConstraints().get( 2 );
final PackageBuilder builder3 = new PackageBuilder();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -