You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by wf...@apache.org on 2016/01/02 00:12:41 UTC
aurora git commit: Simplify thrift service metadata.
Repository: aurora
Updated Branches:
refs/heads/master aac7aad37 -> 4a9f2ff5f
Simplify thrift service metadata.
This leverages java.lang.reflect.Parameter.getName as enabled by turning
on emission of parameter names in the debug info for aurora classfiles.
Reviewed at https://reviews.apache.org/r/41834/
Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/4a9f2ff5
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/4a9f2ff5
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/4a9f2ff5
Branch: refs/heads/master
Commit: 4a9f2ff5f2150c8f6bba4a51f06c707b471a8ad1
Parents: aac7aad
Author: John Sirois <jo...@gmail.com>
Authored: Fri Jan 1 15:12:35 2016 -0800
Committer: Bill Farner <wf...@apache.org>
Committed: Fri Jan 1 15:12:35 2016 -0800
----------------------------------------------------------------------
build.gradle | 9 +++++
.../org/apache/aurora/build/ThriftPlugin.groovy | 2 +
.../aurora/scheduler/http/api/ApiBeta.java | 26 ++++++-------
.../aurora/tools/java/thrift_wrapper_codegen.py | 40 +++++---------------
4 files changed, 33 insertions(+), 44 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aurora/blob/4a9f2ff5/build.gradle
----------------------------------------------------------------------
diff --git a/build.gradle b/build.gradle
index 5ff10d9..6f89958 100644
--- a/build.gradle
+++ b/build.gradle
@@ -272,6 +272,8 @@ compileJava {
options.compilerArgs << '-Xlint:-processing'
// Don't fail for serialVersionUID warnings.
options.compilerArgs << '-Xlint:-serial'
+ // Capture method parameter names in classfiles.
+ options.compilerArgs << '-parameters'
}
task enforceVersion {
@@ -479,6 +481,8 @@ idea {
ipr {
withXml {
def projectNode = it.asNode()
+
+ // Configure an annotation processor profile.
def compilerConfiguration = projectNode.find {
it.name() == 'component' && it.@name == 'CompilerConfiguration'
}
@@ -501,6 +505,11 @@ idea {
it.name() == 'component' && it.@name == 'ProjectRootManager'
}
projectRoot.remove(projectRoot.output)
+
+ // Add parameter names to generated class file debug info.
+ projectNode
+ .appendNode('component', [name: 'JavacSettings'])
+ .appendNode('option', [name: 'ADDITIONAL_OPTIONS_STRING', value: '-parameters'])
}
}
}
http://git-wip-us.apache.org/repos/asf/aurora/blob/4a9f2ff5/buildSrc/src/main/groovy/org/apache/aurora/build/ThriftPlugin.groovy
----------------------------------------------------------------------
diff --git a/buildSrc/src/main/groovy/org/apache/aurora/build/ThriftPlugin.groovy b/buildSrc/src/main/groovy/org/apache/aurora/build/ThriftPlugin.groovy
index 44cb723..fc2bc90 100644
--- a/buildSrc/src/main/groovy/org/apache/aurora/build/ThriftPlugin.groovy
+++ b/buildSrc/src/main/groovy/org/apache/aurora/build/ThriftPlugin.groovy
@@ -72,6 +72,8 @@ class ThriftPlugin implements Plugin<Project> {
classpath = configurations.thriftCompile
destinationDir = file(thrift.genClassesDir)
options.warnings = false
+ // Capture method parameter names in classfiles.
+ options.compilerArgs << '-parameters'
}
configurations.create('thriftRuntime')
http://git-wip-us.apache.org/repos/asf/aurora/blob/4a9f2ff5/src/main/java/org/apache/aurora/scheduler/http/api/ApiBeta.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/http/api/ApiBeta.java b/src/main/java/org/apache/aurora/scheduler/http/api/ApiBeta.java
index b889f93..9a18c69 100644
--- a/src/main/java/org/apache/aurora/scheduler/http/api/ApiBeta.java
+++ b/src/main/java/org/apache/aurora/scheduler/http/api/ApiBeta.java
@@ -16,11 +16,10 @@ package org.apache.aurora.scheduler.http.api;
import java.io.OutputStreamWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.lang.reflect.Type;
+import java.lang.reflect.Parameter;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.List;
-import java.util.Map;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -89,30 +88,29 @@ public class ApiBeta {
* will be substituted.
*
* @param json Incoming request data, to translate into method parameters.
- * @param fields Field metadata map. Map <strong>iteration order must match</strong> the order
- * defined in the thrift method.
+ * @param method The thrift method to bind parameters for.
* @return Parsed method parameters.
* @throws WebApplicationException If a parameter could not be parsed.
*/
- private Object[] readParams(JsonObject json, Map<String, Type> fields)
+ private Object[] readParams(JsonObject json, Method method)
throws WebApplicationException {
List<Object> params = Lists.newArrayList();
- for (Map.Entry<String, Type> entry : fields.entrySet()) {
+ for (Parameter param : method.getParameters()) {
try {
- params.add(GSON.fromJson(getJsonMember(json, entry.getKey()), entry.getValue()));
+ params.add(GSON.fromJson(getJsonMember(json, param.getName()), param.getType()));
} catch (JsonParseException e) {
throw new WebApplicationException(
e,
- badRequest("Failed to parse parameter " + entry.getKey() + ": " + e.getMessage()));
+ badRequest("Failed to parse parameter " + param + ": " + e.getMessage()));
}
}
return params.toArray();
}
- private Method getApiMethod(String name, Map<String, Type> metadata) {
+ private Method getApiMethod(String name, Class<?>[] parameterTypes) {
try {
- return Iface.class.getMethod(name, metadata.values().toArray(new Class<?>[0]));
+ return Iface.class.getMethod(name, parameterTypes);
} catch (NoSuchMethodException e) {
throw Throwables.propagate(e);
}
@@ -127,8 +125,8 @@ public class ApiBeta {
}
// First, verify that this is a valid method on the interface.
- Map<String, Type> methodMetadata = AuroraAdminMetadata.METHODS.get(methodName);
- if (methodMetadata == null) {
+ Class<?>[] methodParameterTypes = AuroraAdminMetadata.METHODS.get(methodName);
+ if (methodParameterTypes == null) {
return errorResponse(Status.NOT_FOUND, "Method " + methodName + " does not exist.");
}
@@ -146,8 +144,8 @@ public class ApiBeta {
throw new WebApplicationException(e, badRequest("Request must be valid JSON"));
}
- final Method method = getApiMethod(methodName, methodMetadata);
- final Object[] params = readParams(parameters, methodMetadata);
+ final Method method = getApiMethod(methodName, methodParameterTypes);
+ final Object[] params = readParams(parameters, method);
return Response.ok((StreamingOutput) output -> {
try {
Object response = method.invoke(api, params);
http://git-wip-us.apache.org/repos/asf/aurora/blob/4a9f2ff5/src/main/python/apache/aurora/tools/java/thrift_wrapper_codegen.py
----------------------------------------------------------------------
diff --git a/src/main/python/apache/aurora/tools/java/thrift_wrapper_codegen.py b/src/main/python/apache/aurora/tools/java/thrift_wrapper_codegen.py
index 49cfa9f..e9e9368 100644
--- a/src/main/python/apache/aurora/tools/java/thrift_wrapper_codegen.py
+++ b/src/main/python/apache/aurora/tools/java/thrift_wrapper_codegen.py
@@ -336,7 +336,7 @@ class Method(object):
self.return_type = return_type
def __str__(self):
- return '%s(%s)' % (self.name, ', '.join(map(str, self.parameters)))
+ return '%s(%s)' % (self.name, ', '.join(self.parameters))
class Parameter(object):
def __init__(self, name, type_name):
@@ -353,31 +353,26 @@ class GenericParameter(Parameter):
GET_SUPER_METHODS = '.putAll(%(super)sMetadata.METHODS)'
-PARAM_METADATA_TEMPLATE = '.put("%(name)s", %(type)s.class)'
-
-GENERIC_PARAM_METADATA_TEMPLATE = (
- '.put("%(name)s", new TypeToken<%(type)s<%(params)s>>() {}.getType())')
+PARAM_METADATA_TEMPLATE = '%(type)s.class,'
METHOD_METADATA_TEMPLATE = '''.put(
"%(name)s",
- ImmutableMap.<String, Type>builder()%(params)s
- .build())'''
+ new Class<?>[] {%(params)s
+ })'''
SERVICE_METADATA_TEMPLATE = '''package %(package)s;
-import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.common.collect.ImmutableMap;
-import com.google.gson.reflect.TypeToken;
import org.apache.aurora.gen.*;
public final class %(name)sMetadata {
- public static final Map<String, Map<String, Type>> METHODS =
- ImmutableMap.<String, Map<String, Type>>builder()
+ public static final ImmutableMap<String, Class<?>[]> METHODS =
+ ImmutableMap.<String, Class<?>[]>builder()
%(methods)s
.build();
@@ -391,7 +386,7 @@ SERVICE_RE = 'service (?P<name>\w+)\s+(extends\s+(?P<super>\w+)\s+)?{(?P<body>[^
METHOD_RE = '\s*(?P<return>\w+)\s+(?P<name>\w+)\((?P<params>[^\)]*)\)'
-PARAM_RE = '\d+\:\s+%s\s+(?P<name>\w+)' % TYPE_PATTERN
+PARAM_RE = '\d+\:\s+%s\s+(?:\w+)' % TYPE_PATTERN
THRIFT_TYPES = {
'bool': PrimitiveType('boolean', 'Boolean'),
@@ -464,13 +459,7 @@ def parse_services(service_defs):
for method in re.finditer(METHOD_RE, s.group('body'), flags=re.MULTILINE):
params = []
for param in re.finditer(PARAM_RE, method.group('params'), flags=re.MULTILINE):
- if param.group('params'):
- params.append(GenericParameter(
- param.group('name'),
- param.group('type'),
- param.group('params').replace(' ', '').split(',')))
- else:
- params.append(Parameter(param.group('name'), param.group('type')))
+ params.append(param.group('type'))
methods.append(Method(method.group('name'),
params,
method.group('return')))
@@ -695,21 +684,12 @@ if __name__ == '__main__':
if isinstance(thrift_type, PrimitiveType):
return thrift_type.boxed_name
else:
- return name
+ return thrift_type.name
return name
def add_param(param):
- if param.type_name in THRIFT_TYPES:
- thrift_type = THRIFT_TYPES[param.type_name]
- if not isinstance(thrift_type, PrimitiveType):
- return GENERIC_PARAM_METADATA_TEMPLATE % {
- 'name': param.name,
- 'type': thrift_type.name,
- 'params': ', '.join(map(get_type_name, param.parameters))
- }
return PARAM_METADATA_TEMPLATE % {
- 'name': param.name,
- 'type': get_type_name(param.type_name)
+ 'type': get_type_name(param)
}
def add_method(method):