Author: lquack
Date: Wed Sep 28 15:25:23 2016
New Revision: 1762681
URL: http://svn.apache.org/viewvc?rev=1762681&view=rev
Log:
QPID-7438: [Java Broker] Add changesConfiguredObjectState parameter to
ManagedOperations to have it automatically execute on the config Thread
Modified:
qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedOperation.java
Modified:
qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java?rev=1762681&r1=1762680&r2=1762681&view=diff
==============================================================================
---
qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java
(original)
+++
qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/ConfiguredObjectFactoryGenerator.java
Wed Sep 28 15:25:23 2016
@@ -23,8 +23,10 @@ package org.apache.qpid.server.model;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
+import java.io.StringWriter;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
@@ -39,6 +41,7 @@ import javax.lang.model.element.Executab
import javax.lang.model.element.PackageElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
+import javax.lang.model.type.PrimitiveType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic;
@@ -119,7 +122,12 @@ public class ConfiguredObjectFactoryGene
pw.println("import static
org.apache.qpid.server.security.access.Operation.METHOD;");
pw.println();
pw.println("import java.util.Map;");
+ pw.println("import java.util.concurrent.ExecutionException;");
pw.println();
+ pw.println("import com.google.common.util.concurrent.Futures;");
+ pw.println("import
com.google.common.util.concurrent.ListenableFuture;");
+ pw.println();
+ pw.println("import
org.apache.qpid.server.configuration.updater.Task;");
pw.println("import
org.apache.qpid.server.util.FixedKeyMapCreator;");
pw.println();
pw.println("final class " + childClassSimpleName + " extends "+
objectSimpleName);
@@ -159,7 +167,7 @@ public class ConfiguredObjectFactoryGene
pw.println(" }");
pw.println();
- generateAccessCheckedMethods(classElement, pw, new
HashSet<TypeElement>(), new HashSet<String>());
+ generateAccessCheckedMethods(childClassSimpleName, classElement,
pw, new HashSet<TypeElement>(), new HashSet<String>());
pw.println("}");
@@ -176,7 +184,8 @@ public class ConfiguredObjectFactoryGene
}
- private void generateAccessCheckedMethods(final TypeElement typeElement,
+ private void generateAccessCheckedMethods(final String className,
+ final TypeElement typeElement,
final PrintWriter pw,
final HashSet<TypeElement>
processedClasses,
final HashSet<String>
processedMethods) throws ClassNotFoundException
@@ -186,7 +195,7 @@ public class ConfiguredObjectFactoryGene
Element superClassElement =
processingEnv.getTypeUtils().asElement(typeElement.getSuperclass());
if(superClassElement instanceof TypeElement)
{
- generateAccessCheckedMethods((TypeElement) superClassElement,
pw, processedClasses, processedMethods);
+ generateAccessCheckedMethods(className, (TypeElement)
superClassElement, pw, processedClasses, processedMethods);
}
for(TypeMirror ifMirror : typeElement.getInterfaces())
@@ -194,7 +203,7 @@ public class ConfiguredObjectFactoryGene
Element ifElement =
processingEnv.getTypeUtils().asElement(ifMirror);
if(ifElement instanceof TypeElement)
{
- generateAccessCheckedMethods((TypeElement) ifElement, pw,
processedClasses, processedMethods);
+ generateAccessCheckedMethods(className, (TypeElement)
ifElement, pw, processedClasses, processedMethods);
}
}
@@ -206,7 +215,7 @@ public class ConfiguredObjectFactoryGene
{
if(annotationMirror.getAnnotationType().toString().equals("org.apache.qpid.server.model.ManagedOperation"))
{
- processManagedOperation(pw, (ExecutableElement)
element);
+ processManagedOperation(pw, className,
(ExecutableElement) element, annotationMirror);
break;
}
}
@@ -216,7 +225,7 @@ public class ConfiguredObjectFactoryGene
}
- private void processManagedOperation(final PrintWriter pw, final
ExecutableElement methodElement)
+ private void processManagedOperation(final PrintWriter pw, final String
className, final ExecutableElement methodElement, final AnnotationMirror
annotationMirror)
{
if(!methodElement.getParameters().isEmpty())
@@ -264,39 +273,129 @@ public class ConfiguredObjectFactoryGene
pw.print(" authorise(METHOD(\"");
pw.print(methodElement.getSimpleName().toString());
pw.print("\")");
+ final String parameterList = getParameterList(methodElement);
+
if(!methodElement.getParameters().isEmpty())
{
pw.print(", ");
pw.print(methodElement.getSimpleName().toString().replaceAll("([A-Z])",
"_$1").toUpperCase() + "_MAP_CREATOR");
- pw.print(".createMap(");
- first = true;
- for(VariableElement param : methodElement.getParameters())
+ pw.print(".createMap" + parameterList);
+ }
+ pw.println(");");
+ pw.println();
+
+ final Map<? extends ExecutableElement, ? extends AnnotationValue>
elementValues =
+
processingEnv.getElementUtils().getElementValuesWithDefaults(annotationMirror);
+ for (ExecutableElement executableElement : elementValues.keySet())
+ {
+ if
("changesConfiguredObjectState".contentEquals(executableElement.getSimpleName()))
{
- if(first)
+ final String callToSuper = "super." +
methodElement.getSimpleName().toString() + parameterList;
+
+ pw.print(" ");
+ if (methodElement.getReturnType().getKind() != TypeKind.VOID)
{
- first = false;
+ pw.print("return ");
+ }
+ if ((Boolean) elementValues.get(executableElement).getValue())
+ {
+ pw.println(wrapByDoOnConfigThread(callToSuper, className,
methodElement));
}
else
{
- pw.print(", ");
+ pw.println(callToSuper + ";");
}
- pw.print(getParamName(param));
- }
- pw.print(")");
+ break;
+ }
}
- pw.println(");");
+
+ pw.println(" }");
pw.println();
+ }
+
+ private String wrapByDoOnConfigThread(final String callToWrap,
+ final String className,
+ final ExecutableElement
methodElement)
+ {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter pw = new PrintWriter(stringWriter);
+ String boxedReturnTypeName = getBoxedReturnTypeAsString(methodElement);
+ pw.println("doSync(doOnConfigThread(new Task<ListenableFuture<"
+ + boxedReturnTypeName
+ + ">, RuntimeException>()");
+ pw.println(" {");
+ pw.println(" @Override");
+ pw.println(" public ListenableFuture<"
+ + boxedReturnTypeName
+ + "> execute()");
+ pw.println(" {");
+ if (methodElement.getReturnType().getKind() != TypeKind.VOID)
+ {
+ pw.println(" return Futures.<"
+ + boxedReturnTypeName
+ + ">immediateFuture("
+ + className
+ + "."
+ + callToWrap
+ + ");");
+ }
+ else
+ {
+ pw.println(" " + className + "." + callToWrap +
";");
+ pw.println(" return Futures.<"
+ + boxedReturnTypeName
+ + ">immediateFuture(null);");
+ }
+ pw.println(" }");
+
+ pw.println(" @Override");
+ pw.println(" public String getObject()");
+ pw.println(" {");
+ pw.println(" return " + className +
".this.toString();");
+ pw.println(" }");
+
+ pw.println(" @Override");
+ pw.println(" public String getAction()");
+ pw.println(" {");
+ pw.println(" return \"" +
methodElement.getSimpleName() + "\";");
+ pw.println(" }");
+
+ pw.println(" @Override");
+ pw.println(" public String getArguments()");
+ pw.println(" {");
+ pw.println(" return null;");
+ pw.println(" }");
+
+ pw.println(" }));");
+ return stringWriter.toString();
+ }
- pw.print(" ");
- if(methodElement.getReturnType().getKind() != TypeKind.VOID)
+ private String getBoxedReturnTypeAsString(final ExecutableElement
methodElement)
+ {
+ TypeMirror returnType = methodElement.getReturnType();
+ String returnTypeName;
+ if (returnType.getKind().isPrimitive())
{
- pw.print("return ");
+ TypeElement returnTypeElement =
+ processingEnv.getTypeUtils().boxedClass((PrimitiveType)
returnType);
+ returnTypeName = returnTypeElement.asType().toString();
}
- pw.print("super.");
- pw.print(methodElement.getSimpleName().toString());
- pw.print("(");
- first = true;
+ else if (returnType.getKind() == TypeKind.VOID)
+ {
+ returnTypeName = "Void";
+ }
+ else
+ {
+ returnTypeName = methodElement.getReturnType().toString();
+ }
+ return returnTypeName;
+ }
+
+ private String getParameterList(final ExecutableElement methodElement)
+ {
+ StringBuilder parametersStringBuilder = new StringBuilder("(");
+ boolean first = true;
for(VariableElement param : methodElement.getParameters())
{
if(first)
@@ -305,13 +404,12 @@ public class ConfiguredObjectFactoryGene
}
else
{
- pw.print(", ");
+ parametersStringBuilder.append(", ");
}
- pw.print(getParamName(param));
+ parametersStringBuilder.append(getParamName(param));
}
- pw.println(");");
- pw.println(" }");
- pw.println();
+ parametersStringBuilder.append(")");
+ return parametersStringBuilder.toString();
}
private String getParamName(final VariableElement param)
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedOperation.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedOperation.java?rev=1762681&r1=1762680&r2=1762681&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedOperation.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ManagedOperation.java
Wed Sep 28 15:25:23 2016
@@ -33,5 +33,5 @@ public @interface ManagedOperation
boolean nonModifying() default false;
boolean secure() default false;
String paramRequiringSecure() default "";
-
+ boolean changesConfiguredObjectState() default true;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]