diff options
Diffstat (limited to 'src/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py')
-rw-r--r-- | src/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py | 345 |
1 files changed, 151 insertions, 194 deletions
diff --git a/src/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py b/src/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py index c378721c000..c5634de2e48 100644 --- a/src/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py +++ b/src/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_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,21 +12,36 @@ # 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, util from string import Template -import callback_gen +from jvpp_model import is_control_ping, is_dump, is_request, is_event, is_control_ping_reply + + +def generate_callback_facade(work_dir, model, logger): + """ Generates callback facade """ + logger.debug("Generating JVpp callback facade for %s" % model.json_api_files) + _generate_ifc(work_dir, model), + _generate_impl(work_dir, model) + _generate_callback(work_dir, model) + + +def _generate_ifc(work_dir, model): + with open("%s/CallbackJVpp%s.java" % (work_dir, model.plugin_java_name), "w") as f: + f.write(_IFC_TEMPLATE.substitute( + plugin_package=model.plugin_package, + json_filename=model.json_api_files, + plugin_name=model.plugin_java_name, + methods=_generate_ifc_methods(model) + )) -jvpp_ifc_template = Template(""" -package $plugin_package.$callback_facade_package; +_IFC_TEMPLATE = Template(""" +package $plugin_package.callfacade; /** * <p>Callback Java API representation of $plugin_package plugin. - * <br>It was generated by jvpp_callback_facade_gen.py based on $inputfile - * <br>(python representation of api file generated by vppapigen). + * <br>It was generated by jvpp_callback_facade_gen.py based on $json_filename. */ -public interface CallbackJVpp${plugin_name} extends $base_package.$notification_package.EventRegistryProvider, java.lang.AutoCloseable { +public interface CallbackJVpp${plugin_name} extends io.fd.vpp.jvpp.notification.EventRegistryProvider, java.lang.AutoCloseable { // TODO add send @@ -34,29 +49,66 @@ $methods } """) -jvpp_impl_template = Template(""" -package $plugin_package.$callback_facade_package; + +def _generate_ifc_methods(model): + plugin_package = model.plugin_package + methods = [] + for msg in model.messages: + if is_control_ping(msg): + # Skip control ping managed by jvpp registry. + continue + if not (is_dump(msg) or is_request(msg)): + # Skip replies and messages that do not not have replies (e.g events/counters). + continue + template = _IFC_NO_ARG_METHOD_TEMPLATE + if msg.has_fields: + template = _IFC_METHOD_TEMPLATE + methods.append(template.substitute( + name=msg.java_name_lower, + plugin_package=plugin_package, + request=msg.java_name_upper, + reply=msg.reply_java + )) + return "\n".join(methods) + +_IFC_NO_ARG_METHOD_TEMPLATE = Template( + """ void $name($plugin_package.callback.${reply}Callback callback) throws io.fd.vpp.jvpp.VppInvocationException;""") + +_IFC_METHOD_TEMPLATE = Template( + """ void $name($plugin_package.dto.$request request, $plugin_package.callback.${reply}Callback callback) throws io.fd.vpp.jvpp.VppInvocationException;""") + + +def _generate_impl(work_dir, model): + with open("%s/CallbackJVpp%sFacade.java" % (work_dir, model.plugin_java_name), "w") as f: + f.write(_IMPL_TEMPLATE.substitute( + plugin_package=model.plugin_package, + json_filename=model.json_api_files, + plugin_name=model.plugin_java_name, + methods=_generate_impl_methods(model) + )) + +_IMPL_TEMPLATE = Template(""" +package $plugin_package.callfacade; /** * <p>Default implementation of Callback${plugin_name}JVpp interface. - * <br>It was generated by jvpp_callback_facade_gen.py based on $inputfile - * <br>(python representation of api file generated by vppapigen). + * <br>It was generated by jvpp_callback_facade_gen.py based on $json_filename. */ public final class CallbackJVpp${plugin_name}Facade implements CallbackJVpp${plugin_name} { private final $plugin_package.JVpp${plugin_name} jvpp; - private final java.util.Map<Integer, $base_package.$callback_package.JVppCallback> callbacks; - private final $plugin_package.$notification_package.${plugin_name}EventRegistryImpl eventRegistry = new $plugin_package.$notification_package.${plugin_name}EventRegistryImpl(); + private final java.util.Map<Integer, io.fd.vpp.jvpp.callback.JVppCallback> callbacks; + private final $plugin_package.notification.${plugin_name}EventRegistryImpl eventRegistry = new $plugin_package.notification.${plugin_name}EventRegistryImpl(); /** * <p>Create CallbackJVpp${plugin_name}Facade object for provided JVpp instance. * Constructor internally creates CallbackJVppFacadeCallback class for processing callbacks * and then connects to provided JVpp instance * - * @param jvpp provided $base_package.JVpp instance + * @param jvpp provided io.fd.vpp.jvpp.JVpp instance * * @throws java.io.IOException in case instance cannot connect to JVPP */ - public CallbackJVpp${plugin_name}Facade(final $base_package.JVppRegistry registry, final $plugin_package.JVpp${plugin_name} jvpp) throws java.io.IOException { + public CallbackJVpp${plugin_name}Facade(final io.fd.vpp.jvpp.JVppRegistry registry, final $plugin_package.JVpp${plugin_name} jvpp) throws java.io.IOException { this.jvpp = java.util.Objects.requireNonNull(jvpp,"jvpp is null"); this.callbacks = new java.util.HashMap<>(); java.util.Objects.requireNonNull(registry, "JVppRegistry should not be null"); @@ -64,7 +116,7 @@ public final class CallbackJVpp${plugin_name}Facade implements CallbackJVpp${plu } @Override - public $plugin_package.$notification_package.${plugin_name}EventRegistry getEventRegistry() { + public $plugin_package.notification.${plugin_name}EventRegistry getEventRegistry() { return eventRegistry; } @@ -79,139 +131,76 @@ $methods } """) -method_template = Template( - """ void $name($plugin_package.$dto_package.$request request, $plugin_package.$callback_package.$callback callback) throws $base_package.VppInvocationException;""") -method_impl_template = Template(""" public final void $name($plugin_package.$dto_package.$request request, $plugin_package.$callback_package.$callback callback) throws $base_package.VppInvocationException { +def _generate_impl_methods(model): + plugin_package = model.plugin_package + methods = [] + for msg in model.messages: + if is_control_ping(msg): + # Skip control ping managed by jvpp registry. + continue + if not (is_dump(msg) or is_request(msg)): + # Skip replies and messages that do not not have replies (e.g events/counters). + continue + template = _IMPL_NO_ARG_METHOD_TEMPLATE + if msg.has_fields: + template = _IMPL_METHOD_TEMPLATE + methods.append(template.substitute( + name=msg.java_name_lower, + plugin_package=plugin_package, + request=msg.java_name_upper, + reply=msg.reply_java + )) + return "\n".join(methods) + +_IMPL_NO_ARG_METHOD_TEMPLATE = Template( + """ public final void $name($plugin_package.callback.${reply}Callback callback) throws io.fd.vpp.jvpp.VppInvocationException { synchronized (callbacks) { - callbacks.put(jvpp.$name(request), callback); + callbacks.put(jvpp.$name(), callback); } } """) -no_arg_method_template = Template(""" void $name($plugin_package.$callback_package.$callback callback) throws $base_package.VppInvocationException;""") -no_arg_method_impl_template = Template(""" public final void $name($plugin_package.$callback_package.$callback callback) throws $base_package.VppInvocationException { +_IMPL_METHOD_TEMPLATE = Template(""" public final void $name($plugin_package.dto.$request request, $plugin_package.callback.${reply}Callback callback) throws io.fd.vpp.jvpp.VppInvocationException { synchronized (callbacks) { - callbacks.put(jvpp.$name(), callback); + callbacks.put(jvpp.$name(request), callback); } } """) -def generate_jvpp(func_list, base_package, plugin_package, plugin_name, dto_package, callback_package, - notification_package, callback_facade_package, inputfile, logger): - """ Generates callback facade """ - logger.debug("Generating JVpp callback facade for %s" % inputfile) - - if os.path.exists(callback_facade_package): - util.remove_folder(callback_facade_package) - - os.mkdir(callback_facade_package) - - methods = [] - methods_impl = [] - - # Generate methods for sending messages. - for func in func_list: - camel_case_name = util.underscore_to_camelcase(func['name']) - camel_case_name_upper = util.underscore_to_camelcase_upper(func['name']) - if util.is_reply(camel_case_name) or util.is_control_ping(camel_case_name): - continue +def _generate_callback(work_dir, model): + with open("%s/CallbackJVpp%sFacadeCallback.java" % (work_dir, model.plugin_java_name), "w") as f: + f.write(_CALLBACK_TEMPLATE.substitute( + plugin_package=model.plugin_package, + json_filename=model.json_api_files, + plugin_name=model.plugin_java_name, + methods=_generate_callback_methods(model) + )) - # Strip suffix for dump calls - callback_type = get_request_name(camel_case_name_upper) - if util.is_dump(camel_case_name_upper): - callback_type += "Details" - elif util.is_request(func['name'], func_list): - callback_type += "Reply" - else: - # Skip messages that do not not have replies (e.g events/counters). - continue - callback_type += callback_gen.callback_suffix - - if len(func['args']) == 0: - methods.append(no_arg_method_template.substitute(name=camel_case_name, - base_package=base_package, - plugin_package=plugin_package, - dto_package=dto_package, - callback_package=callback_package, - callback=callback_type)) - methods_impl.append(no_arg_method_impl_template.substitute(name=camel_case_name, - base_package=base_package, - plugin_package=plugin_package, - dto_package=dto_package, - callback_package=callback_package, - callback=callback_type)) - else: - methods.append(method_template.substitute(name=camel_case_name, - request=camel_case_name_upper, - base_package=base_package, - plugin_package=plugin_package, - dto_package=dto_package, - callback_package=callback_package, - callback=callback_type)) - methods_impl.append(method_impl_template.substitute(name=camel_case_name, - request=camel_case_name_upper, - base_package=base_package, - plugin_package=plugin_package, - dto_package=dto_package, - callback_package=callback_package, - callback=callback_type)) - - join = os.path.join(callback_facade_package, "CallbackJVpp%s.java" % plugin_name) - jvpp_file = open(join, 'w') - jvpp_file.write( - jvpp_ifc_template.substitute(inputfile=inputfile, - methods="\n".join(methods), - base_package=base_package, - plugin_package=plugin_package, - plugin_name=plugin_name, - dto_package=dto_package, - notification_package=notification_package, - callback_facade_package=callback_facade_package)) - jvpp_file.flush() - jvpp_file.close() - - jvpp_file = open(os.path.join(callback_facade_package, "CallbackJVpp%sFacade.java" % plugin_name), 'w') - jvpp_file.write(jvpp_impl_template.substitute(inputfile=inputfile, - methods="\n".join(methods_impl), - base_package=base_package, - plugin_package=plugin_package, - plugin_name=plugin_name, - dto_package=dto_package, - notification_package=notification_package, - callback_package=callback_package, - callback_facade_package=callback_facade_package)) - jvpp_file.flush() - jvpp_file.close() - - generate_callback(func_list, base_package, plugin_package, plugin_name, dto_package, callback_package, notification_package, callback_facade_package, inputfile) - - -jvpp_facade_callback_template = Template(""" -package $plugin_package.$callback_facade_package; +_CALLBACK_TEMPLATE = Template(""" +package $plugin_package.callfacade; /** * <p>Implementation of JVppGlobalCallback interface for Java Callback API. - * <br>It was generated by jvpp_callback_facade_gen.py based on $inputfile - * <br>(python representation of api file generated by vppapigen). + * <br>It was generated by jvpp_callback_facade_gen.py based on $json_filename. */ -public final class CallbackJVpp${plugin_name}FacadeCallback implements $plugin_package.$callback_package.JVpp${plugin_name}GlobalCallback { +public final class CallbackJVpp${plugin_name}FacadeCallback implements $plugin_package.callback.JVpp${plugin_name}GlobalCallback { - private final java.util.Map<Integer, $base_package.$callback_package.JVppCallback> requests; - private final $plugin_package.$notification_package.Global${plugin_name}EventCallback eventCallback; + private final java.util.Map<Integer, io.fd.vpp.jvpp.callback.JVppCallback> requests; + private final $plugin_package.notification.Global${plugin_name}EventCallback eventCallback; private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(CallbackJVpp${plugin_name}FacadeCallback.class.getName()); - public CallbackJVpp${plugin_name}FacadeCallback(final java.util.Map<Integer, $base_package.$callback_package.JVppCallback> requestMap, - final $plugin_package.$notification_package.Global${plugin_name}EventCallback eventCallback) { + public CallbackJVpp${plugin_name}FacadeCallback(final java.util.Map<Integer, io.fd.vpp.jvpp.callback.JVppCallback> requestMap, + final $plugin_package.notification.Global${plugin_name}EventCallback eventCallback) { this.requests = requestMap; this.eventCallback = eventCallback; } @Override - public void onError($base_package.VppCallbackException reply) { + public void onError(io.fd.vpp.jvpp.VppCallbackException reply) { - $base_package.$callback_package.JVppCallback failedCall; + io.fd.vpp.jvpp.callback.JVppCallback failedCall; synchronized(requests) { failedCall = requests.remove(reply.getCtxId()); } @@ -228,12 +217,12 @@ public final class CallbackJVpp${plugin_name}FacadeCallback implements $plugin_p @Override @SuppressWarnings("unchecked") - public void onControlPingReply(final $base_package.$dto_package.ControlPingReply reply) { + public void onControlPingReply(final io.fd.vpp.jvpp.dto.ControlPingReply reply) { - $base_package.$callback_package.ControlPingCallback callback; + io.fd.vpp.jvpp.callback.ControlPingCallback callback; final int replyId = reply.context; synchronized(requests) { - callback = ($base_package.$callback_package.ControlPingCallback) requests.remove(replyId); + callback = (io.fd.vpp.jvpp.callback.ControlPingCallback) requests.remove(replyId); } if(callback != null) { @@ -245,88 +234,56 @@ $methods } """) -jvpp_facade_callback_method_template = Template(""" + +def _generate_callback_methods(model): + plugin_package = model.plugin_package + methods = [] + for msg in model.messages: + if is_dump(msg) or is_request(msg): + continue + if is_control_ping_reply(msg): + # Skip control ping managed by jvpp registry. + continue + + # Generate callbacks for all messages except for dumps and requests (handled by vpp, not client). + template = _CALLBACK_METHOD_TEMPLATE + if is_event(msg): + template = _CALLBACK_EVENT_METHOD_TEMPLATE + msg_name = msg.java_name_upper + methods.append(template.substitute( + message=msg_name, + callback="%sCallback" % msg_name, + plugin_package=plugin_package + )) + return "\n".join(methods) + +_CALLBACK_METHOD_TEMPLATE = Template(""" @Override @SuppressWarnings("unchecked") - public void on$callback_dto(final $plugin_package.$dto_package.$callback_dto reply) { + public void on${message}(final $plugin_package.dto.${message} reply) { - $plugin_package.$callback_package.$callback callback; + $plugin_package.callback.$callback callback; final int replyId = reply.context; if (LOG.isLoggable(java.util.logging.Level.FINE)) { - LOG.fine(String.format("Received $callback_dto event message: %s", reply)); + LOG.fine(String.format("Received ${message} event message: %s", reply)); } synchronized(requests) { - callback = ($plugin_package.$callback_package.$callback) requests.remove(replyId); + callback = ($plugin_package.callback.$callback) requests.remove(replyId); } if(callback != null) { - callback.on$callback_dto(reply); + callback.on${message}(reply); } } """) -jvpp_facade_callback_notification_method_template = Template(""" +_CALLBACK_EVENT_METHOD_TEMPLATE = Template(""" @Override @SuppressWarnings("unchecked") - public void on$callback_dto($plugin_package.$dto_package.$callback_dto notification) { + public void on${message}($plugin_package.dto.${message} notification) { if (LOG.isLoggable(java.util.logging.Level.FINE)) { - LOG.fine(String.format("Received $callback_dto event message: %s", notification)); + LOG.fine(String.format("Received ${message} event message: %s", notification)); } - eventCallback.on$callback_dto(notification); + eventCallback.on${message}(notification); } """) - - -def generate_callback(func_list, base_package, plugin_package, plugin_name, dto_package, callback_package, notification_package, callback_facade_package, inputfile): - 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). - if util.is_reply(camel_case_name_with_suffix): - request_method = camel_case_name_with_suffix - callbacks.append(jvpp_facade_callback_method_template.substitute(plugin_package=plugin_package, - dto_package=dto_package, - callback_package=callback_package, - callback=camel_case_name_with_suffix + callback_gen.callback_suffix, - callback_dto=request_method)) - else: - callbacks.append(jvpp_facade_callback_notification_method_template.substitute(plugin_package=plugin_package, - dto_package=dto_package, - callback_package=callback_package, - callback=camel_case_name_with_suffix + callback_gen.callback_suffix, - callback_dto=camel_case_name_with_suffix)) - - jvpp_file = open(os.path.join(callback_facade_package, "CallbackJVpp%sFacadeCallback.java" % plugin_name), 'w') - jvpp_file.write(jvpp_facade_callback_template.substitute(inputfile=inputfile, - base_package=base_package, - plugin_package=plugin_package, - plugin_name=plugin_name, - dto_package=dto_package, - notification_package=notification_package, - callback_package=callback_package, - methods="".join(callbacks), - callback_facade_package=callback_facade_package)) - jvpp_file.flush() - jvpp_file.close() - - -# Returns request name -def get_request_name(camel_case_dto_name): - return remove_suffix(camel_case_dto_name) - - -def remove_suffix(name): - if util.is_reply(name): - return util.remove_reply_suffix(name) - else: - if util.is_dump(name): - return util.remove_suffix(name, util.dump_suffix) - else: - return name |