]> source.dussan.org Git - pf4j.git/commitdiff
Relax the concept of extension point
authorDecebal Suiu <decebal.suiu@gmail.com>
Fri, 20 Dec 2019 21:17:30 +0000 (23:17 +0200)
committerDecebal Suiu <decebal.suiu@gmail.com>
Fri, 20 Dec 2019 21:17:30 +0000 (23:17 +0200)
pf4j/src/main/java/org/pf4j/Extension.java
pf4j/src/main/java/org/pf4j/processor/ExtensionAnnotationProcessor.java
pf4j/src/test/java/org/pf4j/ExtensionAnnotationProcessorTest.java

index 57a435c056e433655d00ff7b64bc5709d544bb9e..b9fe6a1167be17f99ba5cade778e8d22181fd63f 100644 (file)
@@ -45,7 +45,7 @@ public @interface Extension {
      *
      * @return classes of extension points, that are implemented by this extension
      */
-    Class<? extends ExtensionPoint>[] points() default {};
+    Class<?>[] points() default {};
 
     /**
      * An array of plugin IDs, that have to be available in order to load this extension.
index 797fe043f4df8540f258c78e7da9a64863fdb6ba..29c44e33a6b613009ff0f32135d486dd4c1ea042 100644 (file)
@@ -51,14 +51,14 @@ import java.util.TreeSet;
  */
 public class ExtensionAnnotationProcessor extends AbstractProcessor {
 
-    private static final String STORAGE_CLASS_NAME = "pf4j.storageClassName";
-    private static final String IGNORE_EXTENSION_POINT = "pf4j.ignoreExtensionPoint";
+    public static final String STORAGE_CLASS_NAME = "pf4j.storageClassName";
+    public static final String CHECK_EXTENSION_POINT = "pf4j.checkExtensionPoint";
 
     private Map<String, Set<String>> extensions = new HashMap<>(); // the key is the extension point
     private Map<String, Set<String>> oldExtensions = new HashMap<>(); // the key is the extension point
 
     private ExtensionStorage storage;
-    private boolean ignoreExtensionPoint;
+    private boolean checkExtensionPoint;
 
     @Override
     public synchronized void init(ProcessingEnvironment processingEnv) {
@@ -68,7 +68,7 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor {
         info("Options %s", processingEnv.getOptions());
 
         initStorage();
-        initIgnoreExtensionPoint();
+        initCheckExtensionPoint();
     }
 
     @Override
@@ -85,7 +85,7 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor {
     public Set<String> getSupportedOptions() {
         Set<String> options = new HashSet<>();
         options.add(STORAGE_CLASS_NAME);
-        options.add(IGNORE_EXTENSION_POINT);
+        options.add(CHECK_EXTENSION_POINT);
 
         return options;
     }
@@ -180,11 +180,12 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor {
         }
 
         // check if class extends/implements an extension point
-        if (!ignoreExtensionPoint && !isExtension(element.asType())) {
+        if (checkExtensionPoint && !isExtension(element.asType())) {
             error(element, "%s is not an extension (it doesn't implement ExtensionPoint)", element);
             return;
         }
 
+        // collect all extension points of extension
         TypeElement extensionElement = (TypeElement) element;
         List<TypeElement> extensionPointElements = findExtensionPoints(extensionElement);
         if (extensionPointElements.isEmpty()) {
@@ -192,6 +193,7 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor {
             return;
         }
 
+        // add the extension together with the extension point in the list with extensions
         String extension = getBinaryName(extensionElement);
         for (TypeElement extensionPointElement : extensionPointElements) {
             String extensionPoint = getBinaryName(extensionPointElement);
@@ -237,7 +239,7 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor {
             }
 
             // pickup the first interface
-            if (extensionPointElements.isEmpty() && ignoreExtensionPoint) {
+            if (extensionPointElements.isEmpty() && !checkExtensionPoint) {
                 if (interfaces.isEmpty()) {
                     error(extensionElement, "%s is not an extension (it doesn't implement any interface)", extensionElement);
                 } else if (interfaces.size() == 1) {
@@ -285,10 +287,10 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor {
         }
     }
 
-    private void initIgnoreExtensionPoint() {
+    private void initCheckExtensionPoint() {
         // search in processing options and system properties
-        ignoreExtensionPoint = getProcessingEnvironment().getOptions().containsKey(IGNORE_EXTENSION_POINT) ||
-            System.getProperty(IGNORE_EXTENSION_POINT) != null;
+        checkExtensionPoint = getProcessingEnvironment().getOptions().containsKey(CHECK_EXTENSION_POINT) ||
+            System.getProperty(CHECK_EXTENSION_POINT) != null;
     }
 
     private TypeElement getElement(TypeMirror typeMirror) {
index 081be99c9ebce784e794918a83e68757ea9e3f6b..11467c8e723c9d27802dd6f94c418fc7dad45662 100644 (file)
@@ -145,12 +145,24 @@ public class ExtensionAnnotationProcessorTest {
          assertThat(compilation).succeededWithoutWarnings();
     }
 
+    @Test
+    public void compileWithErrorNoExtensionPoint() {
+        ExtensionAnnotationProcessor processor = new ExtensionAnnotationProcessor();
+        Compilation compilation = javac().withProcessors(processor).withOptions("-A" + ExtensionAnnotationProcessor.CHECK_EXTENSION_POINT)
+            .compile(Greeting, WhazzupGreeting_NoExtensionPoint);
+        assertThat(compilation).failed();
+        assertThat(compilation).hadErrorContaining("it doesn't implement ExtensionPoint")
+            .inFile(WhazzupGreeting_NoExtensionPoint)
+            .onLine(5)
+            .atColumn(8);
+    }
+
     @Test
     public void compileWithError() {
         ExtensionAnnotationProcessor processor = new ExtensionAnnotationProcessor();
         Compilation compilation = javac().withProcessors(processor).compile(Greeting, WhazzupGreeting_NoExtensionPoint);
         assertThat(compilation).failed();
-        assertThat(compilation).hadErrorContaining("it doesn't implement ExtensionPoint")
+        assertThat(compilation).hadErrorContaining("it doesn't implement any interface")
             .inFile(WhazzupGreeting_NoExtensionPoint)
             .onLine(5)
             .atColumn(8);