This is an automated email from the ASF dual-hosted git repository.

fhanik pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/9.0.x by this push:
     new 44c8234  Add in an ability to configure a custom class loader
44c8234 is described below

commit 44c82344ecb1d436d4e88a81fc3788981d3bad6f
Author: Filip Hanik <fha...@pivotal.io>
AuthorDate: Wed Aug 12 11:14:13 2020 -0700

    Add in an ability to configure a custom class loader
    
    without using reflection
    beneficial for programmatic usage
    and building native images using GraalVM
---
 java/org/apache/catalina/loader/WebappLoader.java  | 16 +++++++++++++
 .../catalina/loader/TestVirtualWebappLoader.java   | 27 ++++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/java/org/apache/catalina/loader/WebappLoader.java 
b/java/org/apache/catalina/loader/WebappLoader.java
index 95d70c2..7076c20 100644
--- a/java/org/apache/catalina/loader/WebappLoader.java
+++ b/java/org/apache/catalina/loader/WebappLoader.java
@@ -243,6 +243,18 @@ public class WebappLoader extends LifecycleMBeanBase
         this.loaderClass = loaderClass;
     }
 
+    /**
+     * Set the ClassLoader instance, without relying on reflection
+     * This method will also invoke {@link #setLoaderClass(String)} with
+     * {@code loaderInstance.getClass().getName()} as an argument
+     *
+     * @param loaderInstance The new ClassLoader instance to use
+     */
+    public void setLoaderInstance(WebappClassLoaderBase loaderInstance) {
+        this.classLoader = loaderInstance;
+        setLoaderClass(loaderInstance.getClass().getName());
+    }
+
 
     /**
      * Return the reloadable flag for this Loader.
@@ -507,6 +519,10 @@ public class WebappLoader extends LifecycleMBeanBase
     private WebappClassLoaderBase createClassLoader()
         throws Exception {
 
+        if (classLoader != null) {
+            return classLoader;
+        }
+
         if (parentClassLoader == null) {
             parentClassLoader = context.getParentClassLoader();
         } else {
diff --git a/test/org/apache/catalina/loader/TestVirtualWebappLoader.java 
b/test/org/apache/catalina/loader/TestVirtualWebappLoader.java
index afcd8a3..11d840e 100644
--- a/test/org/apache/catalina/loader/TestVirtualWebappLoader.java
+++ b/test/org/apache/catalina/loader/TestVirtualWebappLoader.java
@@ -37,6 +37,33 @@ public class TestVirtualWebappLoader extends TomcatBaseTest {
     }
 
     @Test
+    public void testLoaderInstance() throws Exception {
+        WebappLoader loader = new WebappLoader();
+        Assert.assertNull(loader.getClassLoader());
+        WebappClassLoader cl = new WebappClassLoader();
+        loader.setLoaderInstance(cl);
+        Assert.assertSame(cl, loader.getClassLoader());
+        Assert.assertEquals(WebappClassLoader.class.getName(), 
loader.getLoaderClass());
+
+        Tomcat tomcat = getTomcatInstance();
+
+        File appDir = new File("test/webapp");
+        StandardContext ctx = (StandardContext) tomcat.addContext("",
+                appDir.getAbsolutePath());
+
+        loader.setContext(ctx);
+        ctx.setLoader(loader);
+
+
+        loader.start();
+        Assert.assertSame(cl, loader.getClassLoader());
+        Assert.assertEquals(WebappClassLoader.class.getName(), 
loader.getLoaderClass());
+        loader.stop();
+        Assert.assertNull(loader.getClassLoader());
+        Assert.assertEquals(WebappClassLoader.class.getName(), 
loader.getLoaderClass());
+    }
+
+    @Test
     public void testStartInternal() throws Exception {
         Tomcat tomcat = getTomcatInstance();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to