summaryrefslogtreecommitdiff
path: root/qpid/java/broker-codegen
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2014-08-18 00:32:44 +0000
committerRobert Godfrey <rgodfrey@apache.org>2014-08-18 00:32:44 +0000
commitf3e1ac2fd1570ed71293fa68673e6e8161aad8de (patch)
tree64397986acb6ab5b2e2ad56a0b5fbf458469727a /qpid/java/broker-codegen
parent01a5bda09ed63b7520959fc28bcd53ce6fb6eb9f (diff)
downloadqpid-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.java104
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(" }");