From 2fee4c8fadd31979bd3e72c51d276773d17798d1 Mon Sep 17 00:00:00 2001 From: Marek Gradzki Date: Fri, 25 Nov 2016 08:38:29 +0100 Subject: VPP-530: adapt jvpp generation for VPP API splitting Now jvpp uses *.json instead of *.py api representation. Multiple *.json files are supported. Change-Id: I89fa556c7d2a35d42833f2faaa28398ebd2ed012 Signed-off-by: Marek Gradzki --- vpp-api/java/jvpp/gen/jvpp_gen.py | 71 +++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 25 deletions(-) (limited to 'vpp-api/java/jvpp/gen/jvpp_gen.py') diff --git a/vpp-api/java/jvpp/gen/jvpp_gen.py b/vpp-api/java/jvpp/gen/jvpp_gen.py index 1b9ceff8078..b1cd84c4ad1 100755 --- a/vpp-api/java/jvpp/gen/jvpp_gen.py +++ b/vpp-api/java/jvpp/gen/jvpp_gen.py @@ -18,6 +18,7 @@ import argparse import importlib import sys import os +import json from jvppgen import types_gen from jvppgen import callback_gen @@ -40,22 +41,30 @@ from jvppgen import util # defs_api_vpp_papi.py - vpe.api in python format (generated by vppapigen) parser = argparse.ArgumentParser(description='VPP Java API generator') -parser.add_argument('-i', action="store", dest="inputfile") +parser.add_argument('-i', action="store", dest="inputfiles", nargs='+') parser.add_argument('--plugin_name', action="store", dest="plugin_name") args = parser.parse_args() sys.path.append(".") -print "Generating Java API for %s" % args.inputfile -importdir = os.path.dirname(args.inputfile) -print "importdir %s" % importdir -inputfile = os.path.basename(args.inputfile) -inputfile = inputfile.replace('.py', '') -print "inputfile %s" % inputfile +print "Generating Java API for %s" % args.inputfiles +print "inputfiles %s" % args.inputfiles plugin_name = args.plugin_name print "plugin_name %s" % plugin_name -sys.path.append(importdir) -cfg = importlib.import_module(inputfile, package=None) + +cfg = {} + +for inputfile in args.inputfiles: + _cfg = json.load(open(inputfile, 'r')) + if 'types' in cfg: + cfg['types'].extend(_cfg['types']) + else: + cfg['types'] = _cfg['types'] + if 'messages' in cfg: + cfg['messages'].extend(_cfg['messages']) + else: + cfg['messages'] = _cfg['messages'] + def is_request_field(field_name): return field_name not in {'_vl_msg_id', 'client_index', 'context'} @@ -68,6 +77,8 @@ def is_response_field(field_name): def get_args(t, filter): arg_list = [] for i in t: + if is_crc(i): + continue if not filter(i[1]): continue arg_list.append(i[1]) @@ -77,7 +88,11 @@ def get_args(t, filter): def get_types(t, filter): types_list = [] lengths_list = [] + crc = None for i in t: + if is_crc(i): + crc = ('crc', i['crc'][2:]) + continue if not filter(i[1]): continue if len(i) is 3: # array type @@ -89,7 +104,12 @@ def get_types(t, filter): else: # primitive type types_list.append(i[0]) lengths_list.append((0, False)) - return types_list, lengths_list + return types_list, lengths_list, crc + + +def is_crc(arg): + """ Check whether the argument inside message definition is just crc """ + return 'crc' in arg def get_definitions(defs): @@ -101,18 +121,18 @@ def get_definitions(defs): # For replies include all the arguments except message_id if util.is_reply(java_name): - types, lengths = get_types(a[1:], is_response_field) + types, lengths, crc = get_types(a[1:], is_response_field) func_name[a[0]] = dict( [('name', a[0]), ('java_name', java_name), ('args', get_args(a[1:], is_response_field)), ('full_args', get_args(a[1:], lambda x: True)), - ('types', types), ('lengths', lengths)]) + ('types', types), ('lengths', lengths), crc]) # For requests skip message_id, client_id and context else: - types, lengths = get_types(a[1:], is_request_field) + types, lengths, crc = get_types(a[1:], is_request_field) func_name[a[0]] = dict( [('name', a[0]), ('java_name', java_name), ('args', get_args(a[1:], is_request_field)), ('full_args', get_args(a[1:], lambda x: True)), - ('types', types), ('lengths', lengths)]) + ('types', types), ('lengths', lengths), crc]) # Indexed by name func_list.append(func_name[a[0]]) @@ -129,17 +149,18 @@ future_package = 'future' # TODO find better package name callback_facade_package = 'callfacade' -types_list, types_name = get_definitions(cfg.types) +types_list, types_name = get_definitions(cfg['types']) + +types_gen.generate_types(types_list, plugin_package, types_package, args.inputfiles) -types_gen.generate_types(types_list, plugin_package, types_package, inputfile) +func_list, func_name = get_definitions(cfg['messages']) -func_list, func_name = get_definitions(cfg.messages) -dto_gen.generate_dtos(func_list, base_package, plugin_package, plugin_name.title(), dto_package, args.inputfile) -jvpp_impl_gen.generate_jvpp(func_list, base_package, plugin_package, plugin_name, dto_package, args.inputfile) -callback_gen.generate_callbacks(func_list, base_package, plugin_package, plugin_name.title(), callback_package, dto_package, args.inputfile) -notification_gen.generate_notification_registry(func_list, base_package, plugin_package, plugin_name.title(), notification_package, callback_package, dto_package, args.inputfile) -jvpp_c_gen.generate_jvpp(func_list, plugin_name, args.inputfile) -jvpp_future_facade_gen.generate_jvpp(func_list, base_package, plugin_package, plugin_name.title(), dto_package, callback_package, notification_package, future_package, args.inputfile) -jvpp_callback_facade_gen.generate_jvpp(func_list, base_package, plugin_package, plugin_name.title(), dto_package, callback_package, notification_package, callback_facade_package, args.inputfile) +dto_gen.generate_dtos(func_list, base_package, plugin_package, plugin_name.title(), dto_package, args.inputfiles) +jvpp_impl_gen.generate_jvpp(func_list, base_package, plugin_package, plugin_name, dto_package, args.inputfiles) +callback_gen.generate_callbacks(func_list, base_package, plugin_package, plugin_name.title(), callback_package, dto_package, args.inputfiles) +notification_gen.generate_notification_registry(func_list, base_package, plugin_package, plugin_name.title(), notification_package, callback_package, dto_package, args.inputfiles) +jvpp_c_gen.generate_jvpp(func_list, plugin_name, args.inputfiles) +jvpp_future_facade_gen.generate_jvpp(func_list, base_package, plugin_package, plugin_name.title(), dto_package, callback_package, notification_package, future_package, args.inputfiles) +jvpp_callback_facade_gen.generate_jvpp(func_list, base_package, plugin_package, plugin_name.title(), dto_package, callback_package, notification_package, callback_facade_package, args.inputfiles) -print "Java API for %s generated successfully" % args.inputfile +print "Java API for %s generated successfully" % args.inputfiles -- cgit 1.2.3-korg