API: Use string type instead of u8.
[vpp.git] / extras / japi / java / jvpp / gen / jvppgen / jvpp_model.py
index 299796b..da1e01f 100755 (executable)
@@ -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 = '[]'