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]

Reply via email to