You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pa...@apache.org on 2020/01/28 12:15:06 UTC

svn commit: r1873245 - in /felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework: BundleWiringImpl.java util/SecureAction.java

Author: pauls
Date: Tue Jan 28 12:15:06 2020
New Revision: 1873245

URL: http://svn.apache.org/viewvc?rev=1873245&view=rev
Log:
Rework unsave usage to be triggered by static init

Modified:
    felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
    felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/util/SecureAction.java

Modified: felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/BundleWiringImpl.java?rev=1873245&r1=1873244&r2=1873245&view=diff
==============================================================================
--- felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/BundleWiringImpl.java (original)
+++ felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/BundleWiringImpl.java Tue Jan 28 12:15:06 2020
@@ -1533,24 +1533,21 @@ public class BundleWiringImpl implements
 
                     try
                     {
-                        result = tryImplicitBootDelegation(name, isClass);
-                    }
-                    catch (Exception ex)
-                    {
-                        // Ignore, will throw using CNFE_CLASS_LOADER
-                    }
+                        // Get the appropriate class loader for delegation.
+                        ClassLoader bdcl = getBootDelegationClassLoader();
+                        result = (isClass) ? (Object) bdcl.loadClass(name) : (Object) bdcl.getResource(name);
 
-                    if (result != null)
-                    {
-                        m_accessorLookupCache.put(name, BundleRevisionImpl.getSecureAction()
-                                .getClassLoader(this.getClass()));
-                        return result;
+                        if (result != null)
+                        {
+                            m_accessorLookupCache.put(name, bdcl);
+                            return result;
+                        }
                     }
-                    else
+                    catch (ClassNotFoundException ex)
                     {
-                        m_accessorLookupCache.put(name, CNFE_CLASS_LOADER);
-                        CNFE_CLASS_LOADER.loadClass(name);
                     }
+                    m_accessorLookupCache.put(name, CNFE_CLASS_LOADER);
+                    CNFE_CLASS_LOADER.loadClass(name);
                 }
 
                 // Look in the revision's imports. Note that the search may

Modified: felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/util/SecureAction.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/util/SecureAction.java?rev=1873245&r1=1873244&r2=1873245&view=diff
==============================================================================
--- felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/util/SecureAction.java (original)
+++ felix/sandbox/pauls/connect/src/main/java/org/apache/felix/framework/util/SecureAction.java Tue Jan 28 12:15:06 2020
@@ -81,6 +81,7 @@ public class SecureAction
             result = new byte[0];
         }
         accessor = result;
+        getAccessor(URL.class);
     }
 
     private static final ThreadLocal m_actions = new ThreadLocal()
@@ -1012,14 +1013,14 @@ public class SecureAction
         }
     }
 
-    private static ConcurrentHashMap<Class, Object> m_accessorCache = new ConcurrentHashMap<>();
+    private static volatile Consumer<AccessibleObject[]> m_accessorCache = null;
 
     @SuppressWarnings("unchecked")
     private static Consumer<AccessibleObject[]> getAccessor(Class clazz) {
         String packageName = clazz.getPackage().getName();
         if ("java.net".equals(packageName) || "jdk.internal.loader".equals(packageName))
         {
-            return (Consumer<AccessibleObject[]>) m_accessorCache.computeIfAbsent(clazz, target ->
+            if (m_accessorCache == null)
             {
                 try
                 {
@@ -1035,16 +1036,17 @@ public class SecureAction
 
                     Class<Consumer<AccessibleObject[]>> result =
                         (Class<Consumer<AccessibleObject[]>>)
-                            defineAnonymousClass.invoke(unsafe, packageName.equals("java.net") ? clazz : URL.class, accessor , null);
-                    return result.getConstructor().newInstance();
+                            defineAnonymousClass.invoke(unsafe, URL.class, accessor , null);
+                    m_accessorCache = result.getConstructor().newInstance();
 
                 }
                 catch (Throwable t)
                 {
                     t.printStackTrace();
-                    return (Consumer<AccessibleObject[]>) objects -> AccessibleObject.setAccessible(objects, true);
+                    m_accessorCache = objects -> AccessibleObject.setAccessible(objects, true);
                 }
-            });
+            }
+            return m_accessorCache;
         }
         else {
             return objects -> AccessibleObject.setAccessible(objects, true);