Update japi to support type aliases
[vpp.git] / extras / japi / java / jvpp / gen / jvppgen / jvpp_model.py
index 299796b..1609968 100755 (executable)
@@ -17,6 +17,8 @@ import json
 import pprint
 from collections import OrderedDict
 
+import binascii
+
 BASE_PACKAGE = "io.fd.vpp.jvpp"
 
 
@@ -303,6 +305,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 +327,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 +336,47 @@ 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):
+        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 = {}
@@ -481,6 +526,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 +563,7 @@ class JVppModel(object):
 
         self.messages = self._messages_by_name.values()
 
+
 _ARRAY_SUFFIX = '[]'