java_gen: enable generation for all messages, lots of related fixes
diff --git a/java_gen/java_model.py b/java_gen/java_model.py
index a118fdf..4ac497f 100644
--- a/java_gen/java_model.py
+++ b/java_gen/java_model.py
@@ -48,8 +48,8 @@
 class JavaModel(object):
     enum_blacklist = set(("OFDefinitions",))
     enum_entry_blacklist = defaultdict(lambda: set(), OFFlowWildcards=set([ "NW_DST_BITS", "NW_SRC_BITS", "NW_SRC_SHIFT", "NW_DST_SHIFT" ]))
-    write_blacklist = defaultdict(lambda: set(), OFOxm=set(('typeLen',)), OFAction=set(('type',)), OFInstruction=set(('type',)))
-    virtual_interfaces = set(['OFOxm', 'OFAction', 'OFInstruction' ])
+    write_blacklist = defaultdict(lambda: set(), OFOxm=set(('typeLen',)), OFAction=set(('type',)), OFInstruction=set(('type',)), OFFlowMod=set(('command', )))
+    virtual_interfaces = set(['OFOxm', 'OFInstruction', 'OFFlowMod', 'OFBsnVport' ])
 
     @property
     @memoize
@@ -78,6 +78,11 @@
 
     @property
     @memoize
+    def all_classes(self):
+        return [clazz for interface in self.interfaces for clazz in interface.versioned_classes]
+
+    @property
+    @memoize
     def enums(self):
         name_version_enum_map = OrderedDefaultDict(lambda: OrderedDict())
 
@@ -109,12 +114,11 @@
                     members=self.interfaces)
 
     def generate_class(self, clazz):
-        if clazz.interface.is_virtual:
-            return False
-        if clazz.interface.name == "OFTableMod":
-            return False
         if clazz.interface.name.startswith("OFMatchV"):
             return True
+        elif clazz.name == "OFTableModVer10":
+            # tablemod ver 10 is a hack and has no oftype defined
+            return False
         if loxi_utils.class_is_message(clazz.interface.c_name):
             return True
         if loxi_utils.class_is_oxm(clazz.interface.c_name):
@@ -124,7 +128,7 @@
         if loxi_utils.class_is_instruction(clazz.interface.c_name):
             return True
         else:
-            return False
+            return True
 
 
 class OFFactory(namedtuple("OFFactory", ("package", "name", "members"))):
@@ -186,7 +190,7 @@
     def __init__(self, c_name, version_map):
         self.c_name = c_name
         self.version_map = version_map
-        self.name = java_type.name_c_to_caps_camel(c_name)
+        self.name = java_type.name_c_to_caps_camel(c_name) if c_name != "of_header" else "OFMessage"
         self.variable_name = self.name[2].lower() + self.name[3:]
         self.constant_name = c_name.upper().replace("OF_", "")
 
@@ -198,20 +202,39 @@
             self.parent_interface = None
 
     def class_info(self):
-        if re.match(r'OFFlow(Add|Modify(Strict)?|Delete(Strict)?)$', self.name):
+        if re.match(r'OF.+StatsRequest$', self.name):
+            return ("", "OFStatsRequest")
+        elif re.match(r'OF.+StatsReply$', self.name):
+            return ("", "OFStatsReply")
+        elif re.match(r'OFFlow(Add|Modify(Strict)?|Delete(Strict)?)$', self.name):
             return ("", "OFFlowMod")
+        elif loxi_utils.class_is_message(self.c_name) and re.match(r'OFBsn.+$', self.name):
+            return ("", "OFBsnHeader")
+        elif loxi_utils.class_is_message(self.c_name) and re.match(r'OFNicira.+$', self.name):
+            return ("", "OFNiciraHeader")
         elif re.match(r'OFMatch.*', self.name):
             return ("", "Match")
         elif loxi_utils.class_is_message(self.c_name):
             return ("", "OFMessage")
         elif loxi_utils.class_is_action(self.c_name):
-            return ("action", "OFAction")
+            if re.match(r'OFActionBsn.*', self.name):
+                return ("action", "OFActionBsn")
+            elif re.match(r'OFActionNicira.*', self.name):
+                return ("action", "OFActionNicira")
+            else:
+                return ("action", "OFAction")
+        elif re.match(r'OFBsnVport.+$', self.name):
+            return ("", "OFBsnVport")
         elif loxi_utils.class_is_oxm(self.c_name):
             return ("oxm", "OFOxm")
         elif loxi_utils.class_is_instruction(self.c_name):
             return ("instruction", "OFInstruction")
         elif loxi_utils.class_is_meter_band(self.c_name):
             return ("meterband", "OFMeterBand")
+        elif loxi_utils.class_is_queue_prop(self.c_name):
+            return ("queueprop", "OFQueueProp")
+        elif loxi_utils.class_is_hello_elem(self.c_name):
+            return ("", "OFHelloElem")
         else:
             return ("", None)
 
@@ -235,7 +258,7 @@
     @property
     @memoize
     def is_virtual(self):
-        return self.name in model.virtual_interfaces
+        return self.name in model.virtual_interfaces or all(ir_class.virtual for ir_class in self.version_map.values())
 
     @property
     def is_universal(self):
@@ -255,9 +278,6 @@
     @property
     @memoize
     def versioned_classes(self):
-        if self.is_virtual:
-            return []
-        else:
             return [ self.versioned_class(version) for version in self.all_versions ]
 
 #######################################################################
@@ -448,6 +468,10 @@
         return isinstance(self.member, OFFieldLengthMember)
 
     @property
+    def is_discriminator(self):
+        return isinstance(self.member, OFDiscriminatorMember)
+
+    @property
     def is_length_value(self):
         return isinstance(self.member, OFLengthMember)
 
@@ -471,10 +495,18 @@
             return self.msg.version.int_version
         elif self.name == "length" or self.name == "len":
             return self.msg.length
-        elif self.java_type.public_type in ("int", "short", "byte") and self.member.value > 100:
-            return "0x%x" % self.member.value
         else:
-            return self.member.value
+            return self.java_type.format_value(self.member.value)
+
+    @property
+    def priv_value(self):
+        if self.name == "version":
+            return self.msg.version.int_version
+        elif self.name == "length" or self.name == "len":
+            return self.msg.length
+        else:
+            return self.java_type.format_value(self.member.value, pub_type=False)
+
 
     @property
     def is_writeable(self):