[jboss-svn-commits] JBL Code SVN: r27841 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Jul 10 12:20:45 EDT 2009
Author: tirelli
Date: 2009-07-10 12:20:45 -0400 (Fri, 10 Jul 2009)
New Revision: 27841
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_GeneratedBeansSerializable.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java
Log:
JBRULES-2202: making generated types serializable.
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java 2009-07-10 16:13:47 UTC (rev 27840)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java 2009-07-10 16:20:45 UTC (rev 27841)
@@ -21,6 +21,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
+import java.io.Serializable;
import java.io.StringReader;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
@@ -127,7 +128,7 @@
private CompositeClassLoader rootClassLoader;
- private Map<String, Class<?>> globals;
+ private Map<String, Class< ? >> globals;
private Resource resource;
@@ -233,7 +234,7 @@
this.pkgRegistryMap.put( pkg.getName(),
pkgRegistry );
- globals = new HashMap<String, Class<?>>();
+ globals = new HashMap<String, Class< ? >>();
}
public PackageBuilder(RuleBase ruleBase,
@@ -258,7 +259,7 @@
this.ruleBase = (ReteooRuleBase) ruleBase;
- globals = new HashMap<String, Class<?>>();
+ globals = new HashMap<String, Class< ? >>();
}
/**
@@ -381,18 +382,18 @@
this.resource = null;
}
- public void addPackageFromBrl(final Resource resource)
- throws DroolsParserException, IOException {
- this.resource = resource;
+ public void addPackageFromBrl(final Resource resource) throws DroolsParserException,
+ IOException {
+ this.resource = resource;
- String brl = loadBrlFile(resource.getReader());
- RuleModel model = BRXMLPersistence.getInstance().unmarshal(brl);
- String drl = BRDRLPersistence.getInstance().marshal(model);
+ String brl = loadBrlFile( resource.getReader() );
+ RuleModel model = BRXMLPersistence.getInstance().unmarshal( brl );
+ String drl = BRDRLPersistence.getInstance().marshal( model );
final DrlParser parser = new DrlParser();
DefaultExpander expander = getDslExpander();
try {
- String str = expander.expand( new StringReader(drl) );
+ String str = expander.expand( new StringReader( drl ) );
if ( expander.hasErrors() ) {
this.results.addAll( expander.getErrors() );
}
@@ -406,7 +407,7 @@
throw new RuntimeException( e );
}
this.resource = null;
- }
+ }
private String loadBrlFile(final Reader drl) throws IOException {
final StringBuilder buf = new StringBuilder();
@@ -418,7 +419,7 @@
}
return buf.toString();
}
-
+
public void addDsl(Resource resource) throws IOException {
this.resource = resource;
@@ -483,37 +484,37 @@
ResourceType type,
ResourceConfiguration configuration) {
try {
- if ( ResourceType.DRL.equals( type )) {
- ((InternalResource) resource).setResourceType( type );
+ if ( ResourceType.DRL.equals( type ) ) {
+ ((InternalResource) resource).setResourceType( type );
addPackageFromDrl( resource );
- } else if ( ResourceType.DSLR.equals( type )) {
+ } else if ( ResourceType.DSLR.equals( type ) ) {
((InternalResource) resource).setResourceType( type );
addPackageFromDslr( resource );
- } else if ( ResourceType.DSL.equals( type )) {
+ } else if ( ResourceType.DSL.equals( type ) ) {
((InternalResource) resource).setResourceType( type );
addDsl( resource );
- } else if ( ResourceType.XDRL.equals( type )) {
+ } else if ( ResourceType.XDRL.equals( type ) ) {
((InternalResource) resource).setResourceType( type );
addPackageFromXml( resource );
- } else if ( ResourceType.BRL.equals( type )) {
- ((InternalResource) resource).setResourceType( type );
+ } else if ( ResourceType.BRL.equals( type ) ) {
+ ((InternalResource) resource).setResourceType( type );
addPackageFromBrl( resource );
- } else if ( ResourceType.DRF.equals( type )) {
+ } else if ( ResourceType.DRF.equals( type ) ) {
((InternalResource) resource).setResourceType( type );
addProcessFromXml( resource );
- } else if ( ResourceType.DTABLE.equals( type )) {
+ } else if ( ResourceType.DTABLE.equals( type ) ) {
((InternalResource) resource).setResourceType( type );
DecisionTableConfiguration dtableConfiguration = (DecisionTableConfiguration) configuration;
String string = DecisionTableFactory.loadFromInputStream( resource.getInputStream(),
dtableConfiguration );
addPackageFromDrl( new StringReader( string ) );
- } else if ( ResourceType.PKG.equals( type )) {
+ } else if ( ResourceType.PKG.equals( type ) ) {
InputStream is = resource.getInputStream();
Package pkg = (Package) DroolsStreamUtils.streamIn( is );
is.close();
addPackage( pkg );
- } else if ( ResourceType.CHANGE_SET.equals( type )) {
+ } else if ( ResourceType.CHANGE_SET.equals( type ) ) {
((InternalResource) resource).setResourceType( type );
XmlChangeSetReader reader = new XmlChangeSetReader( this.configuration.getSemanticModules() );
if ( resource instanceof ClassPathResource ) {
@@ -545,13 +546,15 @@
}
}
} else {
- ResourceTypeBuilder builder = ResourceTypeBuilderRegistry.getInstance().getResourceTypeBuilder(type);
- if (builder != null) {
- builder.setPackageBuilder(this);
- builder.addKnowledgeResource(resource, type, configuration);
- } else {
- throw new RuntimeException("Unknown resource type: " + type);
- }
+ ResourceTypeBuilder builder = ResourceTypeBuilderRegistry.getInstance().getResourceTypeBuilder( type );
+ if ( builder != null ) {
+ builder.setPackageBuilder( this );
+ builder.addKnowledgeResource( resource,
+ type,
+ configuration );
+ } else {
+ throw new RuntimeException( "Unknown resource type: " + type );
+ }
}
} catch ( RuntimeException e ) {
throw e;
@@ -582,7 +585,7 @@
if ( isEmpty( packageDescr.getNamespace() ) ) {
packageDescr.setNamespace( this.configuration.getDefaultPackageName() );
}
- if( ! checkNamespace( packageDescr.getNamespace() ) ) {
+ if ( !checkNamespace( packageDescr.getNamespace() ) ) {
return;
}
@@ -601,7 +604,8 @@
// only try to compile if there are no parse errors
if ( !hasErrors() ) {
for ( final FactTemplateDescr factTempl : packageDescr.getFactTemplates() ) {
- addFactTemplate( packageDescr, factTempl );
+ addFactTemplate( packageDescr,
+ factTempl );
}
if ( !packageDescr.getFunctions().isEmpty() ) {
@@ -644,7 +648,8 @@
ruleDescr.setNamespace( packageDescr.getNamespace() );
}
if ( isEmpty( ruleDescr.getDialect() ) ) {
- ruleDescr.addAttribute( new AttributeDescr( "dialect", pkgRegistry.getDialect() ) );
+ ruleDescr.addAttribute( new AttributeDescr( "dialect",
+ pkgRegistry.getDialect() ) );
}
addRule( ruleDescr );
}
@@ -670,7 +675,7 @@
*/
private boolean checkNamespace(String newName) {
if ( this.configuration == null ) return true;
- if( (! this.pkgRegistryMap.isEmpty()) && (! this.pkgRegistryMap.containsKey( newName )) ) {
+ if ( (!this.pkgRegistryMap.isEmpty()) && (!this.pkgRegistryMap.containsKey( newName )) ) {
return this.configuration.isAllowMultipleNamespaces();
}
return true;
@@ -904,7 +909,7 @@
final String identifier = global.getIdentifier();
final String className = global.getType();
- Class<?> clazz;
+ Class< ? > clazz;
try {
clazz = pkgRegistry.getTypeResolver().resolveType( className );
pkgRegistry.getPackage().addGlobal( identifier,
@@ -1016,10 +1021,10 @@
}
type.setExpirationOffset( timeParser.parse( expiration )[0].longValue() );
}
-
+
boolean dynamic = typeDescr.getMetaAttributes().containsKey( TypeDeclaration.ATTR_PROP_CHANGE_SUPPORT );
type.setDynamic( dynamic );
-
+
pkgRegistry.getPackage().addTypeDeclaration( type );
}
}
@@ -1069,7 +1074,10 @@
// need to fix classloader?
ClassBuilder cb = new ClassBuilder();
String fullName = typeDescr.getNamespace() + "." + typeDescr.getTypeName();
- ClassDefinition def = new ClassDefinition( fullName );
+ // generated beans should be serializable
+ ClassDefinition def = new ClassDefinition( fullName,
+ Object.class.getName(),
+ new String[]{Serializable.class.getName()} );
Map<String, TypeFieldDescr> flds = typeDescr.getFields();
try {
for ( TypeFieldDescr field : flds.values() ) {
@@ -1120,7 +1128,8 @@
pkgRegistry.getTypeResolver() );
}
- private void addFactTemplate(final PackageDescr pkgDescr, final FactTemplateDescr factTemplateDescr) {
+ private void addFactTemplate(final PackageDescr pkgDescr,
+ final FactTemplateDescr factTemplateDescr) {
final List fields = new ArrayList();
int index = 0;
PackageRegistry pkgRegistry = this.pkgRegistryMap.get( pkgDescr.getNamespace() );
@@ -1186,8 +1195,8 @@
*/
public Package getPackage() {
PackageRegistry pkgRegistry = null;
- if( ! this.pkgRegistryMap.isEmpty() ) {
- pkgRegistry = (PackageRegistry) this.pkgRegistryMap.values().toArray()[0];
+ if ( !this.pkgRegistryMap.isEmpty() ) {
+ pkgRegistry = (PackageRegistry) this.pkgRegistryMap.values().toArray()[0];
}
Package pkg = null;
if ( pkgRegistry != null ) {
@@ -1249,7 +1258,7 @@
return expander;
}
- public Map<String, Class<?>> getGlobals() {
+ public Map<String, Class< ? >> getGlobals() {
return this.globals;
}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2009-07-10 16:13:47 UTC (rev 27840)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2009-07-10 16:20:45 UTC (rev 27841)
@@ -21,11 +21,14 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.Reader;
+import java.io.Serializable;
import java.io.StringReader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Collection;
+import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -151,6 +154,11 @@
import org.drools.util.ObjectHashSet;
import org.drools.util.ObjectHashMap.ObjectEntry;
import org.drools.xml.XmlDumper;
+import org.mvel2.MVEL;
+import org.mvel2.ParserContext;
+import org.mvel2.compiler.CompiledExpression;
+import org.mvel2.compiler.ExpressionCompiler;
+import org.mvel2.optimizers.OptimizerFactory;
/** Run all the tests with the ReteOO engine implementation */
public class MiscTest extends TestCase {
@@ -1180,45 +1188,6 @@
list.get( 0 ) );
}
- public void FIXMEtestDeclaredFactWithoutFields() throws Exception {
- String rule = "package com.jboss.qa;\n";
- rule += "global java.util.List list\n";
- rule += "declare Address\n";
- rule += "end\n";
- rule += "rule \"r1\"\n";
- rule += " dialect \"mvel\"\n";
- rule += "when\n";
- rule += " Address()\n";
- rule += "then\n";
- rule += " list.add(\"r1\");\n";
- rule += "end\n";
-
- final PackageBuilder builder = new PackageBuilder();
- builder.addPackageFromDrl( new StringReader( rule ) );
- final Package pkg = builder.getPackage();
-
- final RuleBase ruleBase = getRuleBase();
- ruleBase.addPackage( pkg );
- StatefulSession session = ruleBase.newStatefulSession();
-
- List list = new ArrayList();
- session.setGlobal( "list",
- list );
-
- FactType addressFact = ruleBase.getFactType( "com.jboss.qa.Address" );
- Object address = addressFact.newInstance();
- session.insert( address );
- session.fireAllRules();
-
- list = (List) session.getGlobal( "list" );
- assertEquals( 1,
- list.size() );
-
- assertEquals( "r1",
- list.get( 0 ) );
-
- }
-
public void testNullHandling() throws Exception {
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_NullHandling.drl" ) ) );
@@ -6871,4 +6840,59 @@
}
+ public void testGeneratedBeansSerializable() throws Exception {
+ final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_GeneratedBeansSerializable.drl" ) ),
+ ResourceType.DRL );
+ assertFalse( kbuilder.getErrors().toString(),
+ kbuilder.hasErrors() );
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ // test kbase serialization
+ kbase = SerializationHelper.serializeObject( kbase );
+
+ // Retrieve the generated fact type
+ FactType cheeseFact = kbase.getFactType( "org.drools.generatedbeans",
+ "Cheese" );
+
+ assertTrue( "Generated beans must be serializable",
+ Serializable.class.isAssignableFrom( cheeseFact.getFactClass() ));
+
+ // Create a new Fact instance
+ Object cheese = cheeseFact.newInstance();
+ cheeseFact.set( cheese,
+ "type",
+ "stilton" );
+
+ // another instance
+ Object cheese2 = cheeseFact.newInstance();
+ cheeseFact.set( cheese2,
+ "type",
+ "brie" );
+
+ // creating a stateful session
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
+ List<Number> results = new ArrayList<Number>();
+ ksession.setGlobal( "results",
+ results );
+
+ // inserting fact
+ ksession.insert( cheese );
+ ksession.insert( cheese2 );
+
+ // firing rules
+ ksession.fireAllRules();
+
+ // checking results
+ assertEquals( 1,
+ results.size() );
+ assertEquals( 2,
+ results.get( 0 ).intValue() );
+
+ }
+
+
}
+
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_GeneratedBeansSerializable.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_GeneratedBeansSerializable.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_GeneratedBeansSerializable.drl 2009-07-10 16:20:45 UTC (rev 27841)
@@ -0,0 +1,15 @@
+package org.drools.generatedbeans;
+
+global java.util.List results
+
+declare Cheese
+ type: String
+ value: double
+end
+
+rule "Accumulate Count"
+ when
+ $n : Number() from accumulate($c : Cheese(), count($c))
+ then
+ results.add( $n );
+end
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java 2009-07-10 16:13:47 UTC (rev 27840)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/accumulators/JavaAccumulatorFunctionExecutor.java 2009-07-10 16:20:45 UTC (rev 27841)
@@ -25,9 +25,9 @@
import java.util.HashMap;
import java.util.Map;
+import org.drools.WorkingMemory;
import org.drools.common.InternalFactHandle;
import org.drools.rule.Declaration;
-import org.drools.WorkingMemory;
import org.drools.spi.Accumulator;
import org.drools.spi.CompiledInvoker;
import org.drools.spi.ReturnValueExpression;
@@ -81,7 +81,7 @@
JavaAccumulatorFunctionContext context = new JavaAccumulatorFunctionContext();
context.context = this.function.createContext();
if ( this.function.supportsReverse() ) {
- context.reverseSupport = new HashMap<Integer, Serializable>();
+ context.reverseSupport = new HashMap<Integer, Object>();
}
return context;
}
@@ -107,7 +107,7 @@
Declaration[] declarations,
Declaration[] innerDeclarations,
WorkingMemory workingMemory) throws Exception {
- final Serializable value = (Serializable) this.expression.evaluate( handle.getObject(),
+ final Object value = this.expression.evaluate( handle.getObject(),
leftTuple,
declarations,
innerDeclarations,
@@ -170,7 +170,7 @@
implements
Externalizable {
public Serializable context;
- public Map<Integer, Serializable> reverseSupport;
+ public Map<Integer, Object> reverseSupport;
public JavaAccumulatorFunctionContext() {
}
@@ -178,7 +178,7 @@
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
context = (Externalizable) in.readObject();
- reverseSupport = (Map<Integer, Serializable>) in.readObject();
+ reverseSupport = (Map<Integer, Object>) in.readObject();
}
public void writeExternal(ObjectOutput out) throws IOException {
More information about the jboss-svn-commits
mailing list