[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