[DIGESTER-156] Make (Nested|Set)PropertiesBuilder#addAlias() fluent

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/digester/trunk@1197969 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 8429c16..5a89ebe 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -60,6 +60,7 @@
 IMPROVEMENTS OVER PREVIOUS RELEASE
 ===================================
 
+ * [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 b7fd5b8..39343b3 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-156">
+      Make (Nested|Set)PropertiesBuilder#addAlias() fluent.
+    </action>
     <action dev="simonetripodi" type="fix" issue="DIGESTER-155">
       ClassLoader reference set to DigesterLoader not set in produced Digester instances
     </action>
diff --git a/src/main/java/org/apache/commons/digester3/annotations/handlers/SetPropertiesHandler.java b/src/main/java/org/apache/commons/digester3/annotations/handlers/SetPropertiesHandler.java
index ed6307e..c3e6b17 100644
--- a/src/main/java/org/apache/commons/digester3/annotations/handlers/SetPropertiesHandler.java
+++ b/src/main/java/org/apache/commons/digester3/annotations/handlers/SetPropertiesHandler.java
@@ -48,7 +48,7 @@
         if ( annotation.attributeName() != null && annotation.attributeName().length() > 0
             && !element.getName().equals( annotation.attributeName() ) )
         {
-            builder.addAlias( annotation.attributeName(), element.getName() );
+            builder.addAlias( annotation.attributeName() ).forProperty( element.getName() );
         }
     }
 
diff --git a/src/main/java/org/apache/commons/digester3/binder/NestedPropertiesBuilder.java b/src/main/java/org/apache/commons/digester3/binder/NestedPropertiesBuilder.java
index c719fcf..f2c021d 100644
--- a/src/main/java/org/apache/commons/digester3/binder/NestedPropertiesBuilder.java
+++ b/src/main/java/org/apache/commons/digester3/binder/NestedPropertiesBuilder.java
@@ -57,11 +57,7 @@
         {
             reportError( "setNestedProperties().ignoreElement( String )", "empty 'elementName' not allowed" );
         }
-        else
-        {
-            addAlias( elementName, null );
-        }
-        return this;
+        return addAlias( elementName ).forProperty( null );
     }
 
     /**
@@ -70,18 +66,28 @@
      * @param elementName The child xml element to match
      * @param propertyName The java bean property to be assigned the value
      * @return this builder instance
+     * @deprecated
      */
+    @Deprecated
     public NestedPropertiesBuilder addAlias( String elementName, String propertyName )
     {
+        return addAlias( elementName ).forProperty( propertyName );
+    }
+
+    /**
+     * Allows element2property mapping to be overridden.
+     *
+     * @param elementName
+     * @return the property alias builder
+     * @since 3.2
+     */
+    public AddAliasBuilder<NestedPropertiesBuilder> addAlias( String elementName )
+    {
         if ( elementName == null )
         {
-            reportError( "setNestedProperties().addAlias( String,String )", "empty 'elementName' not allowed" );
+            reportError( "setProperties().addAlias( String )", "empty 'elementName' not allowed" );
         }
-        else
-        {
-            elementNames.put( elementName, propertyName );
-        }
-        return this;
+        return new AddAliasBuilder<NestedPropertiesBuilder>( this, elementNames, elementName );
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/digester3/binder/SetPropertiesBuilder.java b/src/main/java/org/apache/commons/digester3/binder/SetPropertiesBuilder.java
index 6f33b01..c392315 100644
--- a/src/main/java/org/apache/commons/digester3/binder/SetPropertiesBuilder.java
+++ b/src/main/java/org/apache/commons/digester3/binder/SetPropertiesBuilder.java
@@ -47,18 +47,28 @@
      * @param attributeName The attribute to match
      * @param propertyName The java bean property to be assigned the value
      * @return this builder instance
+     * @deprecated
      */
+    @Deprecated
     public SetPropertiesBuilder addAlias( String attributeName, String propertyName )
     {
+        return addAlias( attributeName ).forProperty( propertyName );
+    }
+
+    /**
+     * Add an additional attribute name to property name mapping.
+     *
+     * @param attributeName The attribute to match
+     * @return the property alias builder
+     * @since 3.2
+     */
+    public AddAliasBuilder<SetPropertiesBuilder> addAlias( String attributeName )
+    {
         if ( attributeName == null )
         {
-            reportError( "setProperties().addAlias( String,String )", "empty 'attributeName' not allowed" );
+            reportError( "setProperties().addAlias( String )", "empty 'attributeName' not allowed" );
         }
-        else
-        {
-            aliases.put( attributeName, propertyName );
-        }
-        return this;
+        return new AddAliasBuilder<SetPropertiesBuilder>( this, aliases, attributeName );
     }
 
     /**
@@ -73,16 +83,12 @@
         {
             reportError( "setProperties().ignoreAttribute( String )", "empty 'attributeName' not allowed" );
         }
-        else
-        {
-            addAlias( attributeName, null );
-        }
-        return this;
+        return addAlias( attributeName ).forProperty( null );
     }
 
     /**
      * Sets whether attributes found in the XML without matching properties should be ignored.
-     * 
+     *
      * If set to false, the parsing will throw an {@code NoSuchMethodException}
      * if an unmatched attribute is found.
      * This allows to trap misspellings in the XML file.
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 572d238..e3a3d6d 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesAliasRule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/SetNestedPropertiesAliasRule.java
@@ -24,7 +24,7 @@
 import org.xml.sax.Attributes;
 
 /**
- * 
+ *
  */
 final class SetNestedPropertiesAliasRule
     extends AbstractXmlRule
@@ -45,7 +45,7 @@
         String elementName = attributes.getValue( "attr-name" );
         String propertyName = attributes.getValue( "prop-name" );
 
-        linkedRuleBuilder.setNestedProperties().addAlias( elementName, propertyName );
+        linkedRuleBuilder.setNestedProperties().addAlias( elementName ).forProperty( propertyName );
     }
 
 }
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 531798a..a61f4f5 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesAliasRule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/SetPropertiesAliasRule.java
@@ -24,7 +24,7 @@
 import org.xml.sax.Attributes;
 
 /**
- * 
+ *
  */
 final class SetPropertiesAliasRule
     extends AbstractXmlRule
@@ -45,7 +45,7 @@
         String attributeName = attributes.getValue( "attr-name" );
         String propertyName = attributes.getValue( "prop-name" );
 
-        linkedRuleBuilder.setProperties().addAlias( attributeName, propertyName );
+        linkedRuleBuilder.setProperties().addAlias( attributeName ).forProperty( propertyName );
     }
 
 }
diff --git a/src/test/java/org/apache/commons/digester3/SetNestedPropertiesRuleTestCase.java b/src/test/java/org/apache/commons/digester3/SetNestedPropertiesRuleTestCase.java
index 4c416df..eedf40a 100644
--- a/src/test/java/org/apache/commons/digester3/SetNestedPropertiesRuleTestCase.java
+++ b/src/test/java/org/apache/commons/digester3/SetNestedPropertiesRuleTestCase.java
@@ -142,9 +142,9 @@
                 forPattern( "root" ).createObject().ofType( "org.apache.commons.digester3.SimpleTestBean" )
                     .then()
                     .setNestedProperties()
-                        .addAlias( "alpha", null )
-                        .addAlias( "gamma-alt", "gamma" )
-                        .addAlias( "delta", null );
+                        .addAlias( "alpha" ).forProperty( null )
+                        .addAlias( "gamma-alt" ).forProperty( "gamma" )
+                        .addAlias( "delta" ).forProperty(  null );
             }
 
         }).newDigester();
@@ -184,7 +184,7 @@
                 forPattern( "root" ).createObject().ofType( "org.apache.commons.digester3.SimpleTestBean" )
                     .then()
                     .setNestedProperties()
-                        .addAlias( "alpha", null );
+                        .addAlias( "alpha" ).forProperty( null );
             }
 
         }).newDigester();
@@ -224,7 +224,7 @@
                 forPattern( "root" ).createObject().ofType( "org.apache.commons.digester3.SimpleTestBean" )
                     .then()
                     .setNestedProperties()
-                        .addAlias( "alpha-alt", "alpha" );
+                        .addAlias( "alpha-alt" ).forProperty( "alpha" );
             }
 
         }).newDigester();
diff --git a/src/test/java/org/apache/commons/digester3/SetPropertiesRuleTestCase.java b/src/test/java/org/apache/commons/digester3/SetPropertiesRuleTestCase.java
index 412eb7b..aa0a60f 100644
--- a/src/test/java/org/apache/commons/digester3/SetPropertiesRuleTestCase.java
+++ b/src/test/java/org/apache/commons/digester3/SetPropertiesRuleTestCase.java
@@ -198,7 +198,7 @@
                 forPattern( "root" ).createObject().ofType( "org.apache.commons.digester3.SimpleTestBean" )
                     .then()
                     .setProperties()
-                        .addAlias( "ignore", null )
+                        .addAlias( "ignore" ).forProperty( null )
                         .ignoreMissingProperty( false );
             }