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

madhan pushed a commit to branch ranger-2.7
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/ranger-2.7 by this push:
     new 59db73ae4 RANGER-3636: updated plugin classloader to use classloader 
of shim class as parent (#548)
59db73ae4 is described below

commit 59db73ae477556acaba7eb61e12ec11867b18f16
Author: Madhan Neethiraj <mad...@apache.org>
AuthorDate: Thu Jun 26 20:22:10 2025 +0530

    RANGER-3636: updated plugin classloader to use classloader of shim class as 
parent (#548)
    
    (cherry picked from commit 787639a0183f7ddaacf1fbaa91d711584615cc2d)
---
 .../classloader/RangerPluginClassLoader.java       | 221 ++++++++-------------
 1 file changed, 86 insertions(+), 135 deletions(-)

diff --git 
a/ranger-plugin-classloader/src/main/java/org/apache/ranger/plugin/classloader/RangerPluginClassLoader.java
 
b/ranger-plugin-classloader/src/main/java/org/apache/ranger/plugin/classloader/RangerPluginClassLoader.java
index 312356a82..3687162e1 100644
--- 
a/ranger-plugin-classloader/src/main/java/org/apache/ranger/plugin/classloader/RangerPluginClassLoader.java
+++ 
b/ranger-plugin-classloader/src/main/java/org/apache/ranger/plugin/classloader/RangerPluginClassLoader.java
@@ -19,6 +19,9 @@
 
 package org.apache.ranger.plugin.classloader;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.security.AccessController;
@@ -31,64 +34,52 @@
 import java.util.List;
 import java.util.Map;
 
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineFactory;
-import javax.script.ScriptEngineManager;
-
 public class RangerPluginClassLoader extends URLClassLoader {
     private static final Logger LOG = 
LoggerFactory.getLogger(RangerPluginClassLoader.class);
 
     private static final String TAG_SERVICE_TYPE = "tag";
 
-    private static final Map<String, RangerPluginClassLoader> 
pluginClassLoaders = new HashMap<>();
+    private static final Map<String, RangerPluginClassLoader> 
PLUGIN_CLASS_LOADERS = new HashMap<>();
 
-    private final MyClassLoader            componentClassLoader;
+    private final ComponentClassLoader     componentClassLoader;
     private final ThreadLocal<ClassLoader> preActivateClassLoader = new 
ThreadLocal<>();
 
     public RangerPluginClassLoader(String pluginType, Class<?> pluginClass ) 
throws Exception {
         
super(RangerPluginClassLoaderUtil.getInstance().getPluginFilesForServiceTypeAndPluginclass(pluginType,
 pluginClass), null);
 
-        componentClassLoader = AccessController.doPrivileged(
-                (PrivilegedAction<MyClassLoader>) () -> new 
MyClassLoader(Thread.currentThread().getContextClassLoader())
-        );
+        componentClassLoader = 
AccessController.doPrivileged((PrivilegedAction<ComponentClassLoader>) () -> 
new ComponentClassLoader(pluginClass));
     }
 
     public static RangerPluginClassLoader getInstance(final String pluginType, 
final Class<?> pluginClass ) throws Exception {
-        RangerPluginClassLoader ret = pluginClassLoaders.get(pluginType);
+        RangerPluginClassLoader ret = PLUGIN_CLASS_LOADERS.get(pluginType);
 
         if (ret == null) {
             synchronized(RangerPluginClassLoader.class) {
-                ret = pluginClassLoaders.get(pluginType);
+                ret = PLUGIN_CLASS_LOADERS.get(pluginType);
 
                 if (ret == null) {
                     if (pluginClass != null) {
-                        ret = AccessController.doPrivileged(
-                                
(PrivilegedExceptionAction<RangerPluginClassLoader>) () -> new 
RangerPluginClassLoader(pluginType, pluginClass)
-                        );
+                        ret = 
AccessController.doPrivileged((PrivilegedExceptionAction<RangerPluginClassLoader>)
 () -> new RangerPluginClassLoader(pluginType, pluginClass));
                     } else if (pluginType == null) { // let us pick an 
existing entry from pluginClassLoaders
-                        if (!pluginClassLoaders.isEmpty()) {
+                        if (!PLUGIN_CLASS_LOADERS.isEmpty()) {
                             // to be predictable, sort the keys
-                            List<String> pluginTypes = new 
ArrayList<>(pluginClassLoaders.keySet());
+                            List<String> pluginTypes = new 
ArrayList<>(PLUGIN_CLASS_LOADERS.keySet());
 
                             Collections.sort(pluginTypes);
 
                             String pluginTypeToUse = pluginTypes.get(0);
 
-                            ret = pluginClassLoaders.get(pluginTypeToUse);
+                            ret = PLUGIN_CLASS_LOADERS.get(pluginTypeToUse);
 
                             
LOG.info("RangerPluginClassLoader.getInstance(pluginType=null): using 
classLoader for pluginType={}", pluginTypeToUse);
                         }
                     }
 
                     if (ret != null) {
-                        pluginClassLoaders.put(pluginType, ret);
+                        PLUGIN_CLASS_LOADERS.put(pluginType, ret);
 
                         if (pluginType != null && 
!pluginType.equals(TAG_SERVICE_TYPE)) {
-                            pluginClassLoaders.put(TAG_SERVICE_TYPE, ret);
+                            PLUGIN_CLASS_LOADERS.put(TAG_SERVICE_TYPE, ret);
                         }
                     }
                 }
@@ -100,97 +91,48 @@ public static RangerPluginClassLoader getInstance(final 
String pluginType, final
 
     @Override
     public Class<?> findClass(String name) throws ClassNotFoundException {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("==> RangerPluginClassLoader.findClass(" + name + ")");
-        }
+        LOG.debug("==> RangerPluginClassLoader.findClass({})", name);
 
         Class<?> ret = null;
 
         try {
             // first we try to find a class inside the child classloader
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("RangerPluginClassLoader.findClass(" + name + "): 
calling childClassLoader().findClass() ");
-            }
+            LOG.debug("RangerPluginClassLoader.findClass({}): calling 
childClassLoader().findClass() ", name);
 
             ret = super.findClass(name);
         } catch( Throwable e ) {
            // Use the Component ClassLoader findClass to load when 
childClassLoader fails to find
-           if (LOG.isDebugEnabled()) {
-               LOG.debug("RangerPluginClassLoader.findClass(" + name + "): 
calling componentClassLoader.findClass()");
-           }
+           LOG.debug("RangerPluginClassLoader.findClass({}): calling 
componentClassLoader.findClass()", name);
 
-           MyClassLoader savedClassLoader = getComponentClassLoader();
+           ComponentClassLoader savedClassLoader = getComponentClassLoader();
 
            if (savedClassLoader != null) {
              ret = savedClassLoader.findClass(name);
            }
         }
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("<== RangerPluginClassLoader.findClass(" + name + "): " 
+ ret);
-        }
-
-        return ret;
-    }
-
-    @Override
-    public synchronized Class<?> loadClass(String name) throws 
ClassNotFoundException {
-        if (LOG.isDebugEnabled()) {
-             LOG.debug("==> RangerPluginClassLoader.loadClass(" + name + ")" );
-        }
-
-        Class<?> ret = null;
-
-        try {
-            // first we try to load a class inside the child classloader
-            if (LOG.isDebugEnabled()) {
-                 LOG.debug("RangerPluginClassLoader.loadClass(" + name + "): 
calling childClassLoader.findClass()");
-            }
-
-            ret = super.loadClass(name);
-         } catch(Throwable e) {
-            // Use the Component ClassLoader loadClass to load when 
childClassLoader fails to find
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("RangerPluginClassLoader.loadClass(" + name + "): 
calling componentClassLoader.loadClass()");
-           }
-
-            MyClassLoader savedClassLoader = getComponentClassLoader();
-
-            if(savedClassLoader != null) {
-              ret = savedClassLoader.loadClass(name);
-            }
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("<== RangerPluginClassLoader.loadClass(" + name + "): " 
+ ret);
-        }
+        LOG.debug("<== RangerPluginClassLoader.findClass({}): {}", name, ret);
 
         return ret;
     }
 
     @Override
     public URL findResource(String name) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("==> RangerPluginClassLoader.findResource(" + name + ") 
");
-        }
+        LOG.debug("==> RangerPluginClassLoader.findResource({}) ", name);
 
         URL ret =  super.findResource(name);
 
         if (ret == null) {
-           if(LOG.isDebugEnabled()) {
-               LOG.debug("RangerPluginClassLoader.findResource(" + name + "): 
calling componentClassLoader.getResources()");
-           }
+           LOG.debug("RangerPluginClassLoader.findResource({}): calling 
componentClassLoader.getResources()", name);
 
-           MyClassLoader savedClassLoader = getComponentClassLoader();
+           ComponentClassLoader savedClassLoader = getComponentClassLoader();
 
            if (savedClassLoader != null) {
               ret = savedClassLoader.getResource(name);
             }
         }
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("<== RangerPluginClassLoader.findResource(" + name + "): 
" + ret);
-        }
+        LOG.debug("<== RangerPluginClassLoader.findResource({}): {}", name, 
ret);
 
         return ret;
     }
@@ -199,16 +141,39 @@ public URL findResource(String name) {
     public Enumeration<URL> findResources(String name) {
         final Enumeration<URL> ret;
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("==> RangerPluginClassLoader.findResources(" + name + ") 
");
-        }
+        LOG.debug("==> RangerPluginClassLoader.findResources({}) ", name);
 
         ret = new 
MergeEnumeration(findResourcesUsingChildClassLoader(name),findResourcesUsingComponentClassLoader(name));
 
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("<== RangerPluginClassLoader.findResources(" + name + ") 
");
+        LOG.debug("<== RangerPluginClassLoader.findResources({}) ", name);
+
+        return ret;
+    }
+
+    @Override
+    public synchronized Class<?> loadClass(String name) throws 
ClassNotFoundException {
+        LOG.debug("==> RangerPluginClassLoader.loadClass({})", name);
+
+        Class<?> ret = null;
+
+        try {
+            // first we try to load a class inside the child classloader
+            LOG.debug("RangerPluginClassLoader.loadClass({}): calling 
childClassLoader.findClass()", name);
+
+            ret = super.loadClass(name);
+        } catch(Throwable e) {
+            // Use the Component ClassLoader loadClass to load when 
childClassLoader fails to find
+            LOG.debug("RangerPluginClassLoader.loadClass({}): calling 
componentClassLoader.loadClass()", name);
+
+            ComponentClassLoader savedClassLoader = getComponentClassLoader();
+
+            if(savedClassLoader != null) {
+                ret = savedClassLoader.loadClass(name);
+            }
         }
 
+        LOG.debug("<== RangerPluginClassLoader.loadClass({}): {}", name, ret);
+
         return ret;
     }
 
@@ -216,16 +181,12 @@ public Enumeration<URL> 
findResourcesUsingChildClassLoader(String name) {
         Enumeration<URL> ret = null;
 
         try {
-            if (LOG.isDebugEnabled()) {
-                
LOG.debug("RangerPluginClassLoader.findResourcesUsingChildClassLoader(" + name 
+ "): calling childClassLoader.findResources()");
-            }
+            
LOG.debug("RangerPluginClassLoader.findResourcesUsingChildClassLoader({}): 
calling childClassLoader.findResources()", name);
 
             ret =  super.findResources(name);
         } catch ( Throwable t) {
            //Ignore any exceptions. Null / Empty return is handle in following 
statements
-           if (LOG.isDebugEnabled()) {
-               
LOG.debug("RangerPluginClassLoader.findResourcesUsingChildClassLoader(" + name 
+ "): class not found in child. Falling back to componentClassLoader", t);
-           }
+           
LOG.debug("RangerPluginClassLoader.findResourcesUsingChildClassLoader({}): 
class not found in child. Falling back to componentClassLoader", name, t);
         }
 
        return ret;
@@ -235,32 +196,24 @@ public Enumeration<URL> 
findResourcesUsingComponentClassLoader(String name) {
          Enumeration<URL> ret = null;
 
          try {
-             if (LOG.isDebugEnabled()) {
-                 
LOG.debug("RangerPluginClassLoader.findResourcesUsingComponentClassLoader(" + 
name + "): calling componentClassLoader.getResources()");
-             }
+             
LOG.debug("RangerPluginClassLoader.findResourcesUsingComponentClassLoader({}): 
calling componentClassLoader.getResources()", name);
 
-             MyClassLoader savedClassLoader = getComponentClassLoader();
+             ComponentClassLoader savedClassLoader = getComponentClassLoader();
 
              if (savedClassLoader != null) {
                  ret = savedClassLoader.getResources(name);
              }
 
-             if (LOG.isDebugEnabled()) {
-                 LOG.debug("<== 
RangerPluginClassLoader.findResourcesUsingComponentClassLoader(" + name + "): " 
+ ret);
-             }
+             LOG.debug("<== 
RangerPluginClassLoader.findResourcesUsingComponentClassLoader({}): {}", name, 
ret);
          } catch( Throwable t) {
-            if (LOG.isDebugEnabled()) {
-               
LOG.debug("RangerPluginClassLoader.findResourcesUsingComponentClassLoader(" + 
name + "): class not found in componentClassLoader.", t);
-            }
+             
LOG.debug("RangerPluginClassLoader.findResourcesUsingComponentClassLoader({}): 
class not found in componentClassLoader.", name, t);
          }
 
          return ret;
      }
 
     public void activate() {
-        if (LOG.isDebugEnabled()) {
-           LOG.debug("==> RangerPluginClassLoader.activate()");
-        }
+        LOG.debug("==> RangerPluginClassLoader.activate()");
 
         //componentClassLoader.set(new 
MyClassLoader(Thread.currentThread().getContextClassLoader()));
 
@@ -268,22 +221,18 @@ public void activate() {
 
         Thread.currentThread().setContextClassLoader(this);
 
-        if (LOG.isDebugEnabled()) {
-           LOG.debug("<== RangerPluginClassLoader.activate()");
-        }
+        LOG.debug("<== RangerPluginClassLoader.activate()");
     }
 
     public void deactivate() {
-       if (LOG.isDebugEnabled()) {
-          LOG.debug("==> RangerPluginClassLoader.deactivate()");
-       }
+       LOG.debug("==> RangerPluginClassLoader.deactivate()");
 
        ClassLoader classLoader = preActivateClassLoader.get();
 
        if (classLoader != null) {
            preActivateClassLoader.remove();
        } else {
-           MyClassLoader savedClassLoader = getComponentClassLoader();
+           ComponentClassLoader savedClassLoader = getComponentClassLoader();
 
            if (savedClassLoader != null && savedClassLoader.getParent() != 
null) {
                classLoader = savedClassLoader.getParent();
@@ -296,25 +245,41 @@ public void deactivate() {
            LOG.warn("RangerPluginClassLoader.deactivate() was not successful. 
Couldn't get the saved classLoader...");
        }
 
-       if (LOG.isDebugEnabled()) {
-          LOG.debug("<== RangerPluginClassLoader.deactivate()");
-       }
+       LOG.debug("<== RangerPluginClassLoader.deactivate()");
+    }
+
+    public ClassLoader getPrevActiveClassLoader() {
+        ClassLoader ret = preActivateClassLoader.get();
+
+        if (ret == null) {
+            ComponentClassLoader savedClassLoader = getComponentClassLoader();
+
+            if (savedClassLoader != null && savedClassLoader.getParent() != 
null) {
+                ret = savedClassLoader.getParent();
+            }
+        }
+
+        return ret;
     }
 
-    private MyClassLoader getComponentClassLoader() {
+    private ComponentClassLoader getComponentClassLoader() {
         return componentClassLoader;
         //return componentClassLoader.get();
    }
 
-   static class  MyClassLoader extends ClassLoader {
-        public MyClassLoader(ClassLoader realClassLoader) {
-           super(realClassLoader);
+   static class ComponentClassLoader extends ClassLoader {
+        public ComponentClassLoader(Class<?> pluginShimClass) {
+           super(getClassLoaderOfShimClassOrCurrentThread(pluginShimClass));
         }
 
         @Override
         public Class<?> findClass(String name) throws ClassNotFoundException { 
//NO PMD
            return super.findClass(name);
         }
+
+        private static ClassLoader 
getClassLoaderOfShimClassOrCurrentThread(Class<?> pluginShimClass) {
+            return pluginShimClass != null ? pluginShimClass.getClassLoader() 
: Thread.currentThread().getContextClassLoader();
+        }
     }
 
    static class MergeEnumeration implements Enumeration<URL> { //NO PMD
@@ -335,9 +300,9 @@ public boolean hasMoreElements() {
         public URL nextElement() {
             final URL ret;
 
-            if (e1 != null && e1.hasMoreElements())
+            if (e1 != null && e1.hasMoreElements()) {
                 ret = e1.nextElement();
-            else if ( e2 != null && e2.hasMoreElements() ) {
+            } else if ( e2 != null && e2.hasMoreElements() ) {
                 ret = e2.nextElement();
             } else {
                 ret = null;
@@ -346,18 +311,4 @@ else if ( e2 != null && e2.hasMoreElements() ) {
             return ret;
         }
     }
-
-    public ClassLoader getPrevActiveClassLoader() {
-        ClassLoader ret = preActivateClassLoader.get();
-
-        if (ret == null) {
-            MyClassLoader savedClassLoader = getComponentClassLoader();
-
-            if (savedClassLoader != null && savedClassLoader.getParent() != 
null) {
-                ret = savedClassLoader.getParent();
-            }
-        }
-
-        return ret;
-    }
 }

Reply via email to