From 026864afe22fcd7e1ab2429b3d31204ef10167c2 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Mon, 12 Aug 2024 16:25:17 -0400 Subject: [PATCH 1/2] CoherentEventFactory.java: Use org.reflections in ReflectionsUtil. Fixes #582 --- .../internal/core/CoherentEventFactory.java | 2 +- .../org/asteriskjava/util/ReflectionUtil.java | 43 +++++++------------ 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java index 22941bf19..454a2ff9d 100644 --- a/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java +++ b/src/main/java/org/asteriskjava/pbx/internal/core/CoherentEventFactory.java @@ -35,7 +35,7 @@ public class CoherentEventFactory { // static initialiser static { - Set> knownClasses = ReflectionUtil.loadClasses("org.asteriskjava.pbx.asterisk.wrap.events", + Set> knownClasses = ReflectionUtil.loadClasses("org.asteriskjava.pbx.asterisk.wrap.events", ManagerEvent.class); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); diff --git a/src/main/java/org/asteriskjava/util/ReflectionUtil.java b/src/main/java/org/asteriskjava/util/ReflectionUtil.java index 0dfc844e0..bd655a2bc 100644 --- a/src/main/java/org/asteriskjava/util/ReflectionUtil.java +++ b/src/main/java/org/asteriskjava/util/ReflectionUtil.java @@ -16,6 +16,8 @@ */ package org.asteriskjava.util; +import org.reflections.Reflections; + import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; @@ -30,6 +32,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.stream.Collectors; /** * Utility class that provides helper methods for reflection that is used by the @@ -257,35 +260,21 @@ public static Object newInstance(String s) { private static final Log logger = LogFactory.getLog(ReflectionUtil.class); /** - * find and all non abstract classes that implement/extend - * baseClassOrInterface in the package packageName + * Find all non-abstract classes in the given package that + * implement/extend the provided type. * - * @param packageName - * @param baseClassOrInterface - * @return + * @param packageName the package to search + * @param baseClassOrInterface the supertype or interface to filter by + * @return a Set of types that implement or extend the provided type */ - @SuppressWarnings("unchecked") - public static Set> loadClasses(String packageName, Class baseClassOrInterface) { - Set> result = new HashSet<>(); - - try { - Set classNames = getClassNamesFromPackage(packageName); - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - for (String className : classNames) { - try { - Class clazz = classLoader.loadClass(packageName + "." + className); - if (!Modifier.isAbstract(clazz.getModifiers()) && baseClassOrInterface.isAssignableFrom(clazz)) { - result.add((Class) clazz); - } - } catch (Throwable e) { - logger.error(e, e); - } - - } - logger.info("Loaded " + result.size()); - } catch (Exception e) { - logger.error(e, e); - } + public static Set> loadClasses(String packageName, Class baseClassOrInterface) { + Set> result = new Reflections(packageName) + .getSubTypesOf(baseClassOrInterface) + .stream() + .filter(c -> !Modifier.isAbstract(c.getModifiers())) + .collect(Collectors.toSet()); + + logger.info("Loaded " + result.size()); return result; } From 05fb7f301487b1b6baf7c531d4cc5e90b8ad681b Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Sat, 17 Aug 2024 15:51:19 -0400 Subject: [PATCH 2/2] ReflectionUtil.java: For backwards compatibility, always include `baseClassOrInterface`. --- .../org/asteriskjava/util/ReflectionUtil.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/asteriskjava/util/ReflectionUtil.java b/src/main/java/org/asteriskjava/util/ReflectionUtil.java index bd655a2bc..83b80282c 100644 --- a/src/main/java/org/asteriskjava/util/ReflectionUtil.java +++ b/src/main/java/org/asteriskjava/util/ReflectionUtil.java @@ -33,6 +33,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Utility class that provides helper methods for reflection that is used by the @@ -268,13 +269,16 @@ public static Object newInstance(String s) { * @return a Set of types that implement or extend the provided type */ public static Set> loadClasses(String packageName, Class baseClassOrInterface) { - Set> result = new Reflections(packageName) - .getSubTypesOf(baseClassOrInterface) - .stream() - .filter(c -> !Modifier.isAbstract(c.getModifiers())) - .collect(Collectors.toSet()); - - logger.info("Loaded " + result.size()); + Set> result = + Stream.concat( + Stream.of(baseClassOrInterface), + new Reflections(packageName) + .getSubTypesOf(baseClassOrInterface) + .stream()) + .filter(c -> !Modifier.isAbstract(c.getModifiers())) + .collect(Collectors.toSet()); + + logger.info("Loaded asd" + result.size()); return result; }