[jboss-svn-commits] JBL Code SVN: r11111 - in labs/jbossrules/trunk/drools-jbrms/src: main/java/org/drools/brms/server/contenthandler and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Apr 19 03:52:51 EDT 2007


Author: michael.neale at jboss.com
Date: 2007-04-19 03:52:51 -0400 (Thu, 19 Apr 2007)
New Revision: 11111

Modified:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/BRMSPackageBuilder.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentPackageAssembler.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/BRXMLContentHandler.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/DRLFileContentHandler.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/DSLRuleContentHandler.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/IRuleAsset.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/BRMSSuggestionCompletionLoader.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/ContentPackageAssemblerTest.java
Log:
JBRULES-773 BRMS assembler

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/BRMSPackageBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/BRMSPackageBuilder.java	2007-04-19 06:41:05 UTC (rev 11110)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/BRMSPackageBuilder.java	2007-04-19 07:52:51 UTC (rev 11111)
@@ -92,7 +92,7 @@
     /**
      * Load up all the DSL mappping files for the given package.
      */
-    public static List<DSLMappingFile> getDSLMappingFiles(PackageItem pkg, ErrorEvent err) {
+    public static List<DSLMappingFile> getDSLMappingFiles(PackageItem pkg, DSLErrorEvent err) {
         List<DSLMappingFile> result = new ArrayList<DSLMappingFile>();
         AssetItemIterator it = pkg.listAssetsByFormat( new String[]{AssetFormats.DSL} );
         while ( it.hasNext() ) {
@@ -106,12 +106,12 @@
                     List errs = file.getErrors();
                     for ( Iterator iter = errs.iterator(); iter.hasNext(); ) {
                         DSLMappingParseException e = (DSLMappingParseException) iter.next();
-                        err.logError( "An error occurred loading DSL configuration called: " + item.getName() + " line number " + e.getLine() + " : " + e.getMessage() );
+                        err.recordError( item, "Line " + e.getLine() + " : " + e.getMessage() );
                     }
                 }
 
             } catch ( IOException e ) {
-                err.logError( e.getMessage() );
+                throw new RulesRepositoryException(e);
             }
 
         }
@@ -142,8 +142,8 @@
     /**
      * This is used when loading Jars, DSLs etc to report errors.
      */
-    public static interface ErrorEvent {
-        public void logError(String message);
+    public static interface DSLErrorEvent {
+        public void recordError(AssetItem asset, String message);
     }
 
 }

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentPackageAssembler.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentPackageAssembler.java	2007-04-19 06:41:05 UTC (rev 11110)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentPackageAssembler.java	2007-04-19 07:52:51 UTC (rev 11111)
@@ -29,6 +29,12 @@
 public class ContentPackageAssembler {
 
     private PackageItem pkg;
+    
+    /**
+     * We accumulate errors here. If they come from the builder,
+     * then we reset the builders errors so as to not double report.
+     * It also means we can track errors to the exact asset that caused it.
+     */
     private List<ContentAssemblyError> errors = new ArrayList<ContentAssemblyError>();
 
     BRMSPackageBuilder builder;
@@ -52,9 +58,10 @@
             ContentHandler h = ContentHandler.getHandler( asset.getFormat() );
             if (h instanceof IRuleAsset) {
                 try {
-                    ((IRuleAsset) h).compile( builder, asset );
+                    ((IRuleAsset) h).compile( builder, asset, new ErrorLogger() );
                     if (builder.hasErrors()) {
                         this.recordBuilderErrors( asset );
+                        //clear the errors, so we don't double report.
                         builder.clearErrors();
                     }
                 } catch ( DroolsParserException e ) {
@@ -72,29 +79,36 @@
      * and we can't even get the package header up.
      */
     private boolean preparePackage() {
+        
+        //firstly we loadup the classpath
         List<JarInputStream> jars = BRMSPackageBuilder.getJars( pkg );
         builder = BRMSPackageBuilder.getInstance( jars );
         builder.addPackage( new PackageDescr(pkg.getName()) );
+        
+        //now we deal with the header (imports, templates, globals).
         addDrl(pkg.getHeader());
         if (builder.hasErrors()) {
             recordBuilderErrors(pkg);
+            //if we have any failures, lets drop out now, no point in going
+            //any further
             return false;
         }
 
-        
-        builder.setDSLFiles( BRMSPackageBuilder.getDSLMappingFiles( pkg, new BRMSPackageBuilder.ErrorEvent() {
-            public void logError(String message) {
-                errors.add( new ContentAssemblyError(pkg, message) );
+        //now we load up the DSL files
+        builder.setDSLFiles( BRMSPackageBuilder.getDSLMappingFiles( pkg, new BRMSPackageBuilder.DSLErrorEvent() {
+            public void recordError(AssetItem asset, String message) {
+                errors.add( new ContentAssemblyError(asset, message) );
             }
         }));
         
+        //finally, any functions we will load at this point.
         AssetItemIterator it = this.pkg.listAssetsByFormat( new String[] {AssetFormats.FUNCTION} );
         while(it.hasNext()) {
             AssetItem func = (AssetItem) it.next();
             addDrl( func.getContent() );
             if (builder.hasErrors()) {
                 recordBuilderErrors(func);
-                return false;
+                builder.clearErrors();
             }
         }
         
@@ -156,4 +170,15 @@
     }
     
     
+    /**
+     * This is passed in to the compilers so extra errors can be added.
+     * 
+     * @author Michael Neale
+     */
+    public class ErrorLogger {
+        public void logError(ContentAssemblyError err) {
+            errors.add(err);
+        }
+    }
+    
 }

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/BRXMLContentHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/BRXMLContentHandler.java	2007-04-19 06:41:05 UTC (rev 11110)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/BRXMLContentHandler.java	2007-04-19 07:52:51 UTC (rev 11111)
@@ -5,6 +5,7 @@
 import org.drools.brms.client.modeldriven.brxml.RuleModel;
 import org.drools.brms.client.rpc.RuleAsset;
 import org.drools.brms.server.builder.BRMSPackageBuilder;
+import org.drools.brms.server.builder.ContentPackageAssembler;
 import org.drools.brms.server.util.BRLPersistence;
 import org.drools.compiler.DroolsParserException;
 import org.drools.repository.AssetItem;
@@ -32,7 +33,7 @@
         repoAsset.updateContent( BRLPersistence.getInstance().toXML( data ) );
     }
 
-    public void compile(BRMSPackageBuilder builder, AssetItem asset) throws DroolsParserException,
+    public void compile(BRMSPackageBuilder builder, AssetItem asset, ContentPackageAssembler.ErrorLogger logger) throws DroolsParserException,
                                                                     IOException {
         throw new UnsupportedOperationException();
         

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/DRLFileContentHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/DRLFileContentHandler.java	2007-04-19 06:41:05 UTC (rev 11110)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/DRLFileContentHandler.java	2007-04-19 07:52:51 UTC (rev 11111)
@@ -4,14 +4,14 @@
 import java.io.StringReader;
 import java.util.StringTokenizer;
 
-import org.drools.brms.client.rpc.RuleAsset;
 import org.drools.brms.server.builder.BRMSPackageBuilder;
+import org.drools.brms.server.builder.ContentPackageAssembler;
 import org.drools.compiler.DroolsParserException;
 import org.drools.repository.AssetItem;
 
 public class DRLFileContentHandler extends PlainTextContentHandler implements IRuleAsset {
 
-    public void compile(BRMSPackageBuilder builder, AssetItem asset) throws DroolsParserException, IOException {
+    public void compile(BRMSPackageBuilder builder, AssetItem asset, ContentPackageAssembler.ErrorLogger logger) throws DroolsParserException, IOException {
         String content = asset.getContent();
         if (isStandAloneRule( content )) {
             content = "rule '" + asset.getName() + "'\n"  + content + "\nend\n";
@@ -26,7 +26,7 @@
      * will use the asset name as the rule name, or if it should be treated as a package
      * (in the latter case, the content is passed as it to the compiler).
      */
-    boolean isStandAloneRule(String content) {
+    static boolean isStandAloneRule(String content) {
         StringTokenizer st = new StringTokenizer(content, " ");
         while (st.hasMoreTokens()) {
             String tok = st.nextToken();

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/DSLRuleContentHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/DSLRuleContentHandler.java	2007-04-19 06:41:05 UTC (rev 11110)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/DSLRuleContentHandler.java	2007-04-19 07:52:51 UTC (rev 11111)
@@ -1,11 +1,20 @@
 package org.drools.brms.server.contenthandler;
 
 import java.io.IOException;
+import java.io.StringReader;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
 
 import org.drools.brms.client.rpc.RuleAsset;
 import org.drools.brms.client.rpc.RuleContentText;
 import org.drools.brms.server.builder.BRMSPackageBuilder;
+import org.drools.brms.server.builder.ContentAssemblyError;
+import org.drools.brms.server.builder.ContentPackageAssembler;
 import org.drools.compiler.DroolsParserException;
+import org.drools.lang.ExpanderException;
+import org.drools.lang.dsl.DSLMappingFile;
+import org.drools.lang.dsl.DefaultExpander;
 import org.drools.repository.AssetItem;
 import org.drools.repository.PackageItem;
 
@@ -33,10 +42,40 @@
 
     }
 
-    public void compile(BRMSPackageBuilder builder, AssetItem asset) throws DroolsParserException,
+    public void compile(BRMSPackageBuilder builder, AssetItem asset, ContentPackageAssembler.ErrorLogger logger) throws DroolsParserException,
                                                                     IOException {
-        throw new UnsupportedOperationException();        
+        List<DSLMappingFile> dsls = builder.getDSLMappingFiles();
+        if (dsls == null || dsls.size() == 0) {
+            logger.logError( new ContentAssemblyError(asset, "This rule asset requires a DSL, yet none were configured in the package.") );
+        }
+        
+        DefaultExpander expander = new DefaultExpander();
+        for ( DSLMappingFile file : dsls ) {
+            expander.addDSLMapping( file.getMapping() );
+        }
+        
+        //add the rule keyword if its 'stand alone'
+        String source = asset.getContent();
+        if (DRLFileContentHandler.isStandAloneRule(source)) {
+            source = "rule '" + asset.getName() + "' \n" + source + "\nend\n";
+        }
+        
+        //expand and check for errors
+        String drl = expander.expand( source );
+        if (expander.hasErrors()) {
+            List exErrs = expander.getErrors();
+            for ( Iterator iter = exErrs.iterator(); iter.hasNext(); ) {
+                ExpanderException ex = (ExpanderException) iter.next();
+                logger.logError( new ContentAssemblyError(asset, ex.getMessage()));
+            }
+            return;
+        }
+        
+        
+        builder.addPackageFromDrl( new StringReader(drl) );
     }
+
+
     
 
 }

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/IRuleAsset.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/IRuleAsset.java	2007-04-19 06:41:05 UTC (rev 11110)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/contenthandler/IRuleAsset.java	2007-04-19 07:52:51 UTC (rev 11111)
@@ -3,6 +3,7 @@
 import java.io.IOException;
 
 import org.drools.brms.server.builder.BRMSPackageBuilder;
+import org.drools.brms.server.builder.ContentPackageAssembler;
 import org.drools.compiler.DroolsParserException;
 import org.drools.repository.AssetItem;
 
@@ -18,7 +19,7 @@
      * This will be called when the asset is required to compile itself, 
      * in the context of the given builder.
      */
-    public void compile(BRMSPackageBuilder builder, AssetItem asset) throws DroolsParserException,
+    public void compile(BRMSPackageBuilder builder, AssetItem asset, ContentPackageAssembler.ErrorLogger logger) throws DroolsParserException,
                                                                     IOException;
 
 }

Modified: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/BRMSSuggestionCompletionLoader.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/BRMSSuggestionCompletionLoader.java	2007-04-19 06:41:05 UTC (rev 11110)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/BRMSSuggestionCompletionLoader.java	2007-04-19 07:52:51 UTC (rev 11111)
@@ -7,6 +7,7 @@
 import org.drools.brms.server.builder.BRMSPackageBuilder;
 import org.drools.brms.server.rules.SuggestionCompletionLoader;
 import org.drools.lang.dsl.DSLMappingFile;
+import org.drools.repository.AssetItem;
 import org.drools.repository.PackageItem;
 
 /**
@@ -22,9 +23,9 @@
     
     
     private List<DSLMappingFile> getDSLMappingFiles(PackageItem pkg) {
-        return BRMSPackageBuilder.getDSLMappingFiles( pkg, new BRMSPackageBuilder.ErrorEvent() {
-            public void logError(String message) {
-                errors.add( message );
+        return BRMSPackageBuilder.getDSLMappingFiles( pkg, new BRMSPackageBuilder.DSLErrorEvent() {
+            public void recordError(AssetItem asset, String message) {
+                errors.add( asset.getName() + " : " + message );
             }
         });
     }    

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/ContentPackageAssemblerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/ContentPackageAssemblerTest.java	2007-04-19 06:41:05 UTC (rev 11110)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/ContentPackageAssemblerTest.java	2007-04-19 07:52:51 UTC (rev 11111)
@@ -1,7 +1,5 @@
 package org.drools.brms.server.builder;
 
-import java.io.InputStream;
-
 import junit.framework.TestCase;
 
 import org.drools.brms.client.common.AssetFormats;
@@ -15,7 +13,10 @@
 
     
     
-    
+    /**
+     * Test package configuration errors, 
+     * including header, functions, DSL files.
+     */
     public void testPackageConfigWithErrors() throws Exception {
         //test the config, no rule assets yet
         RulesRepository repo = getRepo();
@@ -68,11 +69,36 @@
             assertNotNull(e.getMessage());
         }
         
+        //fix it up
+        pkg.updateHeader( "import java.util.List" );
+        assembler = new ContentPackageAssembler(pkg);
+        assertFalse(assembler.hasErrors());
+        
+        //now break a DSL and check the error
+        ass.updateContent( "rubbish" );
+        ass.checkin( "" );
+        assembler = new ContentPackageAssembler(pkg);
+        assertTrue(assembler.hasErrors());
+        assertTrue(assembler.getErrors().get( 0 ).itemInError.getName().equals( ass.getName() ));
+        assertNotEmpty(assembler.getErrors().get( 0 ).errorReport);
+        assertFalse(assembler.isPackageConfigurationInError());
+        
+        //now fix it up
+        ass.updateContent( "[when]foo=String()" );
+        ass.checkin( "" );
+        assembler = new ContentPackageAssembler(pkg);
+        assertFalse(assembler.hasErrors());        
+        
+        //break a func, and check for error
+        func.updateContent( "goo" );
+        func.checkin( "" );
+        assembler = new ContentPackageAssembler(pkg);
+        assertTrue(assembler.hasErrors());
+        assertFalse(assembler.isPackageConfigurationInError());
+        assertTrue(assembler.getErrors().get( 0 ).itemInError.getName().equals( func.getName() ));
+        assertNotEmpty(assembler.getErrors().get( 0 ).errorReport);
     }
 
-    private RulesRepository getRepo() throws Exception {
-        return new RulesRepository( TestEnvironmentSessionHelper.getSession() );
-    }
     
     public void testSimplePackageBuildNoErrors() throws Exception {
         RulesRepository repo = getRepo();
@@ -118,14 +144,112 @@
         
     }
     
-    public void testErrorsInFunctionAndRuleAsset() {
+    /**
+     * This this case we will test errors that occur in rule assets,
+     * not in functions or package header.
+     */
+    public void testErrorsInRuleAsset() throws Exception {
+
+        RulesRepository repo = getRepo();
         
+        //first, setup the package correctly:
+        PackageItem pkg = repo.createPackage( "testErrorsInRuleAsset", "" );
+        AssetItem model = pkg.addAsset( "model", "qed" );
+        model.updateFormat( AssetFormats.MODEL );
+        model.updateBinaryContentAttachment( this.getClass().getResourceAsStream( "/billasurf.jar" ) );
+        model.checkin( "" );
+        pkg.updateHeader( "import com.billasurf.Board\n global com.billasurf.Person customer" );
+        repo.save();
+        
+        AssetItem goodRule = pkg.addAsset( "goodRule", "" );
+        goodRule.updateFormat( AssetFormats.DRL );
+        goodRule.updateContent( "rule 'yeah' \n when \n Board() \n then \n System.out.println(42); end" );
+        goodRule.checkin( "" );
+        
+        AssetItem badRule = pkg.addAsset( "badRule", "xxx" );
+        badRule.updateFormat( AssetFormats.DRL );
+        badRule.updateContent( "if something then another" );
+        badRule.checkin( "" );
+        
+        ContentPackageAssembler asm = new ContentPackageAssembler(pkg);
+        assertTrue(asm.hasErrors());
+        assertFalse(asm.isPackageConfigurationInError());
+
+        for ( ContentAssemblyError err : asm.getErrors() ) {
+            assertTrue(err.itemInError.getName().equals( badRule.getName() ));
+            assertNotEmpty(err.errorReport);
+        }
+        
     }
     
-    public void testComplexAssets() {
+
+
+    /**
+     * This time, we mix up stuff a bit
+     *
+     */
+    public void testRuleAndDSLAndFunction() throws Exception {
+        RulesRepository repo = getRepo();
         
+        //first, setup the package correctly:
+        PackageItem pkg = repo.createPackage( "testRuleAndDSLAndFunction", "" );
+        AssetItem model = pkg.addAsset( "model", "qed" );
+        model.updateFormat( AssetFormats.MODEL );
+        model.updateBinaryContentAttachment( this.getClass().getResourceAsStream( "/billasurf.jar" ) );
+        model.checkin( "" );
+        pkg.updateHeader( "import com.billasurf.Board\n global com.billasurf.Person customer" );
+        repo.save();
+        
+        AssetItem func = pkg.addAsset( "func", "" );
+        func.updateFormat( AssetFormats.FUNCTION );
+        func.updateContent( "function void foo() { System.out.println(42); }" );
+        func.checkin( "" );
+        
+        AssetItem dsl = pkg.addAsset( "myDSL", "" );
+        dsl.updateFormat( AssetFormats.DSL );
+        dsl.updateContent( "[then]call a func=foo();" );
+        dsl.checkin( "" );
+
+        AssetItem dsl2 = pkg.addAsset( "myDSL2", "" );
+        dsl2.updateFormat( AssetFormats.DSL );
+        dsl2.updateContent( "[when]There is a board=Board()" );
+        dsl2.checkin( "" );
+        
+        
+        AssetItem rule = pkg.addAsset( "myRule", "" );
+        rule.updateFormat( AssetFormats.DSL_TEMPLATE_RULE );
+        rule.updateContent( "when \n There is a board \n then \n call a func" );
+        rule.checkin( "" );
+        
+        AssetItem rule2 = pkg.addAsset( "myRule2", "" );
+        rule2.updateFormat( AssetFormats.DSL_TEMPLATE_RULE );
+        rule2.updateContent( "package xyz \n rule 'myRule2222' \n when \n There is a board \n then \n call a func \nend" );
+        rule2.checkin( "" );
+        
+        AssetItem rule3 = pkg.addAsset( "myRule3", "" );
+        rule3.updateFormat( AssetFormats.DRL );
+        rule3.updateContent( "package QED\n rule 'rule3' \n when \n Board() \n then \n System.err.println(42); end");
+        rule3.checkin( "" );
+        
+        repo.save();
+        
+        ContentPackageAssembler asm = new ContentPackageAssembler(pkg);
+        assertFalse(asm.hasErrors());
+        Package bin = asm.getBinaryPackage();
+        assertNotNull(bin);
+        assertEquals(3, bin.getRules().length);
+        assertEquals(1, bin.getFunctions().size());
+        
     }
     
+    private void assertNotEmpty(String s) {
+        if (s == null) fail("should not be null");
+        if (s.trim().equals( "" )) fail("should not be empty string");
+    }
     
+    private RulesRepository getRepo() throws Exception {
+        return new RulesRepository( TestEnvironmentSessionHelper.getSession() );
+    }
     
+    
 }




More information about the jboss-svn-commits mailing list