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 <a href="mailto:michael.neale@gmail.com"> Michael Neale </a>
*************** 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.
       */
