diff options
| author | Robert Godfrey <rgodfrey@apache.org> | 2014-08-18 00:32:44 +0000 |
|---|---|---|
| committer | Robert Godfrey <rgodfrey@apache.org> | 2014-08-18 00:32:44 +0000 |
| commit | f3e1ac2fd1570ed71293fa68673e6e8161aad8de (patch) | |
| tree | 64397986acb6ab5b2e2ad56a0b5fbf458469727a /qpid/java/broker-codegen | |
| parent | 01a5bda09ed63b7520959fc28bcd53ce6fb6eb9f (diff) | |
| download | qpid-python-f3e1ac2fd1570ed71293fa68673e6e8161aad8de.tar.gz | |
QPID-6011 : [Java Broker] provide a mechanism for disabling plugins and implementation types
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1618531 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/broker-codegen')
| -rw-r--r-- | qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java | 104 |
1 files changed, 101 insertions, 3 deletions
diff --git a/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java b/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java index 67ae9fbce5..3c6cb4270e 100644 --- a/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java +++ b/qpid/java/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectRegistrationGenerator.java @@ -26,16 +26,21 @@ import java.io.PrintWriter; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.SourceVersion; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Elements; import javax.tools.Diagnostic; import javax.tools.JavaFileObject; @@ -49,6 +54,9 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor private Map<String, Set<String>> _managedObjectClasses = new HashMap<>(); + private Map<String, String> _typeMap = new HashMap<>(); + private Map<String, String> _categoryMap = new HashMap<>(); + @Override public SourceVersion getSupportedSourceVersion() { @@ -78,14 +86,31 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor { PackageElement packageElement = elementUtils.getPackageOf(e); String packageName = packageElement.getQualifiedName().toString(); - + String className = e.getSimpleName().toString(); + for(AnnotationMirror a : e.getAnnotationMirrors()) + { + if(a.getAnnotationType().asElement().equals(annotationElement)) + { + for(Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : a.getElementValues().entrySet()) + { + if(entry.getKey().getSimpleName().toString().equals("type")) + { + _typeMap.put(packageName + "." + className, (String) entry.getValue().getValue()); + processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "looking for " + packageName + "." + className); + _categoryMap.put(packageName + "." + className, getCategory((TypeElement)e)); + break; + } + } + break; + } + } Set<String> classNames = _managedObjectClasses.get(packageName); if (classNames == null) { classNames = new HashSet<>(); _managedObjectClasses.put(packageName, classNames); } - classNames.add(e.getSimpleName().toString()); + classNames.add(className); } } for (Map.Entry<String, Set<String>> entry : _managedObjectClasses.entrySet()) @@ -93,6 +118,8 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor generateRegistrationFile(entry.getKey(), entry.getValue()); } _managedObjectClasses.clear(); + _typeMap.clear(); + _categoryMap.clear(); } catch (Exception e) { @@ -102,6 +129,63 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor return false; } + private String getCategory(final TypeElement e) + { + Elements elementUtils = processingEnv.getElementUtils(); + TypeElement annotationElement = elementUtils.getTypeElement(MANAGED_OBJECT_CANONICAL_NAME); + String category = null; + List<? extends AnnotationMirror> annotationMirrors = e.getAnnotationMirrors(); + if(annotationMirrors != null) + { + for (AnnotationMirror a : annotationMirrors) + { + if (a.getAnnotationType().asElement().equals(annotationElement)) + { + category = e.getSimpleName().toString().toLowerCase(); + + for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : a.getElementValues() + .entrySet()) + { + if (entry.getKey().getSimpleName().toString().equals("category")) + { + if (!Boolean.TRUE.equals(entry.getValue().getValue())) + { + category = null; + } + + break; + } + } + break; + } + } + } + + if (category == null) + { + for (TypeMirror interfaceMirror : e.getInterfaces()) + { + category = getCategory((TypeElement) processingEnv.getTypeUtils().asElement(interfaceMirror)); + if (category != null) + { + break; + } + } + } + + if (category == null && e.getSuperclass() != null) + { + TypeElement parent = (TypeElement) processingEnv.getTypeUtils().asElement(e.getSuperclass()); + if(parent != null) + { + category = getCategory(parent); + } + } + + return category; + + } + private void generateRegistrationFile(final String packageName, final Set<String> classNames) { final String className = "ConfiguredObjectRegistrationImpl"; @@ -144,7 +228,21 @@ public class ConfiguredObjectRegistrationGenerator extends AbstractProcessor pw.println(" Set<Class<? extends ConfiguredObject>> implementations = new HashSet<>();"); for(String implementationName : classNames) { - pw.println(" implementations.add("+implementationName+".class);"); + String qualifiedImplementationName = packageName + "." + implementationName; + if(_typeMap.get(qualifiedImplementationName) != null && _categoryMap.get(qualifiedImplementationName) != null) + { + pw.println(" if(!Boolean.getBoolean(\"qpid.type.disabled:" + +_categoryMap.get(qualifiedImplementationName) + +"."+_typeMap.get(qualifiedImplementationName)+"\"))"); + pw.println(" {"); + pw.println(" implementations.add("+implementationName+".class);"); + pw.println(" }"); + + } + else + { + pw.println(" implementations.add(" + implementationName + ".class);"); + } } pw.println(" _implementations = Collections.unmodifiableSet(implementations);"); pw.println(" }"); |
