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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Apr 17 06:57:01 EDT 2007


Author: michael.neale at jboss.com
Date: 2007-04-17 06:57:01 -0400 (Tue, 17 Apr 2007)
New Revision: 11059

Added:
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentAssemblyError.java
   labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentPackageAssembler.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/ContentPackageAssemblerTest.java
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/util/BRMSSuggestionCompletionLoader.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/BRMSPackageBuilderTest.java
   labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/BRMSSuggestionCompletionLoaderTest.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-17 10:50:58 UTC (rev 11058)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/BRMSPackageBuilder.java	2007-04-17 10:57:01 UTC (rev 11059)
@@ -2,11 +2,22 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
 import java.util.jar.JarEntry;
 import java.util.jar.JarInputStream;
 
+import org.drools.brms.client.common.AssetFormats;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.lang.dsl.DSLMappingFile;
+import org.drools.lang.dsl.DSLMappingParseException;
+import org.drools.repository.AssetItem;
+import org.drools.repository.AssetItemIterator;
+import org.drools.repository.PackageItem;
+import org.drools.repository.RulesRepositoryException;
 import org.drools.resource.util.ByteArrayClassLoader;
 
 /**
@@ -22,41 +33,43 @@
      * This will give you a fresh new PackageBuilder 
      * using the given classpath.
      */
-    public static BRMSPackageBuilder getInstance(JarInputStream[] classpath) throws IOException {
+    public static BRMSPackageBuilder getInstance(List<JarInputStream> classpath) {
 
         ByteArrayClassLoader loader = new ByteArrayClassLoader( BRMSPackageBuilder.class.getClassLoader() );
-
-        for ( int i = 0; i < classpath.length; i++ ) {
-
-            JarInputStream jis = classpath[i];
-            JarEntry entry = null;
-            byte[] buf = new byte[1024];
-            int len = 0;
-            while ( (entry = jis.getNextJarEntry()) != null ) {
-                if ( !entry.isDirectory() ) {
-                    ByteArrayOutputStream out = new ByteArrayOutputStream();
-                    while ( (len = jis.read( buf )) >= 0 ) {
-                        out.write( buf, 0, len );
+        try {
+            for ( JarInputStream jis : classpath ) {
+                JarEntry entry = null;
+                byte[] buf = new byte[1024];
+                int len = 0;
+                while ( (entry = jis.getNextJarEntry()) != null ) {
+                    if ( !entry.isDirectory() ) {
+                        ByteArrayOutputStream out = new ByteArrayOutputStream();
+                        while ( (len = jis.read( buf )) >= 0 ) {
+                            out.write( buf, 0, len );
+                        }
+                        loader.addResource( entry.getName(), out.toByteArray() );
                     }
-                    loader.addResource( entry.getName(), out.toByteArray() );
                 }
+
             }
+        } catch ( IOException e ) {
+            throw new RulesRepositoryException( e );
+        }
 
-        }
-        
         PackageBuilderConfiguration config = new PackageBuilderConfiguration();
-        config.setClassLoader( loader );        
+        config.setClassLoader( loader );
 
-        return new BRMSPackageBuilder(config);
+        return new BRMSPackageBuilder( config );
 
     }
-    
+
     /**
      * In the BRMS you should not need to use this, use the getInstance factory method instead.
      * @param config
      */
-    public BRMSPackageBuilder(PackageBuilderConfiguration config) {
-        super(config);
+    public BRMSPackageBuilder(
+                              PackageBuilderConfiguration config) {
+        super( config );
     }
 
     /**
@@ -66,4 +79,61 @@
         super.resetErrors();
     }
 
+    /**
+     * Load up all the DSL mappping files for the given package.
+     */
+    public static List<DSLMappingFile> getDSLMappingFiles(PackageItem pkg, ErrorEvent err) {
+        List<DSLMappingFile> result = new ArrayList<DSLMappingFile>();
+        AssetItemIterator it = pkg.listAssetsByFormat( new String[]{AssetFormats.DSL} );
+        while ( it.hasNext() ) {
+            AssetItem item = (AssetItem) it.next();
+            String dslData = item.getContent();
+            DSLMappingFile file = new DSLMappingFile();
+            try {
+                if ( file.parseAndLoad( new StringReader( dslData ) ) ) {
+                    result.add( file );
+                } else {
+                    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() );
+                    }
+                }
+
+            } catch ( IOException e ) {
+                err.logError( e.getMessage() );
+            }
+
+        }
+
+        return result;
+    }
+
+    /**
+     * Load up all the Jars for the given package.
+     */
+    public static List<JarInputStream> getJars(PackageItem pkg) {
+        List<JarInputStream> result = new ArrayList<JarInputStream>();
+        AssetItemIterator ait = pkg.listAssetsByFormat( new String[]{AssetFormats.MODEL} );
+        while ( ait.hasNext() ) {
+            AssetItem item = (AssetItem) ait.next();
+            if ( item.getBinaryContentAttachment() != null ) {
+                try {
+                    result.add( new JarInputStream( item.getBinaryContentAttachment(),
+                                                    false ) );
+                } catch ( IOException e ) {
+                    throw new RulesRepositoryException(e);
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * This is used when loading Jars, DSLs etc to report errors.
+     */
+    public static interface ErrorEvent {
+        public void logError(String message);
+    }
+
 }

Added: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentAssemblyError.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentAssemblyError.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentAssemblyError.java	2007-04-17 10:57:01 UTC (rev 11059)
@@ -0,0 +1,24 @@
+package org.drools.brms.server.builder;
+
+import org.drools.repository.PackageItem;
+import org.drools.repository.VersionableItem;
+
+/**
+ * This class is used to accumulate error reports for asset.
+ * This can then be used to feed back to the user where the problems are.
+ * 
+ * @author Michael Neale
+ */
+public class ContentAssemblyError {
+
+    public ContentAssemblyError(VersionableItem it, String message) {
+        this.itemInError = it;
+        this.errorReport = message;
+    }
+    /**
+     * This may be null, if its not associated to any particular asset.
+     */
+    public VersionableItem itemInError;
+    public String errorReport;
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentAssemblyError.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentPackageAssembler.java	2007-04-17 10:57:01 UTC (rev 11059)
@@ -0,0 +1,106 @@
+package org.drools.brms.server.builder;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.JarInputStream;
+
+import org.drools.compiler.DroolsError;
+import org.drools.compiler.DroolsParserException;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.dsl.DSLMappingFile;
+import org.drools.repository.PackageItem;
+import org.drools.repository.RulesRepositoryException;
+import org.drools.rule.Package;
+
+/**
+ * This assembles packages in the BRMS into binary package objects, and deals with errors etc.
+ * Each content type is responsible for contributing to the package. 
+ * 
+ * @author Michael Neale
+ */
+public class ContentPackageAssembler {
+
+    private PackageItem pkg;
+    private Package binaryPackage;
+    private List errors = new ArrayList();
+
+    private BRMSPackageBuilder builder;
+    private List<DSLMappingFile> dslFiles;
+    
+    public ContentPackageAssembler(PackageItem assetPackage) {
+        this.pkg = assetPackage;
+        
+        if (preparePackage()) {
+            buildPackage();
+        }
+        
+    }
+    
+    /**
+     * This will build the package. 
+     */
+    private void buildPackage() {
+
+    }
+
+    /**
+     * This prepares the package builder, loads the jars/classpath.
+     * @return true if everything is good to go, false if its all gone horribly wrong, 
+     * and we can't even get the package header up.
+     */
+    private boolean preparePackage() {
+        List<JarInputStream> jars = BRMSPackageBuilder.getJars( pkg );
+        builder = BRMSPackageBuilder.getInstance( jars );
+        builder.addPackage( new PackageDescr(pkg.getName()) );
+        try {
+            builder.addPackageFromDrl( new StringReader(pkg.getHeader()) );
+            if (builder.hasErrors()) {
+                recordBuilderErrors();
+                return false;
+            }
+        } catch ( DroolsParserException e ) {
+            throw new RulesRepositoryException("A serious error occurred trying to parser the package header.", e);
+        } catch ( IOException e ) {
+            throw new RulesRepositoryException(e);
+        }
+        
+        this.dslFiles = BRMSPackageBuilder.getDSLMappingFiles( pkg, new BRMSPackageBuilder.ErrorEvent() {
+            public void logError(String message) {
+                errors.add( new ContentAssemblyError(pkg, message) );
+            }
+        });
+        return errors.size() == 0;
+    }
+
+
+
+    /**
+     * This will accumulate the errors.
+     */
+    private void recordBuilderErrors() {
+        DroolsError[] errs = builder.getErrors();
+        for ( int i = 0; i < errs.length; i++ ) {
+            this.errors.add( new ContentAssemblyError(pkg, errs[i].getMessage()) );
+        }
+        
+    }
+
+    /**
+     * I've got a package people !
+     */
+    public Package getBinaryPackage() {
+        if (this.hasErrors()) {
+            throw new IllegalStateException("There is no package available, as there were errors.");
+        }
+        return binaryPackage;
+    }
+
+    
+    public boolean hasErrors() {
+        return errors.size() > 0;
+    }
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/builder/ContentPackageAssembler.java
___________________________________________________________________
Name: svn:eol-style
   + native

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-17 10:50:58 UTC (rev 11058)
+++ labs/jbossrules/trunk/drools-jbrms/src/main/java/org/drools/brms/server/util/BRMSSuggestionCompletionLoader.java	2007-04-17 10:57:01 UTC (rev 11059)
@@ -1,17 +1,12 @@
 package org.drools.brms.server.util;
 
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.jar.JarInputStream;
 
-import org.drools.brms.client.common.AssetFormats;
 import org.drools.brms.client.modeldriven.SuggestionCompletionEngine;
+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.AssetItemIterator;
 import org.drools.repository.PackageItem;
 
 /**
@@ -27,38 +22,15 @@
     
     
     private List<DSLMappingFile> getDSLMappingFiles(PackageItem pkg) {
-        List<DSLMappingFile> result = new ArrayList<DSLMappingFile>();
-        AssetItemIterator it = pkg.listAssetsByFormat( new String[] {AssetFormats.DSL} );
-        while(it.hasNext()) {
-          AssetItem item = (AssetItem) it.next();
-          String dslData = item.getContent();
-          DSLMappingFile file = new DSLMappingFile();
-          try {
-            file.parseAndLoad( new StringReader( dslData ) );
-            result.add( file );
-          } catch ( IOException e ) {
-            errors.add( e.getMessage() );
-          }  
-          
-        }
-        
-        return result;
+        return BRMSPackageBuilder.getDSLMappingFiles( pkg, new BRMSPackageBuilder.ErrorEvent() {
+            public void logError(String message) {
+                errors.add( message );
+            }
+        });
     }    
     
     private List<JarInputStream> getJars(PackageItem pkg) {
-        List<JarInputStream> result = new ArrayList<JarInputStream>();
-        AssetItemIterator ait = pkg.listAssetsByFormat( new String[]{AssetFormats.MODEL} );
-        while ( ait.hasNext() ) {
-            AssetItem item = (AssetItem) ait.next();
-            if (item.getBinaryContentAttachment() != null) {
-                try {
-                    result.add( new JarInputStream( item.getBinaryContentAttachment(), false ) );
-                } catch ( IOException e ) {
-                    this.errors.add( e.getMessage() );
-                }
-            }
-        }
-        return result;
+        return BRMSPackageBuilder.getJars( pkg );
     }    
     
 }

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/BRMSPackageBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/BRMSPackageBuilderTest.java	2007-04-17 10:50:58 UTC (rev 11058)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/BRMSPackageBuilderTest.java	2007-04-17 10:57:01 UTC (rev 11059)
@@ -1,6 +1,8 @@
 package org.drools.brms.server.builder;
 
 import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.jar.JarInputStream;
 
 import junit.framework.TestCase;
@@ -15,15 +17,20 @@
     public void testPartialPackage() throws Exception {
 
         JarInputStream jis = new JarInputStream( this.getClass().getResourceAsStream( "/billasurf.jar" ) );
-        BRMSPackageBuilder builder = BRMSPackageBuilder.getInstance(  new JarInputStream[] {jis} );
+        List<JarInputStream> l = new ArrayList<JarInputStream>();
+        l.add( jis );
+        BRMSPackageBuilder builder = BRMSPackageBuilder.getInstance( l );
         
-        String header = "package foo.bar\n import com.billasurf.Person\n import com.billasurf.Board";
+        PackageDescr pc = new PackageDescr("foo.bar");
+        builder.addPackage( pc );
+        
+        String header = "import com.billasurf.Person\n import com.billasurf.Board";
         builder.addPackageFromDrl( new StringReader(header) );
         assertFalse(builder.hasErrors());
         
 
         
-        String ruleAtom = "package foo.bar rule foo \n when \n Person() \n then \n System.out.println(42); end";
+        String ruleAtom = "rule foo \n when \n Person() \n then \n System.out.println(42); end";
         builder.addPackageFromDrl( new StringReader(ruleAtom) );
         if (builder.hasErrors()) {            
             System.err.println(builder.getErrors()[0].getMessage());
@@ -73,5 +80,9 @@
         assertNotNull(p.getRule( "abc" ));
         
     }
+    
 
+    
+    
+
 }

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/ContentPackageAssemblerTest.java	2007-04-17 10:57:01 UTC (rev 11059)
@@ -0,0 +1,39 @@
+package org.drools.brms.server.builder;
+
+import org.drools.repository.PackageItem;
+
+import junit.framework.TestCase;
+
+public class ContentPackageAssemblerTest extends TestCase {
+
+    
+    public void FIXME_testSimplePackage() throws Exception {
+        PackageItem pkg = null;
+        ContentPackageAssembler asm = new ContentPackageAssembler(pkg);
+        assertFalse(asm.hasErrors());
+        assertNotNull(asm.getBinaryPackage());
+        org.drools.rule.Package bin = asm.getBinaryPackage();
+        assertEquals(pkg.getName(), bin.getName());
+        assertTrue(bin.isValid());
+        
+        assertEquals(2, bin.getRules().length);
+        
+        
+        
+    }
+    
+    public void testErrorsInConfig() {
+        
+    }
+    
+    public void testErrorsInFunctionAndRuleAsset() {
+        
+    }
+    
+    public void testComplexAssets() {
+        
+    }
+    
+    
+    
+}


Property changes on: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/builder/ContentPackageAssemblerTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/BRMSSuggestionCompletionLoaderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/BRMSSuggestionCompletionLoaderTest.java	2007-04-17 10:50:58 UTC (rev 11058)
+++ labs/jbossrules/trunk/drools-jbrms/src/test/java/org/drools/brms/server/rules/BRMSSuggestionCompletionLoaderTest.java	2007-04-17 10:57:01 UTC (rev 11059)
@@ -85,13 +85,21 @@
         
 
         SuggestionCompletionEngine eng = loader.getSuggestionEngine( item );
+        assertFalse(loader.hasErrors());
         assertEquals(1, eng.actionDSLSentences.length);
         assertEquals(1, eng.conditionDSLSentences.length);
         
         assertEquals( "The agents rating is {rating}", eng.conditionDSLSentences[0].sentence );
         assertEquals("Send a notification to manufacturing '{message}'",eng.actionDSLSentences[0].sentence);
         
+        dsl = "koo kooo ca choo";
+        asset.updateContent( dsl );
+        asset.checkin( "boo" );
         
+        item = repo.loadPackage( "testLoadDSLs" );
+        loader = new BRMSSuggestionCompletionLoader();
+        loader.getSuggestionEngine( item );
+        assertTrue(loader.hasErrors());
         
         
     }




More information about the jboss-svn-commits mailing list