5858import hudson .security .ACLContext ;
5959import hudson .security .Permission ;
6060import hudson .security .PermissionScope ;
61+ import hudson .util .CachingClassLoader ;
6162import hudson .util .CyclicGraphDetector ;
6263import hudson .util .CyclicGraphDetector .CycleDetectedException ;
63- import hudson .util .DelegatingClassLoader ;
6464import hudson .util .ExistenceCheckingClassLoader ;
6565import hudson .util .FormValidation ;
6666import hudson .util .PersistedList ;
108108import java .util .Locale ;
109109import java .util .Map ;
110110import java .util .Objects ;
111- import java .util .Optional ;
112111import java .util .ServiceLoader ;
113112import java .util .Set ;
114113import java .util .TreeMap ;
115114import java .util .UUID ;
116115import java .util .concurrent .ConcurrentHashMap ;
117- import java .util .concurrent .ConcurrentMap ;
118116import java .util .concurrent .CopyOnWriteArrayList ;
119117import java .util .concurrent .Future ;
120118import java .util .function .Supplier ;
@@ -2402,12 +2400,9 @@ public <T> T of(String key, Class<T> type, Supplier<T> func) {
24022400 /**
24032401 * {@link ClassLoader} that can see all plugins.
24042402 */
2405- public static final class UberClassLoader extends DelegatingClassLoader {
2403+ public static final class UberClassLoader extends CachingClassLoader {
24062404 private final List <PluginWrapper > activePlugins ;
24072405
2408- /** Cache of loaded, or known to be unloadable, classes. */
2409- private final ConcurrentMap <String , Optional <Class <?>>> loaded = new ConcurrentHashMap <>();
2410-
24112406 /**
24122407 * The servlet container's {@link ClassLoader} (the parent of Jenkins core) is
24132408 * parallel-capable and maintains its own growing {@link Map} of {@link
@@ -2426,29 +2421,29 @@ public UberClassLoader(List<PluginWrapper> activePlugins) {
24262421 }
24272422
24282423 @ Override
2429- protected Class <?> findClass (String name ) throws ClassNotFoundException {
2424+ protected Class <?> loadClass (String name , boolean resolve ) throws ClassNotFoundException {
24302425 for (String namePrefixToSkip : CLASS_PREFIXES_TO_SKIP ) {
24312426 if (name .startsWith (namePrefixToSkip )) {
24322427 throw new ClassNotFoundException ("ignoring " + name );
24332428 }
24342429 }
2435- return loaded . computeIfAbsent (name , this :: computeValue ). orElseThrow (() -> new ClassNotFoundException ( name ) );
2430+ return super . loadClass (name , resolve );
24362431 }
24372432
2438- private Optional <Class <?>> computeValue (String name ) {
2433+ @ Override
2434+ protected Class <?> findClass (String name ) throws ClassNotFoundException {
24392435 for (PluginWrapper p : activePlugins ) {
24402436 try {
24412437 if (FAST_LOOKUP ) {
2442- return Optional . of ( ClassLoaderReflectionToolkit .loadClass (p .classLoader , name ) );
2438+ return ClassLoaderReflectionToolkit .loadClass (p .classLoader , name );
24432439 } else {
2444- return Optional . of ( p .classLoader .loadClass (name ) );
2440+ return p .classLoader .loadClass (name );
24452441 }
24462442 } catch (ClassNotFoundException e ) {
24472443 // Not found. Try the next class loader.
24482444 }
24492445 }
2450- // Not found in any of the class loaders. Delegate.
2451- return Optional .empty ();
2446+ throw new ClassNotFoundException (name );
24522447 }
24532448
24542449 @ Override
@@ -2480,10 +2475,6 @@ protected Enumeration<URL> findResources(String name) throws IOException {
24802475 return Collections .enumeration (resources );
24812476 }
24822477
2483- void clearCacheMisses () {
2484- loaded .values ().removeIf (Optional ::isEmpty );
2485- }
2486-
24872478 @ Override
24882479 public String toString () {
24892480 // only for debugging purpose
0 commit comments