import errno
import os
import re
import subprocess
import time

import loxi_globals
from generic_utils import memoize
import loxi_utils.loxi_utils as loxi_utils

def erase_type_annotation(class_name):
    m=re.match(r'(.*)<.*>', class_name)
    if m:
        return m.group(1)
    else:
        return class_name

def name_c_to_camel(name):
    """ 'of_stats_reply' -> 'ofStatsReply' """
    name = re.sub(r'^_','', name)
    tokens = name.split('_')
    for i in range(1, len(tokens)):
            tokens[i] = tokens[i].title()
    return "".join(tokens)

def name_c_to_caps_camel(name):
    """ 'of_stats_reply' to 'OFStatsReply' """
    camel = name_c_to_camel(name.title())
    if camel.startswith('Ofp'):
        return camel.replace('Ofp','OF',1)
    elif camel.startswith('Of'):
        return camel.replace('Of','OF',1)
    else:
        return camel

java_primitive_types = set("boolean byte char short int long".split(" "))

### info table about java primitive types, for casting literals in the source code
# { name : (signed?, length_in_bits) }
java_primitives_info = {
        'boolean' : (False, 8, False),
        'byte' : (True, 8, True),
        'char' : (False, 16, True),
        'short' : (True, 16, True),
        'int' : (True, 32, False),
        'long' : (True, 64, False),
}

def format_primitive_literal(t, value):
    """ Format a primitive numeric literal for inclusion in the
        java source code. Takes care of casting the literal
        appropriately for correct representation despite Java's
        signed-craziness
    """
    signed, bits, cast_needed = java_primitives_info[t]
    if t == 'boolean':
        return "true" if bool(value) and value not in("False", "false") else "false"

    max = (1 << bits)-1
    if value > max:
        raise Exception("Value %s to large for type %s" % (value, t))

    if signed:
        max_pos = (1 << (bits-1)) - 1

        if  value > max_pos:
            if t == "long":
                return str((1 << bits) - value)
            else:
                return "(%s) 0x%x" % (t, value)
    return "%s0x%x%s" % ("(%s) " % t if cast_needed else "", value, "L" if t=="long" else "")


ANY = 0xFFFFFFFFFFFFFFFF

class VersionOp:
    def __init__(self, version=ANY, read=None, write=None, default=None, funnel=None):
        self.version = version
        self.read = read
        self.write = write
        self.default = default
        self.funnel = funnel

    def __str__(self):
        return "[Version: %d, Read: '%s', Write: '%s', Default: '%s', Funnel: '%s' ]" % (self.version, self.read, self.write, self.default, self.funnel )

### FIXME: This class should really be cleaned up
class JType(object):
    """ Wrapper class to hold C to Java type conversion information. JTypes can have a 'public'
        and or 'private' java type associated with them and can define how those types can be
        read from and written to ChannelBuffers.

    """
    def __init__(self, pub_type, priv_type=None):
        self.pub_type = pub_type    # the type we expose externally, e.g. 'U8'
        if priv_type is None:
            priv_type = pub_type
        self.priv_type = priv_type  # the internal storage type
        self.ops = {}

    def set_priv_type(self, priv_type):
        self.priv_type = priv_type
        return self

    def op(self, version=ANY, read=None, write=None, default=None, funnel=None, pub_type=ANY):
        """
        define operations to be performed for reading and writing this type
        (when read_op, write_op is called). The operations 'read' and 'write'
        can either be strings ($name, and $version and $length will be replaced),
        or callables (name, version and length) will be passed.

        @param version int      OF version to define operation for, or ANY for all
        @param pub_type boolean whether to define operations for the public type (True), the
                                private type(False) or both (ALL)
        @param read read expression (either string or callable)s
        @param write write expression (either string or callable)
        """

        pub_types = [ pub_type ] if pub_type is not ANY else [ False, True ]
        for pub_type in pub_types:
            self.ops[(version, pub_type)] = VersionOp(version, read, write, default, funnel)
        return self

    def format_value(self, value, pub_type=True):
        # Format a constant value of this type, for inclusion in the java source code
        # For primitive types, takes care of casting the value appropriately, to
        # cope with java's signedness limitation
        t = self.pub_type if pub_type else self.priv_type
        if t in java_primitive_types:
            return format_primitive_literal(t, value)
        else:
            return value

    @property
    def public_type(self):
        """ return the public type """
        return self.pub_type

    def priv(self):
        """ return the public type """
        return self.priv_type

    def has_priv(self):
        """ Is the private type different from the public one?"""
        return self.pub_type != self.priv_type

    def get_op(self, op_type, version, pub_type, default_value, arguments):
        ver = ANY if version is None else version.int_version

        if not "version" in arguments:
            arguments["version"] = version.dotless_version

        def lookup(ver, pub_type):
            if (ver, pub_type) in self.ops:
                return getattr(self.ops[(ver, pub_type)], op_type)
            else:
                return None

        _op = lookup(ver, pub_type) or lookup(ANY, pub_type) or default_value
        if callable(_op):
            return _op(**arguments)
        else:
            return reduce(lambda a,repl: a.replace("$%s" % repl[0], str(repl[1])),  arguments.items(), _op)

    def read_op(self, version=None, length=None, pub_type=True):
        """ return a Java stanza that reads a value of this JType from ChannelBuffer bb.
        @param version int - OF wire version to generate expression for
        @param pub_type boolean use this JTypes 'public' (True), or private (False) representation
        @param length string, for operations that need it (e.g., read a list of unknown length)
               Java expression evaluating to the byte length to be read. Defaults to the remainig
               length of the message.
        @return string containing generated Java expression.
        """
        if length is None:
             # assumes that
             # (1) length of the message has been read to 'length'
             # (2) readerIndex at the start of the message has been stored in 'start'
            length = "length - (bb.readerIndex() - start)"

        return self.get_op("read", version, pub_type,
            default_value='ChannelUtilsVer$version.read%s(bb)' % self.pub_type,
            arguments=dict(length=length)
            )

    def write_op(self, version=None, name=None, pub_type=True):
        """ return a Java stanza that writes a value of this JType contained in Java expression
        'name' to ChannelBuffer bb.
        @param name string containing Java expression that evaluations to the value to be written
        @param version int - OF wire version to generate expression for
        @param pub_type boolean use this JTypes 'public' (True), or private (False) representation
        @return string containing generated Java expression.
        """

        return self.get_op("write", version, pub_type,
            default_value='ChannelUtilsVer$version.write%s(bb, $name)' % self.pub_type,
            arguments=dict(name=name)
            )


    def default_op(self, version=None, pub_type=True):
        """ return a Java stanza that returns a default value of this JType.
        @param version JavaOFVersion
        @return string containing generated Java expression.
        """
        return self.get_op("default", version, pub_type,
            arguments = dict(),
            default_value = self.format_value(0) if self.is_primitive else "null"
        )

    def skip_op(self, version=None, length=None):
        """ return a java stanza that skips an instance of JType in the input ChannelBuffer 'bb'.
            This is used in the Reader implementations for virtual classes (because after the
            discriminator field, the concrete Reader instance will re-read all the fields)
            Currently just delegates to read_op + throws away the result."""
        return self.read_op(version, length)

    def funnel_op(self, version=None, name=None, pub_type=True):
        t = self.pub_type if pub_type else self.priv_type
        return self.get_op("funnel", version, pub_type,
            arguments = dict(name=name),
            default_value =  '$name.putTo(sink)' if not self._is_primitive(pub_type) else "sink.put{}($name)".format(t[0].upper() + t[1:])
        )

    @property
    def is_primitive(self):
        return self._is_primitive()

    def _is_primitive(self, pub_type=True):
        """ return true if the pub_type is a java primitive type (and thus needs
        special treatment, because it doesn't have methods)"""
        t = self.pub_type if pub_type else self.priv_type
        return t in java_primitive_types

    @property
    def is_array(self):
        return self._is_array()

    def _is_array(self, pub_type=True):
        t = self.pub_type if pub_type else self.priv_type
        return t.endswith("[]")

# Create a default mapping for a list type. Type defauls to List<${java_mapping_of_name}>
def gen_enum_jtype(java_name, is_bitmask=False):
    if is_bitmask:
        java_type = "Set<{}>".format(java_name)
        default_value = "ImmutableSet.<{}>of()".format(java_name)
    else:
        java_type = java_name
        default_value = "null"

    serializer = "{}SerializerVer$version".format(java_name)

    return JType(java_type)\
            .op(read="{}.readFrom(bb)".format(serializer),
                write="{}.writeTo(bb, $name)".format(serializer),
                default=default_value,
                funnel="{}.putTo($name, sink)".format(serializer)
               )

def gen_list_jtype(java_base_name):
    # read op assumes the class has a public final static field READER that implements
    # OFMessageReader<$class> i.e., can deserialize an instance of class from a ChannelBuffer
    # write op assumes class implements Writeable
    return JType("List<{}>".format(java_base_name)) \
        .op(
            read= 'ChannelUtils.readList(bb, $length, {}Ver$version.READER)'.format(java_base_name), \
            write='ChannelUtils.writeList(bb, $name)',
            default="ImmutableList.<{}>of()".format(java_base_name),
            funnel='FunnelUtils.putList($name, sink)'
            )

def gen_fixed_length_string_jtype(length):
    return JType('String').op(
              read='ChannelUtils.readFixedLengthString(bb, {})'.format(length),
              write='ChannelUtils.writeFixedLengthString(bb, $name, {})'.format(length),
              default='""',
              funnel='sink.putUnencodedChars($name)'
            )

##### Predefined JType mappings
# FIXME: This list needs to be pruned / cleaned up. Most of these are schematic.

u8 =  JType('short', 'byte') \
        .op(read='U8.f(bb.readByte())', write='bb.writeByte(U8.t($name))', pub_type=True) \
        .op(read='bb.readByte()', write='bb.writeByte($name)', pub_type=False)
u8_list =  JType('List<U8>') \
        .op(read='ChannelUtils.readList(bb, $length, U8.READER)',
            write='ChannelUtils.writeList(bb, $name)',
            default='ImmutableList.<U8>of()',
            funnel='FunnelUtils.putList($name, sink)'
           )
u16 = JType('int', 'short') \
        .op(read='U16.f(bb.readShort())', write='bb.writeShort(U16.t($name))', pub_type=True) \
        .op(read='bb.readShort()', write='bb.writeShort($name)', pub_type=False)
u32 = JType('long', 'int') \
        .op(read='U32.f(bb.readInt())', write='bb.writeInt(U32.t($name))', pub_type=True) \
        .op(read='bb.readInt()', write='bb.writeInt($name)', pub_type=False)
u32_list = JType('List<U32>', 'int[]') \
        .op(
                read='ChannelUtils.readList(bb, $length, U32.READER)',
                write='ChannelUtils.writeList(bb, $name)',
                default="ImmutableList.<U32>of()",
                funnel="FunnelUtils.putList($name, sink)")
u64_list = JType('List<U64>', 'int[]') \
        .op(
                read='ChannelUtils.readList(bb, $length, U64.READER)',
                write='ChannelUtils.writeList(bb, $name)',
                default="ImmutableList.<U64>of()",
                funnel="FunnelUtils.putList($name, sink)")
u8obj = JType('U8', 'U8') \
        .op(read='U8.of(bb.readByte())', write='bb.writeByte($name.getRaw())', default="U8.ZERO")
u16obj = JType('U16', 'U16') \
        .op(read='U16.of(bb.readShort())', write='bb.writeShort($name.getRaw())', default="U16.ZERO")
u32obj = JType('U32', 'U32') \
        .op(read='U32.of(bb.readInt())', write='bb.writeInt($name.getRaw())', default="U32.ZERO")
u64 = JType('U64', 'long') \
        .op(read='U64.ofRaw(bb.readLong())', write='bb.writeLong($name.getValue())', default="U64.ZERO", pub_type=True) \
        .op(read='bb.readLong()', write='bb.writeLong($name)', pub_type=False)
u128 = JType("U128") \
        .op(read='U128.read16Bytes(bb)',
            write='$name.write16Bytes(bb)',
            default='U128.ZERO')
of_port = JType("OFPort") \
         .op(version=1, read="OFPort.read2Bytes(bb)", write="$name.write2Bytes(bb)", default="OFPort.ANY") \
         .op(version=ANY, read="OFPort.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="OFPort.ANY")
# the same OFPort, but with a default value of ZERO, only for OF10 match
of_port_match_v1 = JType("OFPort") \
         .op(version=1, read="OFPort.read2Bytes(bb)", write="$name.write2Bytes(bb)", default="OFPort.ZERO")
actions_list = gen_list_jtype("OFAction")
instructions_list = gen_list_jtype("OFInstruction")
buckets_list = gen_list_jtype("OFBucket")
port_desc_list = gen_list_jtype("OFPortDesc")
packet_queue_list = gen_list_jtype("OFPacketQueue")
port_desc = JType('OFPortDesc') \
        .op(read='OFPortDescVer$version.READER.readFrom(bb)', \
            write='$name.writeTo(bb)')
octets = JType('byte[]')\
        .op(read='ChannelUtils.readBytes(bb, $length)', \
            write='bb.writeBytes($name)', \
            default="new byte[0]",
            funnel="sink.putBytes($name)"
            );
of_match = JType('Match') \
        .op(read='ChannelUtilsVer$version.readOFMatch(bb)', \
            write='$name.writeTo(bb)',
            default="OFFactoryVer$version.MATCH_WILDCARD_ALL");
group_mod_cmd = JType('OFGroupModCommand', 'short') \
        .op(version=ANY, read="bb.readShort()", write="bb.writeShort($name)")
flow_mod_cmd = JType('OFFlowModCommand', 'short') \
        .op(version=1, read="bb.readShort()", write="bb.writeShort($name)") \
        .op(version=ANY, read="bb.readByte()", write="bb.writeByte($name)")
mac_addr = JType('MacAddress') \
        .op(read="MacAddress.read6Bytes(bb)", \
            write="$name.write6Bytes(bb)",
            default="MacAddress.NONE")

port_name = gen_fixed_length_string_jtype(16)
desc_str = gen_fixed_length_string_jtype(256)
serial_num = gen_fixed_length_string_jtype(32)
table_name = gen_fixed_length_string_jtype(32)
str64 = gen_fixed_length_string_jtype(64)
ipv4 = JType("IPv4Address") \
        .op(read="IPv4Address.read4Bytes(bb)", \
            write="$name.write4Bytes(bb)",
            default='IPv4Address.NONE')
ipv4_list =  JType('List<IPv4Address>') \
        .op(read='ChannelUtils.readList(bb, $length, IPv4Address.READER)',
            write='ChannelUtils.writeList(bb, $name)',
            default='ImmutableList.<IPv4Address>of()',
            funnel="FunnelUtils.putList($name, sink)")
ipv6 = JType("IPv6Address") \
        .op(read="IPv6Address.read16Bytes(bb)", \
            write="$name.write16Bytes(bb)",
            default='IPv6Address.NONE')
ipv6_list =  JType('List<IPv46ddress>') \
        .op(read='ChannelUtils.readList(bb, $length, IPv6Address.READER)',
            write='ChannelUtils.writeList(bb, $name)',
            default='ImmutableList.<IPv6Address>of()',
            funnel="FunnelUtils.putList($name, sink)")
packetin_reason = gen_enum_jtype("OFPacketInReason")
transport_port = JType("TransportPort")\
        .op(read="TransportPort.read2Bytes(bb)",
            write="$name.write2Bytes(bb)",
            default="TransportPort.NONE")
eth_type = JType("EthType")\
        .op(read="EthType.read2Bytes(bb)",
            write="$name.write2Bytes(bb)",
            default="EthType.NONE")
vlan_vid = JType("VlanVid")\
        .op(version=ANY, read="VlanVid.read2Bytes(bb)", write="$name.write2Bytes(bb)", default="VlanVid.ZERO")
vlan_vid_match = JType("OFVlanVidMatch")\
        .op(version=1, read="OFVlanVidMatch.read2BytesOF10(bb)", write="$name.write2BytesOF10(bb)", default="OFVlanVidMatch.NONE") \
        .op(version=2, read="OFVlanVidMatch.read2BytesOF10(bb)", write="$name.write2BytesOF10(bb)", default="OFVlanVidMatch.NONE") \
        .op(version=ANY, read="OFVlanVidMatch.read2Bytes(bb)", write="$name.write2Bytes(bb)", default="OFVlanVidMatch.NONE")
vlan_pcp = JType("VlanPcp")\
        .op(read="VlanPcp.readByte(bb)",
            write="$name.writeByte(bb)",
            default="VlanPcp.NONE")
ip_dscp = JType("IpDscp")\
        .op(read="IpDscp.readByte(bb)",
            write="$name.writeByte(bb)",
            default="IpDscp.NONE")
ip_ecn = JType("IpEcn")\
        .op(read="IpEcn.readByte(bb)",
            write="$name.writeByte(bb)",
            default="IpEcn.NONE")
ip_proto = JType("IpProtocol")\
        .op(read="IpProtocol.readByte(bb)",
            write="$name.writeByte(bb)",
            default="IpProtocol.NONE")
icmpv4_type = JType("ICMPv4Type")\
        .op(read="ICMPv4Type.readByte(bb)",
            write="$name.writeByte(bb)",
            default="ICMPv4Type.NONE")
icmpv4_code = JType("ICMPv4Code")\
        .op(read="ICMPv4Code.readByte(bb)",
            write="$name.writeByte(bb)",
            default="ICMPv4Code.NONE")
arp_op = JType("ArpOpcode")\
        .op(read="ArpOpcode.read2Bytes(bb)",
            write="$name.write2Bytes(bb)",
            default="ArpOpcode.NONE")
ipv6_flabel = JType("IPv6FlowLabel")\
        .op(read="IPv6FlowLabel.read4Bytes(bb)",
            write="$name.write4Bytes(bb)",
            default="IPv6FlowLabel.NONE")
metadata = JType("OFMetadata")\
        .op(read="OFMetadata.read8Bytes(bb)",
            write="$name.write8Bytes(bb)",
            default="OFMetadata.NONE")
oxm = JType("OFOxm<?>")\
        .op(  read="OFOxmVer$version.READER.readFrom(bb)",
              write="$name.writeTo(bb)")
oxm_list = JType("OFOxmList") \
        .op(
            read= 'OFOxmList.readFrom(bb, $length, OFOxmVer$version.READER)', \
            write='$name.writeTo(bb)',
            default="OFOxmList.EMPTY")
meter_features = JType("OFMeterFeatures")\
        .op(read="OFMeterFeaturesVer$version.READER.readFrom(bb)",
            write="$name.writeTo(bb)")
bsn_vport = JType("OFBsnVport")\
        .op(read="OFBsnVportVer$version.READER.readFrom(bb)",
            write="$name.writeTo(bb)")
flow_wildcards = JType("int") \
        .op(read='bb.readInt()',
            write='bb.writeInt($name)',
            default="OFFlowWildcardsSerializerVer$version.ALL_VAL")
table_stats_wildcards = JType("int") \
        .op(read='bb.readInt()',
            write='bb.writeInt($name)')
port_bitmap = JType('OFBitMask128') \
            .op(read='OFBitMask128.read16Bytes(bb)',
                write='$name.write16Bytes(bb)',
                default='OFBitMask128.NONE')
table_id = JType("TableId") \
        .op(read='TableId.readByte(bb)',
            write='$name.writeByte(bb)',
            default='TableId.ALL')
table_id_default_zero = JType("TableId") \
        .op(read='TableId.readByte(bb)',
            write='$name.writeByte(bb)',
            default='TableId.ZERO')
of_aux_id = JType("OFAuxId") \
        .op(read='OFAuxId.readByte(bb)',
            write='$name.writeByte(bb)',
            default='OFAuxId.MAIN')
of_version = JType("OFVersion", 'byte') \
            .op(read='bb.readByte()', write='bb.writeByte($name)')

port_speed = JType("PortSpeed")
error_type = JType("OFErrorType")
of_type = JType("OFType", 'byte') \
            .op(read='bb.readByte()', write='bb.writeByte($name)')
action_type= gen_enum_jtype("OFActionType")\
               .set_priv_type("short")\
               .op(read='bb.readShort()', write='bb.writeShort($name)', pub_type=False)
instruction_type = gen_enum_jtype("OFInstructionType")\
               .set_priv_type('short') \
               .op(read='bb.readShort()', write='bb.writeShort($name)', pub_type=False)
buffer_id = JType("OFBufferId") \
            .op(read="OFBufferId.of(bb.readInt())", write="bb.writeInt($name.getInt())", default="OFBufferId.NO_BUFFER")
boolean = JType("boolean", "byte") \
        .op(read='(bb.readByte() != 0)',
            write='bb.writeByte($name ? 1 : 0)',
            default="false")
datapath_id = JType("DatapathId") \
        .op(read='DatapathId.of(bb.readLong())',
            write='bb.writeLong($name.getLong())',
            default='DatapathId.NONE')
action_type_set = JType("Set<OFActionType>") \
        .op(read='ChannelUtilsVer10.readSupportedActions(bb)',
            write='ChannelUtilsVer10.writeSupportedActions(bb, $name)',
            default='ImmutableSet.<OFActionType>of()',
            funnel='ChannelUtilsVer10.putSupportedActionsTo($name, sink)')
of_group = JType("OFGroup") \
         .op(version=ANY, read="OFGroup.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="OFGroup.ALL")
of_group_default_any = JType("OFGroup") \
         .op(version=ANY, read="OFGroup.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="OFGroup.ANY")
# the outgroup field of of_flow_stats_request has a special default value
of_group_default_any = JType("OFGroup") \
         .op(version=ANY, read="OFGroup.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="OFGroup.ANY")
buffer_id = JType("OFBufferId") \
         .op(read="OFBufferId.of(bb.readInt())", write="bb.writeInt($name.getInt())", default="OFBufferId.NO_BUFFER")
lag_id = JType("LagId") \
         .op(version=ANY, read="LagId.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="LagId.NONE")
vrf = JType("VRF") \
         .op(version=ANY, read="VRF.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="VRF.ZERO")
class_id = JType("ClassId") \
         .op(version=ANY, read="ClassId.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="ClassId.NONE")
boolean_value = JType('OFBooleanValue', 'OFBooleanValue') \
        .op(read='OFBooleanValue.of(bb.readByte() != 0)', write='bb.writeByte($name.getInt())', default="OFBooleanValue.FALSE")
gen_table_id = JType("GenTableId") \
        .op(read='GenTableId.read2Bytes(bb)',
            write='$name.write2Bytes(bb)',
           )
udf = JType("UDF") \
         .op(version=ANY, read="UDF.read4Bytes(bb)", write="$name.write4Bytes(bb)", default="UDF.ZERO")
error_cause_data = JType("OFErrorCauseData") \
         .op(version=ANY, read="OFErrorCauseData.read(bb, $length, OFVersion.OF_$version)", write="$name.writeTo(bb)", default="OFErrorCauseData.NONE");

var_string = JType('String').op(
              read='ChannelUtils.readFixedLengthString(bb, $length)',
              write='ChannelUtils.writeFixedLengthString(bb, $name, $name.length())',
              default='""',
              funnel='sink.putUnencodedChars($name)'
            )

generic_t = JType("T")

table_desc = JType('OFTableDesc') \
        .op(read='OFTableDescVer$version.READER.readFrom(bb)', \
            write='$name.writeTo(bb)')


default_mtype_to_jtype_convert_map = {
        'uint8_t' : u8,
        'uint16_t' : u16,
        'uint32_t' : u32,
        'uint64_t' : u64,
        'of_port_no_t' : of_port,
        'list(of_action_t)' : actions_list,
        'list(of_instruction_t)' : instructions_list,
        'list(of_bucket_t)': buckets_list,
        'list(of_port_desc_t)' : port_desc_list,
        'list(of_packet_queue_t)' : packet_queue_list,
        'list(of_uint64_t)' : u64_list,
        'list(of_uint32_t)' : u32_list,
        'list(of_uint8_t)' : u8_list,
        'list(of_oxm_t)' : oxm_list,
        'list(of_ipv4_t)' : ipv4_list,
        'list(of_ipv6_t)' : ipv6_list,
        'of_octets_t' : octets,
        'of_match_t': of_match,
        'of_fm_cmd_t': flow_mod_cmd,
        'of_mac_addr_t': mac_addr,
        'of_port_desc_t': port_desc,
        'of_desc_str_t': desc_str,
        'of_serial_num_t': serial_num,
        'of_port_name_t': port_name,
        'of_table_name_t': table_name,
        'of_str64_t': str64,
        'of_ipv4_t': ipv4,
        'of_ipv6_t': ipv6,
        'of_wc_bmap_t': flow_wildcards,
        'of_oxm_t': oxm,
        'of_meter_features_t': meter_features,
        'of_bitmap_128_t': port_bitmap,
        'of_checksum_128_t': u128,
        'of_bsn_vport_t': bsn_vport,
        'of_table_desc_t': table_desc,
        }

## Map that defines exceptions from the standard loxi->java mapping scheme
# map of {<loxi_class_name> : { <loxi_member_name> : <JType instance> } }
exceptions = {
        'of_packet_in': { 'data' : octets, 'reason': packetin_reason },
        'of_oxm_tcp_src' : { 'value' : transport_port },
        'of_oxm_tcp_src_masked' : { 'value' : transport_port, 'value_mask' : transport_port },
        'of_oxm_tcp_dst' : { 'value' : transport_port },
        'of_oxm_tcp_dst_masked' : { 'value' : transport_port, 'value_mask' : transport_port },
        'of_oxm_udp_src' : { 'value' : transport_port },
        'of_oxm_udp_src_masked' : { 'value' : transport_port, 'value_mask' : transport_port },
        'of_oxm_udp_dst' : { 'value' : transport_port },
        'of_oxm_udp_dst_masked' : { 'value' : transport_port, 'value_mask' : transport_port },
        'of_oxm_sctp_src' : { 'value' : transport_port },
        'of_oxm_sctp_src_masked' : { 'value' : transport_port, 'value_mask' : transport_port },
        'of_oxm_sctp_dst' : { 'value' : transport_port },
        'of_oxm_sctp_dst_masked' : { 'value' : transport_port, 'value_mask' : transport_port },
        'of_oxm_eth_type' : { 'value' : eth_type },
        'of_oxm_eth_type_masked' : { 'value' : eth_type, 'value_mask' : eth_type },
        'of_oxm_vlan_vid' : { 'value' : vlan_vid_match },
        'of_oxm_vlan_vid_masked' : { 'value' : vlan_vid_match, 'value_mask' : vlan_vid_match },
        'of_oxm_vlan_pcp' : { 'value' : vlan_pcp },
        'of_oxm_vlan_pcp_masked' : { 'value' : vlan_pcp, 'value_mask' : vlan_pcp },
        'of_oxm_ip_dscp' : { 'value' : ip_dscp },
        'of_oxm_ip_dscp_masked' : { 'value' : ip_dscp, 'value_mask' : ip_dscp },
        'of_oxm_ip_ecn' : { 'value' : ip_ecn },
        'of_oxm_ip_ecn_masked' : { 'value' : ip_ecn, 'value_mask' : ip_ecn },
        'of_oxm_ip_proto' : { 'value' : ip_proto },
        'of_oxm_ip_proto_masked' : { 'value' : ip_proto, 'value_mask' : ip_proto },
        'of_oxm_icmpv4_type' : { 'value' : icmpv4_type },
        'of_oxm_icmpv4_type_masked' : { 'value' : icmpv4_type, 'value_mask' : icmpv4_type },
        'of_oxm_icmpv4_code' : { 'value' : icmpv4_code },
        'of_oxm_icmpv4_code_masked' : { 'value' : icmpv4_code, 'value_mask' : icmpv4_code },
        'of_oxm_arp_op' : { 'value' : arp_op },
        'of_oxm_arp_op_masked' : { 'value' : arp_op, 'value_mask' : arp_op },
        'of_oxm_arp_spa' : { 'value' : ipv4 },
        'of_oxm_arp_spa_masked' : { 'value' : ipv4, 'value_mask' : ipv4 },
        'of_oxm_arp_tpa' : { 'value' : ipv4 },
        'of_oxm_arp_tpa_masked' : { 'value' : ipv4, 'value_mask' : ipv4 },
        'of_oxm_ipv6_flabel' : { 'value' : ipv6_flabel },
        'of_oxm_ipv6_flabel_masked' : { 'value' : ipv6_flabel, 'value_mask' : ipv6_flabel },
        'of_oxm_metadata' : { 'value' : metadata },
        'of_oxm_metadata_masked' : { 'value' : metadata, 'value_mask' : metadata },

        'of_oxm_icmpv6_code' : { 'value' : u8obj },
        'of_oxm_icmpv6_code_masked' : { 'value' : u8obj, 'value_mask' : u8obj },
        'of_oxm_icmpv6_type' : { 'value' : u8obj },
        'of_oxm_icmpv6_type_masked' : { 'value' : u8obj, 'value_mask' : u8obj },
        'of_oxm_mpls_label' : { 'value' : u32obj },
        'of_oxm_mpls_label_masked' : { 'value' : u32obj, 'value_mask' : u32obj },
        'of_oxm_mpls_tc' : { 'value' : u8obj },
        'of_oxm_mpls_tc_masked' : { 'value' : u8obj, 'value_mask' : u8obj },
        'of_oxm_mpls_bos' : { 'value' : boolean_value },
        'of_oxm_mpls_bos_masked' : { 'value' : boolean_value, 'value_mask' : boolean_value },

        'of_oxm_bsn_in_ports_128' : { 'value': port_bitmap },
        'of_oxm_bsn_in_ports_128_masked' : { 'value': port_bitmap, 'value_mask': port_bitmap },

        'of_oxm_bsn_lag_id' : { 'value' : lag_id },
        'of_oxm_bsn_lag_id_masked' : { 'value' : lag_id, 'value_mask' : lag_id },

        'of_oxm_bsn_vrf' : { 'value' : vrf },
        'of_oxm_bsn_vrf_masked' : { 'value' : vrf, 'value_mask' : vrf },

        'of_oxm_bsn_global_vrf_allowed' : { 'value' : boolean_value },
        'of_oxm_bsn_global_vrf_allowed_masked' : { 'value' : boolean_value, 'value_mask' : boolean_value },

        'of_oxm_bsn_l3_interface_class_id' : { 'value' : class_id },
        'of_oxm_bsn_l3_interface_class_id_masked' : { 'value' : class_id, 'value_mask' : class_id },

        'of_oxm_bsn_l3_src_class_id' : { 'value' : class_id },
        'of_oxm_bsn_l3_src_class_id_masked' : { 'value' : class_id, 'value_mask' : class_id },

        'of_oxm_bsn_l3_dst_class_id' : { 'value' : class_id },
        'of_oxm_bsn_l3_dst_class_id_masked' : { 'value' : class_id, 'value_mask' : class_id },

        'of_oxm_bsn_egr_port_group_id' : { 'value' : class_id },
        'of_oxm_bsn_egr_port_group_id_masked' : { 'value' : class_id, 'value_mask' : class_id },

        'of_oxm_bsn_udf0' : { 'value' : udf },
        'of_oxm_bsn_udf0_masked' : { 'value' : udf, 'value_mask' : udf },

        'of_oxm_bsn_udf1' : { 'value' : udf },
        'of_oxm_bsn_udf1_masked' : { 'value' : udf, 'value_mask' : udf },

        'of_oxm_bsn_udf2' : { 'value' : udf },
        'of_oxm_bsn_udf2_masked' : { 'value' : udf, 'value_mask' : udf },

        'of_oxm_bsn_udf3' : { 'value' : udf },
        'of_oxm_bsn_udf3_masked' : { 'value' : udf, 'value_mask' : udf },

        'of_oxm_bsn_udf4' : { 'value' : udf },
        'of_oxm_bsn_udf4_masked' : { 'value' : udf, 'value_mask' : udf },

        'of_oxm_bsn_udf5' : { 'value' : udf },
        'of_oxm_bsn_udf5_masked' : { 'value' : udf, 'value_mask' : udf },

        'of_oxm_bsn_udf6' : { 'value' : udf },
        'of_oxm_bsn_udf6_masked' : { 'value' : udf, 'value_mask' : udf },

        'of_oxm_bsn_udf7' : { 'value' : udf },
        'of_oxm_bsn_udf7_masked' : { 'value' : udf, 'value_mask' : udf },

        'of_oxm_bsn_tcp_flags' : { 'value' : u16obj },
        'of_oxm_bsn_tcp_flags_masked' : { 'value' : u16obj, 'value_mask' : u16obj },

        'of_oxm_bsn_vlan_xlate_port_group_id' : { 'value' : class_id },
        'of_oxm_bsn_vlan_xlate_port_group_id_masked' : { 'value' : class_id, 'value_mask' : class_id },

        'of_oxm_bsn_l2_cache_hit' : { 'value' : boolean_value },
        'of_oxm_bsn_l2_cache_hit_masked' : { 'value' : boolean_value, 'value_mask' : boolean_value },

        'of_table_stats_entry': { 'wildcards': table_stats_wildcards },
        'of_match_v1': { 'vlan_vid' : vlan_vid_match, 'vlan_pcp': vlan_pcp,
                'eth_type': eth_type, 'ip_dscp': ip_dscp, 'ip_proto': ip_proto,
                'tcp_src': transport_port, 'tcp_dst': transport_port,
                'in_port': of_port_match_v1
                },
        'of_bsn_set_l2_table_request': { 'l2_table_enable': boolean },
        'of_bsn_set_l2_table_reply': { 'l2_table_enable': boolean },
        'of_bsn_set_pktin_suppression_request': { 'enabled': boolean },
        'of_bsn_controller_connection': { 'auxiliary_id' : of_aux_id},
        'of_flow_stats_request': { 'out_group': of_group_default_any },
        'of_aggregate_stats_request': { 'out_group': of_group_default_any },

        'of_action_bsn_mirror': { 'dest_port': of_port },
        'of_action_push_mpls': { 'ethertype': eth_type },
        'of_action_push_pbb': { 'ethertype': eth_type },
        'of_action_push_vlan': { 'ethertype': eth_type },
        'of_action_pop_mpls': { 'ethertype': eth_type },
        'of_action_set_nw_dst': { 'nw_addr': ipv4 },
        'of_action_set_nw_ecn': { 'nw_ecn': ip_ecn },
        'of_action_set_nw_src': { 'nw_addr': ipv4 },
        'of_action_set_tp_dst': { 'tp_port': transport_port },
        'of_action_set_tp_src': { 'tp_port': transport_port },
        'of_action_set_vlan_pcp': { 'vlan_pcp': vlan_pcp },
        'of_action_set_vlan_vid': { 'vlan_vid': vlan_vid },

        'of_group_mod' : { 'command' : group_mod_cmd },
        'of_group_add' : { 'command' : group_mod_cmd },
        'of_group_modify' : { 'command' : group_mod_cmd },
        'of_group_delete' : { 'command' : group_mod_cmd },

        'of_bucket' : { 'watch_group': of_group },

        'of_bsn_tlv_vlan_vid' : { 'value' : vlan_vid },
        'of_bsn_table_set_buckets_size' : { 'table_id' : table_id },
        'of_bsn_gentable_entry_add' : { 'table_id' : gen_table_id },
        'of_bsn_log': { 'data': var_string },

        'of_features_reply' : { 'auxiliary_id' : of_aux_id},
}


@memoize
def enum_java_types():
    enum_types = {}
    for enum in loxi_globals.unified.enums:
        java_name = name_c_to_caps_camel(re.sub(r'_t$', "", enum.name))
        enum_types[enum.name] = gen_enum_jtype(java_name, enum.is_bitmask)
    return enum_types

def make_match_field_jtype(sub_type_name="?"):
    return JType("MatchField<{}>".format(sub_type_name))

def make_oxm_jtype(sub_type_name="?"):
    return JType("OFOxm<{}>".format(sub_type_name))

def list_cname_to_java_name(c_type):
    m = re.match(r'list\(of_([a-zA-Z_]+)_t\)', c_type)
    if not m:
        raise Exception("Not a recgonized standard list type declaration: %s" % c_type)
    base_name = m.group(1)
    return "OF" + name_c_to_caps_camel(base_name)

#### main entry point for conversion of LOXI types (c_types) Java types.
# FIXME: This badly needs a refactoring

def convert_to_jtype(obj_name, field_name, c_type):
    """ Convert from a C type ("uint_32") to a java type ("U32")
    and return a JType object with the size, internal type, and marshalling functions"""
    if obj_name in exceptions and field_name in exceptions[obj_name]:
        return exceptions[obj_name][field_name]
    elif ( obj_name == "of_header" or loxi_utils.class_is_message(obj_name)) and field_name == "type" and c_type == "uint8_t":
        return of_type
    elif field_name == "type" and re.match(r'of_action.*', obj_name):
        return action_type
    elif field_name == "err_type":
        return JType("OFErrorType", 'short') \
            .op(read='bb.readShort()', write='bb.writeShort($name)')
    elif loxi_utils.class_is(obj_name, "of_error_msg") and field_name == "data":
        return error_cause_data
    elif field_name == "stats_type":
        return JType("OFStatsType", 'short') \
            .op(read='bb.readShort()', write='bb.writeShort($name)')
    elif field_name == "type" and re.match(r'of_instruction.*', obj_name):
        return instruction_type
    elif loxi_utils.class_is(obj_name, "of_flow_mod") and field_name == "table_id" and c_type == "uint8_t":
        return table_id_default_zero
    elif loxi_utils.class_is(obj_name, "of_flow_mod") and field_name == "out_group" and c_type == "uint32_t":
        return of_group_default_any
    elif field_name == "table_id" and c_type == "uint8_t":
        return table_id
    elif field_name == "version" and c_type == "uint8_t":
        return of_version
    elif field_name == "buffer_id" and c_type == "uint32_t":
        return buffer_id
    elif field_name == "group_id" and c_type == "uint32_t":
        return of_group
    elif field_name == 'datapath_id':
        return datapath_id
    elif field_name == 'actions' and obj_name == 'of_features_reply':
        return action_type_set
    elif field_name == "table_id" and re.match(r'of_bsn_gentable.*', obj_name):
        return gen_table_id
    elif c_type in default_mtype_to_jtype_convert_map:
        return default_mtype_to_jtype_convert_map[c_type]
    elif re.match(r'list\(of_([a-zA-Z_]+)_t\)', c_type):
        return gen_list_jtype(list_cname_to_java_name(c_type))
    elif c_type in enum_java_types():
        return enum_java_types()[c_type]
    else:
        print "WARN: Couldn't find java type conversion for '%s' in %s:%s" % (c_type, obj_name, field_name)
        jtype = name_c_to_caps_camel(re.sub(r'_t$', "", c_type))
        return JType(jtype)


#### Enum specific wiretype definitions
enum_wire_types = {
        "uint8_t": JType("byte").op(read="bb.readByte()", write="bb.writeByte($name)"),
        "uint16_t": JType("short").op(read="bb.readShort()", write="bb.writeShort($name)"),
        "uint32_t": JType("int").op(read="bb.readInt()", write="bb.writeInt($name)"),
        "uint64_t": JType("long").op(read="bb.readLong()", write="bb.writeLong($name)"),
}

def convert_enum_wire_type_to_jtype(wire_type):
    return enum_wire_types[wire_type]
