Index: src/main/java/org/drools/decisiontable/model/Rule.java =================================================================== *** src/main/java/org/drools/decisiontable/model/Rule.java Mon Mar 12 17:08:59 2007 --- src/main/java/org/drools/decisiontable/model/Rule.java Mon Mar 12 16:22:34 2007 *************** import java.io.UnsupportedEncodingExcept *** 20,25 **** --- 20,26 ---- import java.util.Iterator; import java.util.LinkedList; import java.util.List; + import java.util.Properties; /** * @author Michael Neale *************** import java.util.List; *** 29,35 **** public class Rule extends DRLElement implements DRLJavaEmitter { ! private static final int MAX_ROWS = 65535; private Integer _salience; // Integer as it may be null --- 30,40 ---- public class Rule extends DRLElement implements DRLJavaEmitter { ! public static final String PROP_LHS_PREAMBLE = "LhsPreamble"; ! public static final String PROP_LHS_TRAILER = "LhsTrailer"; ! public static final String PROP_RHS_PREAMBLE = "RhsPreamble"; ! public static final String PROP_RHS_TRAILER = "RhsTrailer"; ! private static final int MAX_ROWS = 65535; private Integer _salience; // Integer as it may be null *************** public class Rule extends DRLElement *** 57,63 **** private List _rhs; private int _spreadsheetRow; ! /** * Create a new rule. Note that the rule name should be post-fixed with the row number, * as one way of providing tracability for errors back to the originating spreadsheet. --- 62,70 ---- private List _rhs; private int _spreadsheetRow; ! ! private Properties _properties; ! /** * Create a new rule. Note that the rule name should be post-fixed with the row number, * as one way of providing tracability for errors back to the originating spreadsheet. *************** public class Rule extends DRLElement *** 77,84 **** this._lhs = new LinkedList(); this._rhs = new LinkedList(); this._spreadsheetRow = spreadsheetRow; } ! public void addCondition(final Condition con) { this._lhs.add( con ); } --- 84,92 ---- this._lhs = new LinkedList(); this._rhs = new LinkedList(); this._spreadsheetRow = spreadsheetRow; + this._properties=new Properties(); } ! public void addCondition(final Condition con) { this._lhs.add( con ); } *************** public class Rule extends DRLElement *** 88,93 **** --- 96,103 ---- } public void renderDRL(final DRLOutput out) { + String snippet; + if ( isCommented() ) { out.writeLine( "#" + getComment() ); } *************** public class Rule extends DRLElement *** 112,123 **** } out.writeLine( "\twhen" ); renderDRL( this._lhs, out ); out.writeLine( "\tthen" ); renderDRL( this._rhs, out ); ! out.writeLine( "end\n" ); } --- 122,143 ---- } out.writeLine( "\twhen" ); + snippet=_properties.getProperty(PROP_LHS_PREAMBLE); + if (snippet!=null) out.writeLine("\t\t" + snippet); renderDRL( this._lhs, out ); + snippet=_properties.getProperty(PROP_LHS_TRAILER); + if (snippet!=null) out.writeLine("\t\t" + snippet); + + out.writeLine( "\tthen" ); + snippet=_properties.getProperty(PROP_RHS_PREAMBLE); + if (snippet!=null) out.writeLine("\t\t" + snippet); renderDRL( this._rhs, out ); ! snippet=_properties.getProperty(PROP_RHS_TRAILER); ! if (snippet!=null) out.writeLine("\t\t" + snippet); ! out.writeLine( "end\n" ); } *************** public class Rule extends DRLElement *** 259,263 **** public int getSpreadsheetRowNumber() { return this._spreadsheetRow; } ! } --- 279,290 ---- public int getSpreadsheetRowNumber() { return this._spreadsheetRow; } ! ! public void setProperties(Properties properties) { ! this._properties = properties; ! } ! ! public Properties getProperties() { ! return this._properties; ! } } Index: src/main/java/org/drools/decisiontable/parser/DefaultRuleSheetListener.java =================================================================== *** src/main/java/org/drools/decisiontable/parser/DefaultRuleSheetListener.java Mon Mar 12 17:09:39 2007 --- src/main/java/org/drools/decisiontable/parser/DefaultRuleSheetListener.java Mon Mar 12 16:44:08 2007 *************** public class DefaultRuleSheetListener *** 68,73 **** --- 68,74 ---- public static final String SEQUENTIAL_FLAG = "Sequential"; public static final String VARIABLES_TAG = "Variables"; public static final String RULE_TABLE_TAG = "RuleTable"; + public static final String RULE_TABLE_CONFIG = "RuleTableConfig"; public static final String RULESET_TAG = "RuleSet"; private static final int ACTION_ROW = 1; private static final int OBJECT_TYPE_ROW = 2; *************** public class DefaultRuleSheetListener *** 82,88 **** private Rule _currentRule; private String _currentRulePrefix; private boolean _currentSequentialFlag = false; // indicates that we are in sequential mode ! //accumulated output private Map _actions; private final HashMap _cellComments = new HashMap(); --- 83,90 ---- private Rule _currentRule; private String _currentRulePrefix; private boolean _currentSequentialFlag = false; // indicates that we are in sequential mode ! private Properties _currentRuleProperties; ! //accumulated output private Map _actions; private final HashMap _cellComments = new HashMap(); *************** public class DefaultRuleSheetListener *** 92,98 **** private List sourceBuilders = new ArrayList(); private final PropertiesSheetListener _propertiesListner = new PropertiesSheetListener(); ! /* (non-Javadoc) * @see org.drools.decisiontable.parser.RuleSheetListener#getProperties() */ --- 94,103 ---- private List sourceBuilders = new ArrayList(); private final PropertiesSheetListener _propertiesListner = new PropertiesSheetListener(); ! ! // Collecting rule properties ! private PropertiesSheetListener _rulePropertiesListener = null; ! /* (non-Javadoc) * @see org.drools.decisiontable.parser.RuleSheetListener#getProperties() */ *************** public class DefaultRuleSheetListener *** 238,244 **** this._ruleStartColumn = column; this._ruleStartRow = row; this._ruleRow = row + DefaultRuleSheetListener.LABEL_ROW + 1; ! // setup stuff for the rules to come.. (the order of these steps are // important !) this._currentRulePrefix = RuleSheetParserUtil.getRuleName( value ); --- 243,259 ---- this._ruleStartColumn = column; this._ruleStartRow = row; this._ruleRow = row + DefaultRuleSheetListener.LABEL_ROW + 1; ! ! // Did we have rule properties ! if (this._rulePropertiesListener!=null) { ! // Get the properties ! this._currentRuleProperties=this._rulePropertiesListener.getProperties(); ! this._rulePropertiesListener=null; ! } else { ! // No properties given ! this._currentRuleProperties=new Properties(); ! } ! // setup stuff for the rules to come.. (the order of these steps are // important !) this._currentRulePrefix = RuleSheetParserUtil.getRuleName( value ); *************** public class DefaultRuleSheetListener *** 289,299 **** private void processNonRuleCell(final int row, final int column, final String value) { ! if ( value.startsWith( DefaultRuleSheetListener.RULE_TABLE_TAG ) ) { initRuleTable( row, column, value ); } else { this._propertiesListner.newCell( row, column, value, SheetListener.NON_MERGED); --- 304,323 ---- private void processNonRuleCell(final int row, final int column, final String value) { ! if (value.startsWith( DefaultRuleSheetListener.RULE_TABLE_CONFIG ) ) { ! // Start reading the config for the subsequent rule table ! this._rulePropertiesListener=new PropertiesSheetListener(); ! } else if ( value.startsWith( DefaultRuleSheetListener.RULE_TABLE_TAG ) ) { initRuleTable( row, column, value ); + } else if ( this._rulePropertiesListener!=null ) { + // Reading rule table properties + this._rulePropertiesListener.newCell( row, + column, + value, SheetListener.NON_MERGED); } else { + // Reading global properties this._propertiesListner.newCell( row, column, value, SheetListener.NON_MERGED); *************** public class DefaultRuleSheetListener *** 545,551 **** salience, spreadsheetRow ); rule.setComment( "From row number: " + (spreadsheetRow) ); ! return rule; } --- 569,577 ---- salience, spreadsheetRow ); rule.setComment( "From row number: " + (spreadsheetRow) ); ! if (this._currentRuleProperties!=null) ! rule.setProperties(this._currentRuleProperties); ! return rule; } Index: src/test/java/org/drools/decisiontable/parser/RuleWorksheetParseTest.java =================================================================== *** src/test/java/org/drools/decisiontable/parser/RuleWorksheetParseTest.java Mon Mar 12 17:10:41 2007 --- src/test/java/org/drools/decisiontable/parser/RuleWorksheetParseTest.java Mon Mar 12 16:50:33 2007 *************** import java.io.IOException; *** 20,30 **** --- 20,32 ---- import java.io.InputStream; import java.text.DecimalFormat; import java.util.Properties; + import java.util.regex.Pattern; import junit.framework.TestCase; import org.drools.decisiontable.model.Condition; import org.drools.decisiontable.model.Consequence; + import org.drools.decisiontable.model.DRLOutput; import org.drools.decisiontable.model.Import; import org.drools.decisiontable.model.Package; import org.drools.decisiontable.model.Rule; *************** public class RuleWorksheetParseTest exte *** 159,165 **** --- 161,188 ---- rule.getConsequences().size() ); } + + public void testRuleTableConfig() throws Exception { + final InputStream stream = RuleWorksheetParseTest.class.getResourceAsStream( "/data/RuleTableConfig.xls" ); + assertNotNull("/data/RuleTableConfig.xls", stream); + + final RuleSheetListener listener = getRuleSheetListener( stream ); + final Package ruleset = listener.getRuleSet(); + DRLOutput out=new DRLOutput(); + ruleset.renderDRL(out); + + String drl=out.getDRL(); + System.out.println(out.getDRL()); + + // Assert the lhs + Pattern pattern=Pattern.compile("when\\s+##LHS PREAMBLE\\s+Abc\\(column == \"123\"\\)\\s+##LHS TRAILER", Pattern.MULTILINE); + assertTrue("Drl contains LHS Preamble and Trailer", pattern.matcher(drl).find()); + + // Assert the rhs + pattern=Pattern.compile("then\\s+##RHS PREAMBLE\\s+def.action;\\s+##RHS TRAILER", Pattern.MULTILINE); + } + /** * Utility method showing how to get a rule sheet listener from a stream. */