This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 69e90ce0e47a773cfb9374cca4bb03a0110560a5 Author: Benoit TELLIER <[email protected]> AuthorDate: Fri Nov 17 14:29:14 2023 +0100 [BUILD] Implement caching for ExtendedClassLoader In the tests it takes 40ms for a Memory james server to look up classes on the classpath. --- .../org/apache/james/utils/ExtendedClassLoader.java | 19 +++++++++++++++++-- .../org/apache/james/utils/GuiceGenericLoader.java | 6 +----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/server/container/guice/utils/src/main/java/org/apache/james/utils/ExtendedClassLoader.java b/server/container/guice/utils/src/main/java/org/apache/james/utils/ExtendedClassLoader.java index 5602a68b6f..e9808c7b1d 100644 --- a/server/container/guice/utils/src/main/java/org/apache/james/utils/ExtendedClassLoader.java +++ b/server/container/guice/utils/src/main/java/org/apache/james/utils/ExtendedClassLoader.java @@ -24,6 +24,9 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import java.util.stream.Stream; import javax.inject.Inject; @@ -36,6 +39,7 @@ import org.slf4j.LoggerFactory; import com.github.fge.lambdas.Throwing; public class ExtendedClassLoader { + private static final Map<FullyQualifiedClassName, Optional<Class<?>>> cache = new HashMap<>(); private static final Logger LOGGER = LoggerFactory.getLogger(ExtendedClassLoader.class); @@ -73,7 +77,18 @@ public class ExtendedClassLoader { } @SuppressWarnings("unchecked") - public <T> Class<T> locateClass(FullyQualifiedClassName className) throws ClassNotFoundException { - return (Class<T>) urlClassLoader.loadClass(className.getName()); + public <T> Optional<Class<T>> locateClass(FullyQualifiedClassName className) { + Optional<Class<?>> cachedValue = cache.get(className); + if (cachedValue != null) { + return (Optional) cachedValue; + } + try { + Class<?> aClass = urlClassLoader.loadClass(className.getName()); + cache.put(className, Optional.of(aClass)); + return (Optional) Optional.of(aClass); + } catch (ClassNotFoundException e) { + cache.put(className, Optional.empty()); + return Optional.empty(); + } } } diff --git a/server/container/guice/utils/src/main/java/org/apache/james/utils/GuiceGenericLoader.java b/server/container/guice/utils/src/main/java/org/apache/james/utils/GuiceGenericLoader.java index f727a5cd26..997059d821 100644 --- a/server/container/guice/utils/src/main/java/org/apache/james/utils/GuiceGenericLoader.java +++ b/server/container/guice/utils/src/main/java/org/apache/james/utils/GuiceGenericLoader.java @@ -73,11 +73,7 @@ public class GuiceGenericLoader { } private Stream<Class<T>> tryLocateClass(FullyQualifiedClassName className) { - try { - return Stream.of(extendedClassLoader.locateClass(className)); - } catch (ClassNotFoundException e) { - return Stream.empty(); - } + return (Stream) extendedClassLoader.locateClass(className).stream(); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
