From 66289293103da132d01c63ecb647792b8be0e40f Mon Sep 17 00:00:00 2001 From: Luke Hutchison Date: Wed, 2 Jun 2021 03:54:03 -0600 Subject: [PATCH] Use IdentityHashMap for all maps and sets (#515) --- .../classpath/ClassLoaderOrder.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/nonapi/io/github/classgraph/classpath/ClassLoaderOrder.java b/src/main/java/nonapi/io/github/classgraph/classpath/ClassLoaderOrder.java index 520d57d70..a39f70212 100644 --- a/src/main/java/nonapi/io/github/classgraph/classpath/ClassLoaderOrder.java +++ b/src/main/java/nonapi/io/github/classgraph/classpath/ClassLoaderOrder.java @@ -30,8 +30,8 @@ import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; +import java.util.Collections; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -52,23 +52,28 @@ public class ClassLoaderOrder { * The set of all {@link ClassLoader} instances that have been added to the order so far, so that classloaders * don't get added twice. */ - private final Set added = new HashSet<>(); + // Need to use IdentityHashMap for maps and sets here, because TomEE weirdly makes instances of + // CxfContainerClassLoader equal to (via .equals()) the instance of TomEEWebappClassLoader that it + // delegates to (#515) + private final Set added = Collections.newSetFromMap(new IdentityHashMap()); /** * The set of all {@link ClassLoader} instances that have been delegated to so far, to prevent an infinite loop * in delegation. */ - private final Set delegatedTo = new HashSet<>(); + private final Set delegatedTo = Collections + .newSetFromMap(new IdentityHashMap()); /** * The set of all parent {@link ClassLoader} instances that have been delegated to so far, to enable * {@link ClassGraph#ignoreParentClassLoaders()}. */ - private final Set allParentClassLoaders = new HashSet<>(); + private final Set allParentClassLoaders = Collections + .newSetFromMap(new IdentityHashMap()); /** A map from {@link ClassLoader} to {@link ClassLoaderHandlerRegistryEntry}. */ private final Map classLoaderToClassLoaderHandlerRegistryEntry = // - new HashMap<>(); + new IdentityHashMap(); // ------------------------------------------------------------------------------------------------------------- @@ -130,7 +135,7 @@ private ClassLoaderHandlerRegistryEntry getRegistryEntry(final ClassLoader class } /** - * Add a {@link ClassLoader} to the {@link ClassLoader} order at the current position. + * Add a {@link ClassLoader} to the ClassLoader order at the current position. * * @param classLoader * the class loader