diff options
author | Marek Gradzki <mgradzki@cisco.com> | 2018-02-09 13:42:12 +0100 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2018-03-02 15:22:34 +0000 |
commit | a51ccb5bb56fad29f68f9acafd458fada69bd825 (patch) | |
tree | c155c143fc1289ab33d48abbe4d7fba8f88add1b /src/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py | |
parent | 371ca50a74a9c4f1b74c4c1b65c6fdec610fcfc3 (diff) |
jvpp: object model for jvpp generator (VPP-1184)
Introduces JSON parser which builds object model of Java API.
Also rewrites JNI translation of typedefs
to use per type translation functions
instead of code inlining.
Not covered:
- integrate with vappigen plugin (VPP-1154) or vapi parser (VPP-1155)
- use better templating engine (VPP-480)
- improvements of generator structure (e.g. VPP-1186)
Change-Id: I9e12d76c2f3c6ee041669f58e8a37917f656aa90
Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
Diffstat (limited to 'src/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py')
-rwxr-xr-x[-rw-r--r--] | src/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py | 115 |
1 files changed, 45 insertions, 70 deletions
diff --git a/src/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py b/src/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py index 13a415595c2..14aa8b760a5 100644..100755 --- a/src/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py +++ b/src/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py @@ -1,6 +1,6 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 # -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2016,2018 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -12,87 +12,62 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - -import os -import util +# from string import Template -callback_suffix = "Callback" +from jvpp_model import is_request, is_dump, is_control_ping, is_control_ping_reply -callback_template = Template(""" -package $plugin_package.$callback_package; + +def generate_callbacks(work_dir, model, logger): + json_api_files = model.json_api_files + logger.debug("Generating Callback interfaces for %s" % json_api_files) + plugin_package = model.plugin_package + + callbacks = [] + for msg in model.messages: + name = msg.java_name_upper + if is_control_ping(msg) or is_control_ping_reply(msg): + # Skip control_ping managed by jvpp registry. + continue + if is_dump(msg) or is_request(msg): + continue + + callbacks.append("%s.callback.%sCallback" % (plugin_package, name)) + callback = _CALLBACK_TEMPLATE.substitute( + plugin_package=plugin_package, + json_filename=json_api_files, + name=name) + + with open("%s/%sCallback.java" % (work_dir, name), "w") as f: + f.write(callback) + + plugin_name = model.plugin_java_name + with open("%s/JVpp%sGlobalCallback.java" % (work_dir, plugin_name), "w") as f: + f.write(_GLOBAL_CALLBACK_TEMPLATE.substitute( + plugin_package=plugin_package, + json_filename=json_api_files, + plugin_name=plugin_name, + callbacks=", ".join(callbacks) + )) + +_CALLBACK_TEMPLATE = Template("""package $plugin_package.callback; /** - * <p>Represents callback for plugin's api file message. - * <br>It was generated by callback_gen.py based on $inputfile preparsed data: - * <pre> -$docs - * </pre> + * <p>Represents callback for plugin's api message. + * <br>It was generated by jvpp_callback_gen.py based on $json_filename. */ -public interface $cls_name extends $base_package.$callback_package.$callback_type { - - $callback_method +public interface ${name}Callback extends io.fd.vpp.jvpp.callback.JVppCallback { + void on${name}(${plugin_package}.dto.${name} reply); } """) -global_callback_template = Template(""" -package $plugin_package.$callback_package; +_GLOBAL_CALLBACK_TEMPLATE = Template("""package $plugin_package.callback; /** * <p>Global aggregated callback interface. - * <br>It was generated by callback_gen.py based on $inputfile - * <br>(python representation of api file generated by vppapigen). + * <br>It was generated by jvpp_callback_gen.py based on $json_filename. */ -public interface JVpp${plugin_name}GlobalCallback extends $base_package.$callback_package.ControlPingCallback, $callbacks { +public interface JVpp${plugin_name}GlobalCallback extends io.fd.vpp.jvpp.callback.ControlPingCallback, $callbacks { } """) - - -def generate_callbacks(func_list, base_package, plugin_package, plugin_name, callback_package, dto_package, inputfile, - logger): - """ Generates callback interfaces """ - logger.debug("Generating Callback interfaces for %s" % inputfile) - - if not os.path.exists(callback_package): - os.mkdir(callback_package) - - callbacks = [] - for func in func_list: - camel_case_name_with_suffix = util.underscore_to_camelcase_upper(func['name']) - - if util.is_control_ping(camel_case_name_with_suffix): - # Skip control_ping managed by jvpp registry. - continue - if util.is_dump(func['name']) or util.is_request(func['name'], func_list): - continue - - # Generate callbacks for all messages except for dumps and requests (handled by vpp, not client). - callback_type = "JVppCallback" - callbacks.append("{0}.{1}.{2}".format(plugin_package, callback_package, camel_case_name_with_suffix + callback_suffix)) - callback_path = os.path.join(callback_package, camel_case_name_with_suffix + callback_suffix + ".java") - callback_file = open(callback_path, 'w') - - reply_type = "%s.%s.%s" % (plugin_package, dto_package, camel_case_name_with_suffix) - method = "void on{0}({1} reply);".format(camel_case_name_with_suffix, reply_type) - callback_file.write( - callback_template.substitute(inputfile=inputfile, - docs=util.api_message_to_javadoc(func), - cls_name=camel_case_name_with_suffix + callback_suffix, - callback_method=method, - base_package=base_package, - plugin_package=plugin_package, - callback_package=callback_package, - callback_type=callback_type)) - callback_file.flush() - callback_file.close() - - callback_file = open(os.path.join(callback_package, "JVpp%sGlobalCallback.java" % plugin_name), 'w') - callback_file.write(global_callback_template.substitute(inputfile=inputfile, - callbacks=", ".join(callbacks), - base_package=base_package, - plugin_package=plugin_package, - plugin_name=plugin_name, - callback_package=callback_package)) - callback_file.flush() - callback_file.close() |