예제 #1
0
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)
예제 #2
0
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)
        ))
예제 #3
0
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)
예제 #4
0
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))
예제 #5
0
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))
예제 #6
0
파일: jni_impl_gen.py 프로젝트: pan2za/jvpp
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)
예제 #7
0
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)
예제 #8
0
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)
예제 #9
0
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)
예제 #10
0
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)
예제 #11
0
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)
예제 #12
0
def _jvpp_impl_filter(msg):
    return is_request(msg) or is_dump(msg) or is_event(msg)