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)
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
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
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)
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])
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)
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])
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)
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)
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)
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)