X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=extras%2Fjapi%2Fjava%2Fjvpp%2Fgen%2Fjvppgen%2Fjvpp_model.py;h=da1e01f5a63458abb51e4321fd43513397fe5890;hb=413f4a5;hp=299796b908b3d31a6033ade29b17cf6f63930f38;hpb=cc4a5e8089967f0c266e9c5ed319c38c111004cd;p=vpp.git diff --git a/extras/japi/java/jvpp/gen/jvppgen/jvpp_model.py b/extras/japi/java/jvpp/gen/jvppgen/jvpp_model.py index 299796b908b..da1e01f5a63 100755 --- a/extras/japi/java/jvpp/gen/jvppgen/jvpp_model.py +++ b/extras/japi/java/jvpp/gen/jvppgen/jvpp_model.py @@ -17,6 +17,8 @@ import json import pprint from collections import OrderedDict +import binascii + BASE_PACKAGE = "io.fd.vpp.jvpp" @@ -90,9 +92,11 @@ class SimpleType(Type): # TODO(VPP-1187): add array host to net functions to reduce number of members and simplify JNI generation class Array(Type): - def __init__(self, base_type): + def __init__(self, base_type, name=None): + if name is None: + name = base_type.name + _ARRAY_SUFFIX super(Array, self).__init__( - name=base_type.name + _ARRAY_SUFFIX, + name=name, java_name=base_type.java_name + _ARRAY_SUFFIX, java_name_fqn=base_type.java_name_fqn + _ARRAY_SUFFIX, jni_signature="[%s" % base_type.jni_signature, @@ -303,6 +307,11 @@ def is_control_ping_reply(msg): return msg.name == u'control_ping_reply' +def crc(block): + s = str(block).encode() + return binascii.crc32(s) & 0xffffffff + + class JVppModel(object): def __init__(self, logger, json_api_files, plugin_name): self.logger = logger @@ -320,6 +329,7 @@ class JVppModel(object): types = {} self._messages = [] self._services = {} + self._aliases = {} for file_name in json_api_files: with open(file_name) as f: j = json.load(f) @@ -328,10 +338,49 @@ class JVppModel(object): types.update({d[0]: {'type': 'union', 'data': d} for d in j['unions']}) self._messages.extend(j['messages']) self._services.update(j['services']) + self._aliases.update(j['aliases']) + self._parse_types(types) + def _parse_aliases(self, types): + + # model aliases + for alias_name in self._aliases: + alias = self._aliases[alias_name] + alias_type = {"type": "type"} + java_name_lower = _underscore_to_camelcase_lower(alias_name) + vpp_type = alias["type"] + crc_value = '0x%08x' % crc(alias_name) + if "length" in alias: + length = alias["length"] + alias_type["data"] = [ + alias_name, + [ + vpp_type, + java_name_lower, + length + ], + { + "crc": crc_value + } + ] + else: + alias_type["data"] = [ + alias_name, + [ + vpp_type, + java_name_lower + ], + { + "crc": crc_value + } + ] + + types[alias_name] = alias_type + def _parse_types(self, types): self._parse_simple_types() + self._parse_aliases(types) i = 0 while True: unresolved = {} @@ -397,7 +446,10 @@ class JVppModel(object): 'i64': SimpleType('i64', 'long', 'J', 'jlong', 'Long', host_to_net_function='clib_host_to_net_i64', net_to_host_function='clib_net_to_host_i64'), - 'f64': SimpleType('f64', 'double', 'D', 'jdouble', 'Double') + 'f64': SimpleType('f64', 'double', 'D', 'jdouble', 'Double'), + 'string': SimpleType('string', 'String', 'l', 'jstring', 'Object', + host_to_net_function='_host_to_net_string', + net_to_host_function='_net_to_host_string') }) for n, t in self._types_by_name.items(): @@ -481,6 +533,7 @@ class JVppModel(object): def _parse_field(self, field, fields): type_name = _extract_type_name(field[0]) + if type_name in self._types_by_name: if len(field) > 2: # Array field @@ -517,6 +570,7 @@ class JVppModel(object): self.messages = self._messages_by_name.values() + _ARRAY_SUFFIX = '[]'