def generate_jni_handlers(model): """ Generates msg handlers for all messages except for dumps and requests (handled by vpp, not client). :param model: meta-model of VPP API used for jVPP generation. """ jni_impl = [] for msg in model.messages: msg_name = msg.name 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 jni_impl.append(_MSG_HANDLER_TEMPLATE.substitute( c_name=msg_name, json_filename=model.json_api_files, json_definition=msg.doc, plugin_name=model.plugin_name, err_handler=_generate_error_handler(msg), class_ref_name=msg.java_name_lower, dto_name=msg.java_name_upper, dto_setters=generate_c2j_swap(msg, object_ref_name="dto", struct_ref_name="mp", is_alias=False) )) return "".join(jni_impl)
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) ))
def _generate_future_jvpp_callback_methods(model): methods = [] for msg in model.messages: 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 # Generate callbacks for all messages except for dumps and requests (handled by vpp, not client). template = None request_dto = None if is_details(msg): template = _FUTURE_JVPP_FACADE_DETAILS_CALLBACK_TEMPLATE request_dto = msg.request_java elif is_reply(msg): template = _FUTURE_JVPP_FACADE_REPLY_CALLBACK_TEMPLATE request_dto = msg.request_java elif is_event(msg): template = _FUTURE_JVPP_FACADE_EVENT_CALLBACK_TEMPLATE else: raise TypeError("Unknown message type %s", msg) methods.append(template.substitute( plugin_package=model.plugin_package, callback_dto=msg.java_name_upper, request_dto=request_dto, callback_dto_field=msg.java_name_lower, )) return "".join(methods)
def _notification_filter(msg): # Generate callbacks for all messages except for dumps and requests (handled by vpp, not client). # Also skip control ping managed by jvpp registry. return (not is_control_ping(msg)) and \ (not is_control_ping_reply(msg)) and \ (not is_dump(msg)) and \ (not is_request(msg))
def _generate_handler_registration(messages): """ Generates msg handler registration for all messages except for dumps and requests. :param messages: collection of VPP API messages. """ handlers = [] for msg in messages: 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 name = msg.name crc = msg.crc handlers.append("_(%s_%s, %s) \\" % (name, crc, name)) return _HANDLER_REGISTRATION_TEMPLATE.substitute(handlers="\n".join(handlers))
def generate_jni_impl(model): """ Generates JNI bindings for sending dump and request messages. :param model: meta-model of VPP API used for jVPP generation. """ jni_impl = [] for msg in model.messages: if is_control_ping(msg) or is_control_ping_reply(msg): # Skip control ping managed by jvpp registry. continue if not (is_dump(msg) or is_request(msg)): continue arguments = "" request_class = "" jni_identifiers = "" msg_initialization = "" if msg.has_fields: arguments = ", jobject request" request_class = _REQUEST_CLASS_TEMPLATE.substitute( plugin_name=model.plugin_name, java_dto_name=msg.java_name_upper) jni_identifiers = generate_j2c_identifiers( msg, class_ref_name="requestClass", object_ref_name="request") msg_initialization = generate_j2c_swap(msg, struct_ref_name="mp", is_alias=False) jni_impl.append( _JNI_IMPL_TEMPLATE.substitute( c_name=msg.name, json_filename=model.json_api_files, json_definition=msg.doc, plugin_name=model.plugin_name, plugin_java_name=model.plugin_java_name, java_method_name=msg.java_name_lower, arguments=arguments, request_class=request_class, jni_identifiers=jni_identifiers, msg_size=_generate_msg_size(msg), crc=msg.crc, msg_initialization=msg_initialization)) return "".join(jni_impl)
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)
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)
def _generate_future_jvpp_facade_methods(model): methods = [] for msg in model.messages: if is_control_ping(msg) or is_control_ping_reply(msg): # Skip control_ping managed by jvpp registry. continue template = None if is_request(msg): template = _FUTURE_JVPP_FACADE_REQUEST_TEMPLATE elif is_dump(msg): template = _FUTURE_JVPP_FACADE_DUMP_TEMPLATE else: continue methods.append( template.substitute(plugin_package=model.plugin_package, method_name=msg.java_name_lower, reply_name=msg.reply_java, request_name=msg.java_name_upper)) return "".join(methods)
def _generate_future_jvpp_methods(model): methods = [] for msg in model.messages: if is_control_ping(msg) or is_control_ping_reply(msg): # Skip control_ping managed by jvpp registry. continue reply_name = None if is_request(msg): reply_name = msg.reply_java elif is_dump(msg): # use reply dump wrappers reply_name = "%sReplyDump" % msg.reply_java else: continue methods.append(_FUTURE_JVPP_METHOD_TEMPLATE.substitute( plugin_package=model.plugin_package, method_name=msg.java_name_lower, reply_name=reply_name, request_name=msg.java_name_upper )) return "".join(methods)
def _generate_message_dtos(work_dir, model, logger): for msg in model.messages: logger.debug("Generating DTO for message %s", msg) class_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_request(msg): dto = _generate_request_dto(msg, model, base_type="JVppRequest") elif is_dump(msg): dto = _generate_request_dto(msg, model, base_type="JVppDump") elif is_reply(msg) or is_details(msg): dto = _generate_reply_dto(msg, model) elif is_event(msg): dto = _generate_event_dto(msg, model) else: logger.warn( "Failed to generate DTO for: %s. Message type is not supported." % msg) continue with open("%s/%s.java" % (work_dir, class_name), "w") as f: f.write(dto)
def _jvpp_impl_filter(msg): return is_request(msg) or is_dump(msg) or is_event(msg)