[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 );
+ }
+
}