diff options
author | Decebal Suiu <decebal.suiu@gmail.com> | 2016-01-14 14:44:54 +0200 |
---|---|---|
committer | Decebal Suiu <decebal.suiu@gmail.com> | 2016-01-14 14:44:54 +0200 |
commit | 494d0fed21a0b939ee61058fdee621f794aea2b8 (patch) | |
tree | e137be936a62e5dc70cbdb4123341139cbb182c8 /pf4j | |
parent | 1ad769d536b087d3275c9485a88737caf811f921 (diff) | |
download | pf4j-494d0fed21a0b939ee61058fdee621f794aea2b8.tar.gz pf4j-494d0fed21a0b939ee61058fdee621f794aea2b8.zip |
Plugable ExtensionStorage in ExtensionAnnotationProcessor (via processor options and system properties)
Diffstat (limited to 'pf4j')
-rw-r--r-- | pf4j/src/main/java/ro/fortsoft/pf4j/processor/ExtensionAnnotationProcessor.java | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/processor/ExtensionAnnotationProcessor.java b/pf4j/src/main/java/ro/fortsoft/pf4j/processor/ExtensionAnnotationProcessor.java index 881c05f..c749956 100644 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/processor/ExtensionAnnotationProcessor.java +++ b/pf4j/src/main/java/ro/fortsoft/pf4j/processor/ExtensionAnnotationProcessor.java @@ -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; + } + +} |