Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class CoherentEventFactory {
// static initialiser
static {

Set<Class<ManagerEvent>> knownClasses = ReflectionUtil.loadClasses("org.asteriskjava.pbx.asterisk.wrap.events",
Set<Class<? extends ManagerEvent>> knownClasses = ReflectionUtil.loadClasses("org.asteriskjava.pbx.asterisk.wrap.events",
ManagerEvent.class);

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Expand Down
47 changes: 20 additions & 27 deletions src/main/java/org/asteriskjava/util/ReflectionUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -30,6 +32,8 @@
import java.util.concurrent.ConcurrentHashMap;
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
Expand Down Expand Up @@ -257,35 +261,24 @@ 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 <T> Set<Class<T>> loadClasses(String packageName, Class<T> baseClassOrInterface) {
Set<Class<T>> result = new HashSet<>();

try {
Set<String> 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<T>) clazz);
}
} catch (Throwable e) {
logger.error(e, e);
}

}
logger.info("Loaded " + result.size());
} catch (Exception e) {
logger.error(e, e);
}
public static <T> Set<Class<? extends T>> loadClasses(String packageName, Class<T> baseClassOrInterface) {
Set<Class<? extends T>> 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;
}
Expand Down