Support for overriding toString method for enum values

- added toString overrides for OFPortFeatures, OFPortState and OFPortConfig
diff --git a/java_gen/java_model.py b/java_gen/java_model.py
index f7e0f81..4d84e11 100644
--- a/java_gen/java_model.py
+++ b/java_gen/java_model.py
@@ -130,7 +130,7 @@
                 "OFOxmMplsTcMasked":        OxmMapEntry("U8", "MPLS_TC", True)
                 }
 
-    class OFEnumMetadata(namedtuple("OFEnumMetadata", ("name", "type", "value"))):
+    class OFEnumPropertyMetadata(namedtuple("OFEnumPropertyMetadata", ("name", "type", "value"))):
         @property
         def variable_name(self):
             return self.name[0].lower() + self.name[1:]
@@ -140,6 +140,8 @@
             prefix = "is" if self.type == java_type.boolean else "get"
             return prefix+self.name
 
+    OFEnumMetadata = namedtuple("OFEnumMetadata", ("properties", "to_string"))
+
     def gen_port_speed(enum_entry):
         splits = enum_entry.name.split("_")
         if len(splits)>=2:
@@ -148,6 +150,26 @@
                 return "PortSpeed.SPEED_{}".format(splits[1])
         return "PortSpeed.SPEED_NONE";
 
+
+    port_features_to_string_map = {
+        "PF_10MB_HD":       "10mb-hd",
+        "PF_10MB_FD":       "10mb-fd",
+        "PF_100MB_HD":      "100mb-hd",
+        "PF_100MB_FD":      "100mb-fd",
+        "PF_1GB_HD":        "1gb-hd",
+        "PF_1GB_FD":        "1gb-fd",
+        "PF_10GB_FD":       "10gb-fd",
+        "PF_40GB_FD":       "40gb-fd",
+        "PF_100GB_FD":      "100gb-fd",
+        "PF_1TB_FD":        "1tb-fd",
+        "PF_COPPER":        "copper",
+        "PF_FIBER":         "fiber",
+        "PF_AUTONEG":       "autoneg",
+        "PF_PAUSE":         "pause",
+        "PF_PAUSE_ASYM":    "pause-asym",
+        "PF_OTHER":         "other",
+    }
+
     def gen_stp_state(enum_entry):
         splits = enum_entry.name.split("_")
         if len(splits)>=1:
@@ -155,9 +177,30 @@
                 return "true"
         return "false"
 
-    enum_metadata_map = defaultdict(lambda: (),
-            OFPortFeatures = ( OFEnumMetadata("PortSpeed", java_type.port_speed, gen_port_speed), ),
-            OFPortState = ( OFEnumMetadata("StpState", java_type.boolean, gen_stp_state), )
+    port_state_to_string_map = {
+        "STP_LISTEN":   "listen",
+        "LINK_DOWN":    "link-down",
+        "STP_LEARN":    "learn-no-relay",
+        "STP_FORWARD":  "forward",
+        "STP_BLOCK":    "block-broadcast",
+        "BLOCKED":      "blocked",
+        "LIVE":         "live"
+    }
+
+    port_config_to_string_map = {
+        "PORT_DOWN":        "port-down",
+        "NO_STP":           "no-stp",
+        "NO_RECV":          "no-recv",
+        "NO_RECV_STP":      "no-recv-stp",
+        "NO_FLOOD":         "no-flood",
+        "NO_FWD":           "no-fwd",
+        "NO_PACKET_IN":     "no-pkt-in",
+    }
+
+    enum_metadata_map = defaultdict(lambda: JavaModel.OFEnumMetadata((), None),
+            OFPortFeatures = OFEnumMetadata((OFEnumPropertyMetadata("PortSpeed", java_type.port_speed, gen_port_speed),), lambda e: JavaModel.port_features_to_string_map.get(e.name)),
+            OFPortState = OFEnumMetadata((OFEnumPropertyMetadata("StpState", java_type.boolean, gen_stp_state),), lambda e: JavaModel.port_state_to_string_map.get(e.name)),
+            OFPortConfig = OFEnumMetadata((), lambda e: JavaModel.port_config_to_string_map.get(e.name))
     )
 
     @property
@@ -1055,7 +1098,7 @@
 
     @property
     def constructor_params(self):
-        return [ m.value(self) for m in self.enum.metadata ]
+        return [ m.value(self) for m in self.enum.metadata.properties ]
 
     def has_value(self, version):
         return version in self.values