[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