Esempio n. 1
0
def generate_msg_handlers(func_list, plugin_name, inputfile):
    handlers = []
    for f in func_list:
        handler_name = f['name']
        dto_name = util.underscore_to_camelcase_upper(handler_name)
        ref_name = util.underscore_to_camelcase(handler_name)

        if is_manually_generated(handler_name,
                                 plugin_name) or util.is_ignored(handler_name):
            continue

        if not util.is_reply(dto_name) and not util.is_notification(
                handler_name):
            continue

        if util.is_notification(handler_name):
            dto_name = util.add_notification_suffix(dto_name)
            ref_name = util.add_notification_suffix(ref_name)

        dto_setters = ''
        err_handler = ''
        # dto setters
        for t in zip(f['types'], f['args'], f['lengths']):
            c_name = t[1]
            java_name = util.underscore_to_camelcase(c_name)
            field_length = t[2][0]
            is_variable_len_array = t[2][1]
            length_field_type = None
            if is_variable_len_array:
                length_field_type = f['types'][f['args'].index(field_length)]
            dto_setters += jni_gen.jni_reply_handler_for_type(
                handler_name=handler_name,
                ref_name=ref_name,
                field_type=t[0],
                c_name=t[1],
                field_reference_name=java_name,
                field_name=java_name,
                field_length=field_length,
                is_variable_len_array=is_variable_len_array,
                length_field_type=length_field_type)

            # for retval don't generate setters and generate retval check
            if util.is_retval_field(c_name):
                err_handler = callback_err_handler_template.substitute(
                    handler_name=handler_name)
                continue

        handlers.append(
            msg_handler_template.substitute(
                inputfile=inputfile,
                api_data=util.api_message_to_javadoc(f),
                handler_name=handler_name,
                plugin_name=plugin_name,
                dto_name=dto_name,
                class_ref_name=ref_name,
                dto_setters=dto_setters,
                err_handler=err_handler))

    return "\n".join(handlers)
Esempio n. 2
0
def jni_reply_handler_for_type(handler_name,
                               ref_name,
                               field_type,
                               c_name,
                               field_reference_name,
                               field_name,
                               field_length,
                               is_variable_len_array,
                               length_field_type,
                               object_name="dto"):
    """
    Generates jni code that initializes a field of java object (dto or custom type).
    To be used in reply message handlers.
    :param field_type: type of the field to be initialized (as defined in vpe.api)
    :param c_name: name of the message struct member that stores initialization value
    :param field_reference_name: name of the field reference in generated code
    :param field_name: name of the field (camelcase)
    :param field_length: integer or name of variable that stores field length
    :param object_name: name of the object to be initialized
    """

    # todo move validation to vppapigen
    if field_type.endswith('[]') and field_length == '0':
        raise Exception('Variable array \'%s\' defined in \'%s\' '
                        'should have defined length (e.g. \'%s[%s_length]\'' %
                        (c_name, handler_name, c_name, c_name))

    if is_variable_len_array:
        length_var_name = field_length
        field_length = variable_length_array_value_template.substitute(
            length_var_name=length_var_name)
        if length_field_type != 'u8':  # we need net to host conversion:
            field_length = variable_length_array_template.substitute(
                length_field_type=length_field_type, value=field_length)

    # for retval don't generate setters
    if util.is_retval_field(c_name):
        return ""

    jni_signature = util.jni_2_signature_mapping[field_type]
    jni_setter = util.jni_field_accessors[field_type]

    result = dto_field_id_template.substitute(
        field_reference_name=field_reference_name,
        field_name=field_name,
        class_ref_name=ref_name,
        jni_signature=jni_signature)

    dto_setter_template = dto_field_setter_templates[field_type]

    result += dto_setter_template.substitute(
        jni_signature=jni_signature,
        object_name=object_name,
        field_reference_name=field_reference_name,
        c_name=c_name,
        jni_setter=jni_setter,
        field_length=field_length)
    return result
Esempio n. 3
0
def generate_dto_fields(camel_case_dto_name, func):
    fields = ""
    for t in zip(func['types'], func['args']):
        # for retval don't generate dto field in Reply
        field_name = util.underscore_to_camelcase(t[1])
        if util.is_reply(camel_case_dto_name) and util.is_retval_field(field_name):
            continue
        fields += field_template.substitute(type=util.jni_2_java_type_mapping[t[0]],
                                            name=field_name)
    return fields
Esempio n. 4
0
def generate_msg_handlers(func_list, plugin_name, inputfile):
    handlers = []
    for f in func_list:
        handler_name = f['name']
        dto_name = util.underscore_to_camelcase_upper(handler_name)
        ref_name = util.underscore_to_camelcase(handler_name)

        if is_manually_generated(handler_name):
            # Skip control ping managed by jvpp registry.
            continue
        if util.is_dump(handler_name) or util.is_request(
                handler_name, func_list):
            continue

        # Generate msg handlers for all messages except for dumps and requests (handled by vpp, not client).
        dto_setters = ''
        err_handler = ''
        # dto setters
        for t in zip(f['types'], f['args'], f['lengths']):
            c_name = t[1]
            java_name = util.underscore_to_camelcase(c_name)
            field_length = t[2][0]
            is_variable_len_array = t[2][1]
            length_field_type = None
            if is_variable_len_array:
                length_field_type = f['types'][f['args'].index(field_length)]
            dto_setters += jni_gen.jni_reply_handler_for_type(
                handler_name=handler_name,
                ref_name=ref_name,
                field_type=t[0],
                c_name=t[1],
                field_reference_name=java_name,
                field_name=java_name,
                field_length=field_length,
                is_variable_len_array=is_variable_len_array,
                length_field_type=length_field_type)

            # for retval don't generate setters and generate retval check
            if util.is_retval_field(c_name):
                err_handler = callback_err_handler_template.substitute(
                    handler_name=handler_name)
                continue

        handlers.append(
            msg_handler_template.substitute(
                inputfile=inputfile,
                api_data=util.api_message_to_javadoc(f),
                handler_name=handler_name,
                plugin_name=plugin_name,
                dto_name=dto_name,
                class_ref_name=ref_name,
                dto_setters=dto_setters,
                err_handler=err_handler))

    return "\n".join(handlers)
Esempio n. 5
0
def generate_dto_tostring(camel_case_dto_name, func):
    tostring_fields = ""
    for t in zip(func['types'], func['args']):

        field_name = util.underscore_to_camelcase(t[1])
        # for retval don't generate dto field in Reply
        if util.is_retval_field(field_name):
            continue

        # handle array types
        if util.is_array(util.jni_2_java_type_mapping[t[0]]):
            tostring_fields += tostring_array_field_template.substitute(field_name=field_name)
        else:
            tostring_fields += tostring_field_template.substitute(field_name=field_name)

    return tostring_template.substitute(cls_name=camel_case_dto_name,
                                        fields_tostring=tostring_fields[:-8])
Esempio n. 6
0
def generate_dto_equals(camel_case_dto_name, func):
    equals_fields = ""
    for t in zip(func['types'], func['args']):
        field_name = util.underscore_to_camelcase(t[1])
        # for retval don't generate dto field in Reply
        if util.is_retval_field(field_name):
            continue

        # handle array types
        if util.is_array(util.jni_2_java_type_mapping[t[0]]):
            equals_fields += equals_array_field_template.substitute(field_name=field_name)
        else:
            equals_fields += equals_field_template.substitute(field_name=field_name)

    if equals_fields != "":
        equals_fields = equals_other_template.substitute(cls_name=camel_case_dto_name) + equals_fields

    return equals_template.substitute(comparisons=equals_fields)
Esempio n. 7
0
def generate_dto_hash(func):
    hash_fields = ""

    # Special handling for hashCode in case just a single array field is present. Cannot use Objects.equals since the
    # array is mistaken for a varargs parameter. Instead use Arrays.hashCode in such case.
    if len(func['args']) == 1:
        single_type = func['types'][0]
        single_type_name = func['args'][0]
        if util.is_array(util.jni_2_java_type_mapping[single_type]):
            return hash_single_array_type_template.substitute(fields=util.underscore_to_camelcase(single_type_name))

    for t in zip(func['types'], func['args']):
        field_name = util.underscore_to_camelcase(t[1])
        # for retval don't generate dto field in Reply
        if util.is_retval_field(field_name):
            continue

        hash_fields += field_name + ", "

    return hash_template.substitute(fields=hash_fields[:-2])
Esempio n. 8
0
def generate_msg_handlers(func_list, inputfile):
    handlers = []
    for f in func_list:
        handler_name = f['name']
        dto_name = util.underscore_to_camelcase_upper(handler_name)
        ref_name = util.underscore_to_camelcase(handler_name)

        if is_manually_generated(handler_name) or util.is_ignored(handler_name):
            continue

        if not util.is_reply(dto_name) and not util.is_notification(handler_name):
            continue

        if util.is_notification(handler_name):
            dto_name = util.add_notification_suffix(dto_name)
            ref_name = util.add_notification_suffix(ref_name)

        dto_setters = ''
        err_handler = ''
        # dto setters
        for t in zip(f['c_types'], f['types'], f['args'], f['lengths']):
            c_type = t[0]
            jni_type = t[1]
            c_name = t[2]
            field_length = t[3][0]

            # check if we are processing variable length array
            if t[3][1]:
                length_var_name = t[3][0]
                length_field_type = f['c_types'][f['args'].index(length_var_name)]
                field_length = variable_length_array_value_template.substitute(length_var_name=length_var_name)
                if length_field_type != 'u8':  # we need net to host conversion:
                    field_length = variable_length_array_template.substitute(
                        length_field_type=length_field_type, value=field_length)

            # for retval don't generate setters and generate retval check
            if util.is_retval_field(c_name):
                err_handler = callback_err_handler_template.substitute(
                    handler_name=handler_name
                )
                continue

            java_field_name = util.underscore_to_camelcase(c_name)
            jni_signature = util.jni_2_signature_mapping[jni_type]
            jni_setter = util.jni_field_accessors[jni_type]

            dto_setters += dto_field_id_template.substitute(
                    java_name=java_field_name,
                    class_ref_name=ref_name,
                    jni_signature=jni_signature)

            dto_setter_template = dto_field_setter_templates[c_type]

            dto_setters += dto_setter_template.substitute(
                    java_name=java_field_name,
                    jni_signature=jni_signature,
                    c_name=c_name,
                    jni_setter=jni_setter,
                    field_length=field_length)

        handlers.append(msg_handler_template.substitute(
            inputfile=inputfile,
            api_data=util.api_message_to_javadoc(f),
            handler_name=handler_name,
            dto_name=dto_name,
            class_ref_name=ref_name,
            dto_setters=dto_setters,
            err_handler=err_handler))

    return "\n".join(handlers)
Esempio n. 9
0
def generate_msg_handlers(func_list, plugin_name, inputfile):
    handlers = []
    for f in func_list:
        handler_name = f['name']
        dto_name = util.underscore_to_camelcase_upper(handler_name)
        ref_name = util.underscore_to_camelcase(handler_name)

        if is_manually_generated(handler_name,
                                 plugin_name) or util.is_ignored(handler_name):
            continue

        if not util.is_reply(dto_name) and not util.is_notification(
                handler_name):
            continue

        if util.is_notification(handler_name):
            dto_name = util.add_notification_suffix(dto_name)
            ref_name = util.add_notification_suffix(ref_name)

        dto_setters = ''
        err_handler = ''
        # dto setters
        for t in zip(f['c_types'], f['types'], f['args'], f['lengths']):
            c_type = t[0]
            jni_type = t[1]
            c_name = t[2]
            field_length = t[3][0]

            if jni_type.endswith('Array') and field_length == '0':
                raise Exception(
                    'Variable array \'%s\' defined in message \'%s\' '
                    'should have defined length (e.g. \'%s[%s_length]\'' %
                    (c_name, handler_name, c_name, c_name))

            # check if we are processing variable length array
            if t[3][1]:
                length_var_name = t[3][0]
                length_field_type = f['c_types'][f['args'].index(
                    length_var_name)]
                field_length = variable_length_array_value_template.substitute(
                    length_var_name=length_var_name)
                if length_field_type != 'u8':  # we need net to host conversion:
                    field_length = variable_length_array_template.substitute(
                        length_field_type=length_field_type,
                        value=field_length)

            # for retval don't generate setters and generate retval check
            if util.is_retval_field(c_name):
                err_handler = callback_err_handler_template.substitute(
                    handler_name=handler_name)
                continue

            java_field_name = util.underscore_to_camelcase(c_name)
            jni_signature = util.jni_2_signature_mapping[jni_type]
            jni_setter = util.jni_field_accessors[jni_type]

            dto_setters += dto_field_id_template.substitute(
                java_name=java_field_name,
                class_ref_name=ref_name,
                jni_signature=jni_signature)

            dto_setter_template = dto_field_setter_templates[c_type]

            dto_setters += dto_setter_template.substitute(
                java_name=java_field_name,
                jni_signature=jni_signature,
                c_name=c_name,
                jni_setter=jni_setter,
                field_length=field_length)

        handlers.append(
            msg_handler_template.substitute(
                inputfile=inputfile,
                api_data=util.api_message_to_javadoc(f),
                handler_name=handler_name,
                plugin_name=plugin_name,
                dto_name=dto_name,
                class_ref_name=ref_name,
                dto_setters=dto_setters,
                err_handler=err_handler))

    return "\n".join(handlers)
Esempio n. 10
0
def generate_dtos(func_list, base_package, plugin_package, plugin_name,
                  dto_package, inputfile):
    """ Generates dto objects in a dedicated package """
    print "Generating DTOs"

    if not os.path.exists(dto_package):
        raise Exception("%s folder is missing" % dto_package)

    for func in func_list:
        camel_case_dto_name = util.underscore_to_camelcase_upper(func['name'])
        camel_case_method_name = util.underscore_to_camelcase(func['name'])
        dto_path = os.path.join(dto_package, camel_case_dto_name + ".java")

        if util.is_ignored(
                func['name']) or util.is_control_ping(camel_case_dto_name):
            continue

        fields = ""
        for t in zip(func['types'], func['args']):
            # for retval don't generate dto field in Reply
            field_name = util.underscore_to_camelcase(t[1])
            if util.is_reply(camel_case_dto_name) and util.is_retval_field(
                    field_name):
                continue
            fields += field_template.substitute(
                type=util.jni_2_java_type_mapping[t[0]], name=field_name)
        methods = ""
        base_type = ""

        # Generate request/reply or dump/dumpReply even if structure can be used as notification
        if not util.is_just_notification(func["name"]):
            if util.is_reply(camel_case_dto_name):
                description = "reply DTO"
                request_dto_name = get_request_name(camel_case_dto_name,
                                                    func['name'])
                if util.is_details(camel_case_dto_name):
                    # FIXME assumption that dump calls end with "Dump" suffix. Not enforced in vpe.api
                    base_type += "JVppReply<%s.%s.%s>" % (
                        plugin_package, dto_package, request_dto_name + "Dump")
                    generate_dump_reply_dto(request_dto_name, base_package,
                                            plugin_package, dto_package,
                                            camel_case_dto_name,
                                            camel_case_method_name, func)
                else:
                    base_type += "JVppReply<%s.%s.%s>" % (
                        plugin_package, dto_package, request_dto_name)
            else:
                args = "" if fields is "" else "this"
                methods = send_template.substitute(
                    method_name=camel_case_method_name,
                    base_package=base_package,
                    plugin_package=plugin_package,
                    plugin_name=plugin_name,
                    args=args)
                if util.is_dump(camel_case_dto_name):
                    base_type += "JVppDump"
                    description = "dump request DTO"
                else:
                    base_type += "JVppRequest"
                    description = "request DTO"

            write_dto_file(base_package, plugin_package, base_type,
                           camel_case_dto_name, description, dto_package,
                           dto_path, fields, func, inputfile, methods)

        # for structures that are also used as notifications, generate dedicated notification DTO
        if util.is_notification(func["name"]):
            base_type = "JVppNotification"
            description = "notification DTO"
            camel_case_dto_name = util.add_notification_suffix(
                camel_case_dto_name)
            methods = ""
            dto_path = os.path.join(dto_package, camel_case_dto_name + ".java")
            write_dto_file(base_package, plugin_package, base_type,
                           camel_case_dto_name, description, dto_package,
                           dto_path, fields, func, inputfile, methods)

    flush_dump_reply_dtos(inputfile)
Esempio n. 11
0
def generate_dtos(func_list, base_package, dto_package, inputfile):
    """ Generates dto objects in a dedicated package """
    print "Generating DTOs"

    if not os.path.exists(dto_package):
        raise Exception("%s folder is missing" % dto_package)

    for func in func_list:
        camel_case_dto_name = util.underscore_to_camelcase_upper(func['name'])
        camel_case_method_name = util.underscore_to_camelcase(func['name'])
        dto_path = os.path.join(dto_package, camel_case_dto_name + ".java")

        if util.is_ignored(func['name']):
            continue

        fields = ""
        for t in zip(func['types'], func['args']):
            # for retval don't generate dto field in Reply
            field_name = util.underscore_to_camelcase(t[1])
            if util.is_reply(camel_case_dto_name) and util.is_retval_field(field_name):
                continue
            fields += field_template.substitute(type=util.jni_2_java_type_mapping[t[0]],
                                                name=field_name)
        methods = ""
        base_type = ""

        # Generate request/reply or dump/dumpReply even if structure can be used as notification
        if not util.is_just_notification(func["name"]):
            if util.is_reply(camel_case_dto_name):
                description = "vpe.api reply DTO"
                request_dto_name = get_request_name(camel_case_dto_name, func['name'])
                if util.is_details(camel_case_dto_name):
                    # FIXME assumption that dump calls end with "Dump" suffix. Not enforced in vpe.api
                    base_type += "JVppReply<%s.%s.%s>" % (base_package, dto_package, request_dto_name + "Dump")
                    generate_dump_reply_dto(request_dto_name, base_package, dto_package, camel_case_dto_name,
                                            camel_case_method_name, func)
                else:
                    base_type += "JVppReply<%s.%s.%s>" % (base_package, dto_package, request_dto_name)
            else:
                args = "" if fields is "" else "this"
                methods = send_template.substitute(method_name=camel_case_method_name,
                                                   base_package=base_package,
                                                   args=args)
                if util.is_dump(camel_case_dto_name):
                    base_type += "JVppDump"
                    description = "vpe.api dump request DTO"
                else:
                    base_type += "JVppRequest"
                    description = "vpe.api request DTO"

            write_dto_file(base_package, base_type, camel_case_dto_name, description, dto_package, dto_path, fields, func,
                           inputfile, methods)

        # for structures that are also used as notifications, generate dedicated notification DTO
        if util.is_notification(func["name"]):
            base_type = "JVppNotification"
            description = "vpe.api notification DTO"
            camel_case_dto_name = util.add_notification_suffix(camel_case_dto_name)
            methods = ""
            dto_path = os.path.join(dto_package, camel_case_dto_name + ".java")
            write_dto_file(base_package, base_type, camel_case_dto_name, description, dto_package, dto_path, fields, func,
                           inputfile, methods)

    flush_dump_reply_dtos(inputfile)