[DIGESTER-157] Improve Set(Nested)PropertiesRuleAlias performances in the XML ruleset while binding rules

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/digester/trunk@1197978 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 5a89ebe..cd94138 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -60,6 +60,7 @@
 IMPROVEMENTS OVER PREVIOUS RELEASE
 ===================================
 
+ * [DIGESTER-157] Improve Set(Nested)PropertiesRuleAlias performances in the XML ruleset while binding rules
  * [DIGESTER-156] Make (Nested|Set)PropertiesBuilder#addAlias() fluent.
  * [DIGESTER-152] The DigesterLoader doesn't allow binding a default Locator
  * [DIGESTER-151] The DigesterLoader doesn't allow binding a default ErrorHandler.
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 39343b3..d3d266c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -23,6 +23,9 @@
   </properties>
   <body>
   <release version="3.2" date="201?-??-??" description="Maintenance release.">
+    <action dev="simonetripodi" type="fix" issue="DIGESTER-157">
+      Improve Set(Nested)PropertiesRuleAlias performances in the XML ruleset while binding rules.
+    </action>
     <action dev="simonetripodi" type="fix" issue="DIGESTER-156">
       Make (Nested|Set)PropertiesBuilder#addAlias() fluent.
     </action>
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesAliasRule.java b/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesAliasRule.java
index e3a3d6d..4cb2d0e 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesAliasRule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesAliasRule.java
@@ -19,33 +19,29 @@
  * under the License.
  */
 
-import org.apache.commons.digester3.binder.LinkedRuleBuilder;
-import org.apache.commons.digester3.binder.RulesBinder;
+import org.apache.commons.digester3.Rule;
+import org.apache.commons.digester3.binder.NestedPropertiesBuilder;
 import org.xml.sax.Attributes;
 
 /**
  *
  */
 final class SetNestedPropertiesAliasRule
-    extends AbstractXmlRule
+    extends Rule
 {
 
-    public SetNestedPropertiesAliasRule( RulesBinder targetRulesBinder, PatternStack patternStack )
-    {
-        super( targetRulesBinder, patternStack );
-    }
-
     /**
      * {@inheritDoc}
      */
     @Override
-    protected void bindRule( LinkedRuleBuilder linkedRuleBuilder, Attributes attributes )
+    public void begin( String namespace, String name, Attributes attributes )
         throws Exception
     {
         String elementName = attributes.getValue( "attr-name" );
         String propertyName = attributes.getValue( "prop-name" );
 
-        linkedRuleBuilder.setNestedProperties().addAlias( elementName ).forProperty( propertyName );
+        NestedPropertiesBuilder builder = getDigester().peek();
+        builder.addAlias( elementName ).forProperty( propertyName );
     }
 
 }
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesIgnoreRule.java b/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesIgnoreRule.java
index b5aa987..1b4bcae 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesIgnoreRule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesIgnoreRule.java
@@ -19,32 +19,28 @@
  * under the License.
  */
 
-import org.apache.commons.digester3.binder.LinkedRuleBuilder;
-import org.apache.commons.digester3.binder.RulesBinder;
+import org.apache.commons.digester3.Rule;
+import org.apache.commons.digester3.binder.NestedPropertiesBuilder;
 import org.xml.sax.Attributes;
 
 /**
- * 
+ *
  */
 final class SetNestedPropertiesIgnoreRule
-    extends AbstractXmlRule
+    extends Rule
 {
 
-    public SetNestedPropertiesIgnoreRule( RulesBinder targetRulesBinder, PatternStack patternStack )
-    {
-        super( targetRulesBinder, patternStack );
-    }
-
     /**
      * {@inheritDoc}
      */
     @Override
-    protected void bindRule( LinkedRuleBuilder linkedRuleBuilder, Attributes attributes )
+    public void begin( String namespace, String name, Attributes attributes )
         throws Exception
     {
         String elementName = attributes.getValue( "elem-name" );
 
-        linkedRuleBuilder.setNestedProperties().ignoreElement( elementName );
+        NestedPropertiesBuilder builder = getDigester().peek();
+        builder.ignoreElement( elementName );
     }
 
 }
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesRule.java b/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesRule.java
index acaeb9b..121e081 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesRule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesRule.java
@@ -20,11 +20,12 @@
  */
 
 import org.apache.commons.digester3.binder.LinkedRuleBuilder;
+import org.apache.commons.digester3.binder.NestedPropertiesBuilder;
 import org.apache.commons.digester3.binder.RulesBinder;
 import org.xml.sax.Attributes;
 
 /**
- * 
+ *
  */
 final class SetNestedPropertiesRule
     extends AbstractXmlRule
@@ -44,7 +45,20 @@
     {
         boolean allowUnknownChildElements =
             "true".equalsIgnoreCase( attributes.getValue( "allow-unknown-child-elements" ) );
-        linkedRuleBuilder.setNestedProperties().allowUnknownChildElements( allowUnknownChildElements );
+        NestedPropertiesBuilder builder = linkedRuleBuilder
+                                            .setNestedProperties()
+                                            .allowUnknownChildElements( allowUnknownChildElements );
+        getDigester().push( builder );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void end( String namespace, String name )
+        throws Exception
+    {
+        getDigester().pop();
     }
 
 }
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesAliasRule.java b/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesAliasRule.java
index a61f4f5..a485bd7 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesAliasRule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesAliasRule.java
@@ -19,33 +19,29 @@
  * under the License.
  */
 
-import org.apache.commons.digester3.binder.LinkedRuleBuilder;
-import org.apache.commons.digester3.binder.RulesBinder;
+import org.apache.commons.digester3.Rule;
+import org.apache.commons.digester3.binder.SetPropertiesBuilder;
 import org.xml.sax.Attributes;
 
 /**
  *
  */
 final class SetPropertiesAliasRule
-    extends AbstractXmlRule
+    extends Rule
 {
 
-    public SetPropertiesAliasRule( RulesBinder targetRulesBinder, PatternStack patternStack )
-    {
-        super( targetRulesBinder, patternStack );
-    }
-
     /**
      * {@inheritDoc}
      */
     @Override
-    protected void bindRule( LinkedRuleBuilder linkedRuleBuilder, Attributes attributes )
+    public void begin( String namespace, String name, Attributes attributes )
         throws Exception
     {
         String attributeName = attributes.getValue( "attr-name" );
         String propertyName = attributes.getValue( "prop-name" );
 
-        linkedRuleBuilder.setProperties().addAlias( attributeName ).forProperty( propertyName );
+        SetPropertiesBuilder builder = getDigester().peek();
+        builder.addAlias( attributeName ).forProperty( propertyName );
     }
 
 }
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesIgnoreRule.java b/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesIgnoreRule.java
index b954aa9..b75756c 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesIgnoreRule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesIgnoreRule.java
@@ -19,32 +19,27 @@
  * under the License.
  */
 
-import org.apache.commons.digester3.binder.LinkedRuleBuilder;
-import org.apache.commons.digester3.binder.RulesBinder;
+import org.apache.commons.digester3.Rule;
+import org.apache.commons.digester3.binder.SetPropertiesBuilder;
 import org.xml.sax.Attributes;
 
 /**
- * 
+ *
  */
 final class SetPropertiesIgnoreRule
-    extends AbstractXmlRule
+    extends Rule
 {
 
-    public SetPropertiesIgnoreRule( RulesBinder targetRulesBinder, PatternStack patternStack )
-    {
-        super( targetRulesBinder, patternStack );
-    }
-
     /**
      * {@inheritDoc}
      */
-    @Override
-    protected void bindRule( LinkedRuleBuilder linkedRuleBuilder, Attributes attributes )
+    public void begin(String namespace, String name, Attributes attributes)
         throws Exception
     {
         String attributeName = attributes.getValue( "attr-name" );
 
-        linkedRuleBuilder.setProperties().ignoreAttribute( attributeName );
+        SetPropertiesBuilder builder = getDigester().peek();
+        builder.ignoreAttribute( attributeName );
     }
 
 }
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesRule.java b/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesRule.java
index e589623..3595e35 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesRule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesRule.java
@@ -21,10 +21,11 @@
 
 import org.apache.commons.digester3.binder.LinkedRuleBuilder;
 import org.apache.commons.digester3.binder.RulesBinder;
+import org.apache.commons.digester3.binder.SetPropertiesBuilder;
 import org.xml.sax.Attributes;
 
 /**
- * 
+ *
  */
 final class SetPropertiesRule
     extends AbstractXmlRule
@@ -43,7 +44,19 @@
         throws Exception
     {
         boolean ignoreMissingProperty = "true".equalsIgnoreCase( attributes.getValue( "ignore-missing-property" ) );
-        linkedRuleBuilder.setProperties().ignoreMissingProperty( ignoreMissingProperty );
+
+        SetPropertiesBuilder builder = linkedRuleBuilder.setProperties().ignoreMissingProperty( ignoreMissingProperty );
+        getDigester().push( builder );
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void end( String namespace, String name )
+        throws Exception
+    {
+        getDigester().pop();
     }
 
 }
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/XmlRulesModule.java b/src/main/java/org/apache/commons/digester3/xmlrules/XmlRulesModule.java
index d6c7621..29b0f99 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/XmlRulesModule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/XmlRulesModule.java
@@ -94,18 +94,18 @@
 
             forPattern( "*/set-properties-rule" ).addRule( new SetPropertiesRule( targetRulesBinder, patternStack ) );
             forPattern( "*/set-properties-rule/alias" )
-                .addRule( new SetPropertiesAliasRule( targetRulesBinder, patternStack ) );
+                .addRule( new SetPropertiesAliasRule() );
             forPattern( "*/set-properties-rule/ignore" )
-                .addRule( new SetPropertiesIgnoreRule( targetRulesBinder, patternStack ) );
+                .addRule( new SetPropertiesIgnoreRule() );
 
             forPattern( "*/set-property-rule" ).addRule( new SetPropertyRule( targetRulesBinder, patternStack ) );
 
             forPattern( "*/set-nested-properties-rule" )
                 .addRule( new SetNestedPropertiesRule( targetRulesBinder, patternStack ) );
             forPattern( "*/set-nested-properties-rule/alias" )
-                .addRule( new SetNestedPropertiesAliasRule( targetRulesBinder, patternStack ) );
+                .addRule( new SetNestedPropertiesAliasRule() );
             forPattern( "*/set-nested-properties-rule/ignore" )
-                .addRule( new SetPropertiesIgnoreRule( targetRulesBinder, patternStack ) );
+                .addRule( new SetNestedPropertiesIgnoreRule() );
 
             forPattern( "*/set-top-rule" ).addRule( new SetTopRule( targetRulesBinder, patternStack ) );
             forPattern( "*/set-next-rule" ).addRule( new SetNextRule( targetRulesBinder, patternStack ) );