[DIGESTER-155] ClassLoader reference set to DigesterLoader not set in produced Digetser instances

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/digester/trunk@1197917 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 7be1cab..63242b5 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -55,7 +55,7 @@
 BUGS FROM PREVIOUS RELEASE
 ===========================
 
- * NONE
+ * [DIGESTER-155] ClassLoader reference set to DigesterLoader not set in produced Digetser instances
 
 IMPROVEMENTS OVER PREVIOUS RELEASE
 ===================================
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 506f3db..15e3408 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-155">
+      ClassLoader reference set to DigesterLoader not set in produced Digetser instances
+    </action>
     <action dev="simonetripodi" type="add" issue="DIGESTER-153">
       Add Constructor support to ObjectCreateRule
     </action>
diff --git a/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java b/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java
index 5e91f25..c9017a7 100644
--- a/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java
+++ b/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java
@@ -107,8 +107,6 @@
 
     private final Iterable<RulesModule> rulesModules;
 
-    private boolean useContextClassLoader = true;
-
     /**
      * The class loader to use for instantiating application objects.
      * If not specified, the context class loader, or the class loader
@@ -159,6 +157,7 @@
     private DigesterLoader( Iterable<RulesModule> rulesModules )
     {
         this.rulesModules = rulesModules;
+        setUseContextClassLoader( true );
     }
 
     /**
@@ -173,7 +172,14 @@
      */
     public DigesterLoader setUseContextClassLoader( boolean useContextClassLoader )
     {
-        this.useContextClassLoader = useContextClassLoader;
+        if ( useContextClassLoader )
+        {
+            setClassLoader( Thread.currentThread().getContextClassLoader() );
+        }
+        else
+        {
+            setClassLoader( getClass().getClassLoader() );
+        }
         return this;
     }
 
@@ -185,6 +191,11 @@
      */
     public DigesterLoader setClassLoader( ClassLoader classLoader )
     {
+        if ( classLoader == null )
+        {
+            throw new IllegalArgumentException( "Parameter 'classLoader' cannot be null" );
+        }
+
         this.classLoader = classLoader;
         return this;
     }
@@ -539,6 +550,7 @@
         }
 
         Digester digester = new Digester( reader );
+        digester.setClassLoader( classLoader );
         digester.setRules( rules );
         digester.setSubstitutor( substitutor );
         digester.registerAll( entityValidator );
@@ -572,14 +584,9 @@
      */
     public RuleSet createRuleSet()
     {
-        ClassLoader contextClassLoader =
-            classLoader != null ? classLoader
-                            : ( useContextClassLoader ? Thread.currentThread().getContextClassLoader()
-                                            : getClass().getClassLoader() );
-
-        if ( !contextClassLoader.equals( rulesBinder.getContextClassLoader() ) )
+        if ( !classLoader.equals( rulesBinder.getContextClassLoader() ) )
         {
-            rulesBinder.initialize( contextClassLoader );
+            rulesBinder.initialize( classLoader );
             for ( RulesModule rulesModule : rulesModules )
             {
                 rulesModule.configure( rulesBinder );
diff --git a/src/test/java/org/apache/commons/digester3/binder/DigesterLoaderTestCase.java b/src/test/java/org/apache/commons/digester3/binder/DigesterLoaderTestCase.java
index 86dea27..e78ea14 100644
--- a/src/test/java/org/apache/commons/digester3/binder/DigesterLoaderTestCase.java
+++ b/src/test/java/org/apache/commons/digester3/binder/DigesterLoaderTestCase.java
@@ -124,4 +124,25 @@
         assertSame( expected, actual );
     }
 
+    @Test
+    public void digester155()
+    {
+        ClassLoader expected = getClass().getClassLoader();
+
+        Digester digester = newLoader( new AbstractRulesModule()
+        {
+
+            @Override
+            protected void configure()
+            {
+                // do nothing
+            }
+
+        } ).setClassLoader( expected ).newDigester();
+
+        ClassLoader actual = digester.getClassLoader();
+
+        assertSame( expected, actual );
+    }
+
 }