My patch is attatched.  I also posted bug 2669 regarding
this issue:
  http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2669

- Gidado


> I am aware of this issue, and in talking with Craig, the solution is to
add
> a boolean useContextClassLoader to digester to turn this on and off.  I
will
> be updating the Commons Digester to handle this hopefully in the next week
> or two.  If you want to send a patch, feel free ;-)
>
> Scott Sanders

Index: ObjectCreateRule.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/digester/src/java/org/apache/commons/digester/ObjectCreateRule.java,v
retrieving revision 1.2
diff -u -r1.2 ObjectCreateRule.java
--- ObjectCreateRule.java       2001/05/12 17:25:54     1.2
+++ ObjectCreateRule.java       2001/07/18 14:12:57
@@ -153,16 +153,19 @@
        // Instantiate the new object and push it on the context stack
     Class clazz = null;
 
-    // Check to see if the context class loader is set,
-    // and if so, use it, as it may be set in server-side
-    // environments and Class.forName() may cause issues
-    ClassLoader ctxLoader = 
-        Thread.currentThread().getContextClassLoader();
-    if (ctxLoader == null) {
-        clazz = Class.forName(realClassName);
-    } else {
-        clazz = ctxLoader.loadClass(realClassName);
-    }
+    // Check to see if the context class loader is set, and if so, use
+    // it (only if allowed to by the associated digester), as it may
+    // be set in server-side environments and Class.forName() may
+    // cause issues
+       ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
+       boolean ucl = digester.getUseContextClassLoader();
+       if (ctxLoader!=null && digester.getUseContextClassLoader()) {
+               System.out.println("UseCCL [" + ucl + "] Using CCL: " + ctxLoader);
+               clazz = ctxLoader.loadClass(realClassName);
+       } else {
+               System.out.println("UseCCL [" + ucl + "] Using Class.forName()");
+               clazz = Class.forName(realClassName);
+       }
        
     Object instance = clazz.newInstance();
        digester.push(instance);
Index: Digester.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/digester/src/java/org/apache/commons/digester/Digester.java,v
retrieving revision 1.6
diff -u -r1.6 Digester.java
--- Digester.java       2001/06/24 17:02:21     1.6
+++ Digester.java       2001/07/18 14:13:02
@@ -239,6 +239,13 @@
     protected PrintWriter writer = null;
 
 
+    /**
+     * Do we want to use the Context ClassLoader when loading classes
+        * for instantiating new objects?  Default is <code>false</code>.
+     */
+    protected boolean useContextClassLoader = false;
+
+
     // ----------------------------------------------------------- Properties
 
 
@@ -388,6 +395,33 @@
     public void setWriter(PrintWriter writer) {
 
         this.writer = writer;
+
+    }
+
+
+
+    /**
+     * Return the logging writer for this Digester.
+     */
+    public boolean getUseContextClassLoader() {
+
+        return useContextClassLoader;
+
+    }
+
+
+    /**
+     * Determine whether to use the Context ClassLoader (the one found by
+        * calling <code>Thread.currentThread().getContextClassLoader()</code>)
+        * to resolve/load classes that are defined in various rules.  If not
+        * using Context ClassLoader, then the class-loading defaults to 
+        * using the calling-class' ClassLoader.
+     *
+     * @param boolean determines whether to use Context ClassLoader.
+     */
+    public void setUseContextClassLoader(boolean use) {
+
+               useContextClassLoader = use;
 
     }
 

Reply via email to