aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDecebal Suiu <decebal.suiu@gmail.com>2019-11-15 17:30:12 +0200
committerDecebal Suiu <decebal.suiu@gmail.com>2019-11-15 17:30:12 +0200
commit909af08634350910ec23dd7040a526dd3595cdbf (patch)
tree10c6224a2f15ce6073b235aa2cbccec1d9f01b2d
parent0312fc26005e6a1ec605c2230d21f088d2607be4 (diff)
downloadpf4j-#347.tar.gz
pf4j-#347.zip
Search recursively through all annotations to find @Extension#347
-rw-r--r--pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java24
1 files changed, 20 insertions, 4 deletions
diff --git a/pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java b/pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java
index b260c39..3cfbc7e 100644
--- a/pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java
+++ b/pf4j/src/main/java/org/pf4j/AbstractExtensionFinder.java
@@ -20,6 +20,7 @@ import org.pf4j.util.ClassUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -340,15 +341,30 @@ public abstract class AbstractExtensionFinder implements ExtensionFinder, Plugin
}
private ExtensionWrapper createExtensionWrapper(Class<?> extensionClass) {
- int ordinal = 0;
- if (extensionClass.isAnnotationPresent(Extension.class)) {
- ordinal = extensionClass.getAnnotation(Extension.class).ordinal();
- }
+ Extension extensionAnnotation = findExtensionAnnotation(extensionClass);
+ int ordinal = extensionAnnotation != null ? extensionAnnotation.ordinal() : 0;
ExtensionDescriptor descriptor = new ExtensionDescriptor(ordinal, extensionClass);
return new ExtensionWrapper<>(descriptor, pluginManager.getExtensionFactory());
}
+ private Extension findExtensionAnnotation(Class<?> clazz) {
+ if (clazz.isAnnotationPresent(Extension.class)) {
+ return clazz.getAnnotation(Extension.class);
+ }
+
+ // search recursively through all annotations
+ for (Annotation annotation : clazz.getAnnotations()) {
+ Class<? extends Annotation> annotationClass = annotation.annotationType();
+ Extension extensionAnnotation = findExtensionAnnotation(annotationClass);
+ if (extensionAnnotation != null) {
+ return extensionAnnotation;
+ }
+ }
+
+ return null;
+ }
+
private void checkDifferentClassLoaders(Class<?> type, Class<?> extensionClass) {
ClassLoader typeClassLoader = type.getClassLoader(); // class loader of extension point
ClassLoader extensionClassLoader = extensionClass.getClassLoader();