]> source.dussan.org Git - pf4j.git/commitdiff
Plugable ExtensionStorage in ExtensionAnnotationProcessor (via processor options...
authorDecebal Suiu <decebal.suiu@gmail.com>
Thu, 14 Jan 2016 12:44:54 +0000 (14:44 +0200)
committerDecebal Suiu <decebal.suiu@gmail.com>
Thu, 14 Jan 2016 12:44:54 +0000 (14:44 +0200)
pf4j/src/main/java/ro/fortsoft/pf4j/processor/ExtensionAnnotationProcessor.java

index 881c05fa9b8aab8b76a02cc78271b22489263598..c749956ebe5f50798a27bdae412bce3f065f1498 100644 (file)
@@ -28,6 +28,7 @@ import javax.lang.model.type.DeclaredType;
 import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
 import javax.tools.Diagnostic;
+import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -41,6 +42,8 @@ import java.util.TreeSet;
  */
 public class ExtensionAnnotationProcessor extends AbstractProcessor {
 
+    private static final String STORAGE_CLASS_NAME = "pf4j.storageClassName";
+
     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
 
@@ -50,8 +53,7 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor {
     public synchronized void init(ProcessingEnvironment processingEnv) {
         super.init(processingEnv);
 
-        storage = new LegacyExtensionStorage(this);
-//        storage = new ServiceProviderExtensionStorage(this);
+        storage = createStorage();
     }
 
     @Override
@@ -67,7 +69,15 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor {
         return annotationTypes;
        }
 
-       @Override
+    @Override
+    public Set<String> getSupportedOptions() {
+        Set<String> options = new HashSet<>();
+        options.add(STORAGE_CLASS_NAME);
+
+        return options;
+    }
+
+    @Override
        public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
                if (roundEnv.processingOver()) {
             return false;
@@ -194,5 +204,33 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor {
         return processingEnv.getElementUtils().getTypeElement(ExtensionPoint.class.getName()).asType();
     }
 
-}
+    private ExtensionStorage createStorage() {
+        ExtensionStorage storage = null;
+
+        // search in processing options
+        String storageClassName = processingEnv.getOptions().get(STORAGE_CLASS_NAME);
+        if (storageClassName == null) {
+            // search in system properties
+            storageClassName = System.getProperty(STORAGE_CLASS_NAME);
+        }
 
+        if (storageClassName != null) {
+            // use reflection to create the storage instance
+            try {
+                Class storageClass = getClass().getClassLoader().loadClass(storageClassName);
+                Constructor constructor = storageClass.getConstructor(ExtensionAnnotationProcessor.class);
+                storage = (ExtensionStorage) constructor.newInstance(this);
+            } catch (Exception e) {
+                error(e.getMessage());
+            }
+        }
+
+        if (storage == null) {
+            // default storage
+            storage = new LegacyExtensionStorage(this);
+        }
+
+        return storage;
+    }
+
+}