Rename static final variable 'logger' to 'LOG'
[lispflowmapping.git] / mappingservice / northbound / src / main / java / org / opendaylight / lispflowmapping / northbound / YangTransformerNB.java
index 7ad5750a86bf64a2ae1fe4df98b2dd4de0ea1f21..e2300e76c492f0a0391dcbf232f7ac4cd955cb6e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -9,26 +9,44 @@
 package org.opendaylight.lispflowmapping.northbound;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
+import javax.xml.bind.DatatypeConverter;
+
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.EidToLocatorRecord.Action;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispAFIAddress;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRegister;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRequest;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecordBuilder;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord;
-import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord.Action;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecordBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaflistaddress.Addresses;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.DstAddress;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.DstAddressBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.SrcAddress;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.SrcAddressBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaftrafficengineeringaddress.Hops;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaftrafficengineeringaddress.HopsBuilder;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.LispAddressContainer;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.LispAddressContainerBuilder;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.Address;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.AS;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.ASBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.DistinguishedName;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.DistinguishedNameBuilder;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv4;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv4Builder;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv6;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv6Builder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafApplicationDataBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafListBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSegmentBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSourceDestBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafTrafficEngineeringBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Mac;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.MacBuilder;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.NoBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.PrimitiveAddress;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecord;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecordBuilder;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.mapregisternotification.MapRegisterBuilder;
@@ -36,22 +54,32 @@ import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.ItrRloc
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.ItrRlocBuilder;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.SourceEidBuilder;
 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequestnotification.MapRequestBuilder;
+import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.reencaphop.HopBuilder;
 import org.opendaylight.lispflowmapping.type.AddressFamilyNumberEnum;
+import org.opendaylight.lispflowmapping.type.LispCanonicalAddressFormatEnum;
 import org.opendaylight.lispflowmapping.type.lisp.EidRecord;
 import org.opendaylight.lispflowmapping.type.lisp.MapReplyAction;
 import org.opendaylight.lispflowmapping.type.lisp.address.LispASAddress;
 import org.opendaylight.lispflowmapping.type.lisp.address.LispAddress;
+import org.opendaylight.lispflowmapping.type.lisp.address.LispApplicationDataLCAFAddress;
+import org.opendaylight.lispflowmapping.type.lisp.address.LispDistinguishedNameAddress;
 import org.opendaylight.lispflowmapping.type.lisp.address.LispIpv4Address;
 import org.opendaylight.lispflowmapping.type.lisp.address.LispIpv6Address;
+import org.opendaylight.lispflowmapping.type.lisp.address.LispLCAFAddress;
+import org.opendaylight.lispflowmapping.type.lisp.address.LispListLCAFAddress;
+import org.opendaylight.lispflowmapping.type.lisp.address.LispMACAddress;
+import org.opendaylight.lispflowmapping.type.lisp.address.LispNoAddress;
+import org.opendaylight.lispflowmapping.type.lisp.address.LispSegmentLCAFAddress;
+import org.opendaylight.lispflowmapping.type.lisp.address.LispSourceDestLCAFAddress;
+import org.opendaylight.lispflowmapping.type.lisp.address.LispTrafficEngineeringLCAFAddress;
+import org.opendaylight.lispflowmapping.type.lisp.address.ReencapHop;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 
 public class YangTransformerNB {
 
-    protected static final Logger logger = LoggerFactory.getLogger(YangTransformerNB.class);
-
     public static LispAddressContainer toContainer(LispAFIAddress address) {
         if (address instanceof Address) {
             return new LispAddressContainerBuilder().setAddress((Address) address).build();
@@ -60,6 +88,73 @@ public class YangTransformerNB {
         }
     }
 
+    public static LispAFIAddress toAFI(LispAddressContainer container) {
+        return (LispAFIAddress) container.getAddress();
+    }
+
+    public static PrimitiveAddress toPrimitive(LispAFIAddress address) {
+        if (address instanceof Ipv4) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4Builder()
+                    .setIpv4Address(((Ipv4) address).getIpv4Address()).setAfi(address.getAfi()).build();
+        }
+        if (address instanceof Ipv6) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv6Builder()
+                    .setIpv6Address(((Ipv6) address).getIpv6Address()).setAfi(address.getAfi()).build();
+        }
+        if (address instanceof Mac) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.MacBuilder()
+                    .setAfi(address.getAfi()).setMacAddress(((Mac) address).getMacAddress()).build();
+        }
+        if (address instanceof DistinguishedName) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.DistinguishedNameBuilder()
+                    .setAfi(address.getAfi()).setDistinguishedName(((DistinguishedName) address).getDistinguishedName()).build();
+        }
+        if (address instanceof AS) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.ASBuilder().setAfi(address.getAfi())
+                    .setAS(((AS) address).getAS()).build();
+        }
+        return null;
+    }
+
+    public static LispAFIAddress toAFIfromPrimitive(PrimitiveAddress primitive) {
+
+        if (primitive instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv4Builder()
+                    .setAfi(((LispAFIAddress) primitive).getAfi())
+                    .setIpv4Address(
+                            ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) primitive)
+                                    .getIpv4Address()).build();
+        }
+        if (primitive instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv6) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv6Builder()
+                    .setAfi(((LispAFIAddress) primitive).getAfi())
+                    .setIpv6Address(
+                            ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv6) primitive)
+                                    .getIpv6Address()).build();
+        }
+        if (primitive instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Mac) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.MacBuilder()
+                    .setAfi(((LispAFIAddress) primitive).getAfi())
+                    .setMacAddress(
+                            ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Mac) primitive)
+                                    .getMacAddress()).build();
+        }
+        if (primitive instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.DistinguishedName) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.DistinguishedNameBuilder()
+                    .setAfi(((LispAFIAddress) primitive).getAfi())
+                    .setDistinguishedName(
+                            ((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.DistinguishedName) primitive)
+                                    .getDistinguishedName()).build();
+        }
+        if (primitive instanceof org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.AS) {
+            return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.ASBuilder()
+                    .setAfi(((LispAFIAddress) primitive).getAfi())
+                    .setAS(((org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.AS) primitive).getAS())
+                    .build();
+        }
+        return null;
+    }
+
     public static LispAddressContainer transformLispAddress(LispAddress lispAddress) {
 
         if (lispAddress == null) {
@@ -83,54 +178,284 @@ public class YangTransformerNB {
             lispAFIAddress = new ASBuilder().setAS(lispASAddress.getAS()).setAfi(ianaCode).build();
             break;
         case DISTINGUISHED_NAME:
+            LispDistinguishedNameAddress lispDNAddress = (LispDistinguishedNameAddress) lispAddress;
+            lispAFIAddress = new DistinguishedNameBuilder().setDistinguishedName(lispDNAddress.getDistinguishedName()).setAfi(ianaCode).build();
             break;
         case IP6:
             LispIpv6Address lispIpv6Address = (LispIpv6Address) lispAddress;
             Ipv6Address ipv6Address = new Ipv6Address(lispIpv6Address.getAddress().getHostAddress());
             lispAFIAddress = new Ipv6Builder().setIpv6Address(ipv6Address).setAfi(ianaCode).build();
             break;
-        case LCAF:
-            break;
+
         case MAC:
+            lispAFIAddress = transformLispMACAddress(lispAddress);
             break;
-        case UNKNOWN:
-            break;
-        default:
 
+        case LCAF:
+
+            LispLCAFAddress lispLcafAddress = (LispLCAFAddress) lispAddress;
+            LispCanonicalAddressFormatEnum lcafEnum = lispLcafAddress.getType();
+
+            switch (lcafEnum) {
+            case APPLICATION_DATA:
+                lispAFIAddress = transformLispApplicationDataLCAFAddress(lispLcafAddress);
+                break;
+            case LIST:
+                lispAFIAddress = transformLispListLCAFAddress(lispLcafAddress);
+                break;
+            case SEGMENT:
+                lispAFIAddress = transformLispSegmentLCAFAddress(lispLcafAddress);
+                break;
+            case SOURCE_DEST:
+                lispAFIAddress = transformLispSourceDestLCAFAddress(lispLcafAddress);
+                break;
+            case TRAFFIC_ENGINEERING:
+                lispAFIAddress = transformLispTrafficEngineeringLCAFAddress(lispLcafAddress);
+                break;
+            case UNKNOWN:
+            default:
+                throw new IllegalArgumentException("LCAF type " + lcafEnum + " not supported by this transoformer");
+            }
             break;
+
+        case UNKNOWN:
+        default:
+            throw new IllegalArgumentException("AFI " + lispAddress.getAfi() + " not supported by this transformer");
         }
 
         return toContainer(lispAFIAddress);
 
     }
 
+    public static LispAFIAddress transformLispMACAddress(LispAddress lispAddress) {
+        LispMACAddress lispMacAddress = (LispMACAddress) lispAddress;
+        StringBuilder sb = new StringBuilder(17);
+        for (byte b : lispMacAddress.getMAC()) {
+            if (sb.length() > 0)
+                sb.append(':');
+            sb.append(String.format("%02x", b));
+        }
+
+        return new MacBuilder().setAfi(lispMacAddress.getAfi().getIanaCode()).setMacAddress(new MacAddress(sb.toString())).build();
+    }
+
+    public static LispAFIAddress transformLispApplicationDataLCAFAddress(LispLCAFAddress lispLcafAddress) {
+        LispApplicationDataLCAFAddress lispApplicationDataLCAFAddress = (LispApplicationDataLCAFAddress) lispLcafAddress;
+        org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafapplicationdataaddress.Address address;
+        address = new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafapplicationdataaddress.AddressBuilder().setPrimitiveAddress(
+                toPrimitive(toAFI(transformLispAddress(lispApplicationDataLCAFAddress.getAddress())))).build();
+        return new LcafApplicationDataBuilder().setAfi(lispLcafAddress.getAfi().getIanaCode())
+                .setLcafType((short) lispLcafAddress.getType().getLispCode()).setIpTos(lispApplicationDataLCAFAddress.getIPTos())
+                .setLocalPort(new PortNumber((int) lispApplicationDataLCAFAddress.getLocalPort()))
+                .setRemotePort(new PortNumber((int) lispApplicationDataLCAFAddress.getRemotePort())).setAddress(address).build();
+    }
+
+    public static LispAFIAddress transformLispListLCAFAddress(LispLCAFAddress lispLcafAddress) {
+
+        LispListLCAFAddress lispListLCAFAddress = (LispListLCAFAddress) lispLcafAddress;
+
+        List<Addresses> listAddresses = new ArrayList<Addresses>();
+
+        for (int i = 0; i < lispListLCAFAddress.getAddresses().size(); i++) {
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaflistaddress.Addresses addresses;
+            addresses = new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaflistaddress.AddressesBuilder().setPrimitiveAddress(
+                    toPrimitive(toAFI(transformLispAddress(lispListLCAFAddress.getAddresses().get(i))))).build();
+            listAddresses.add(addresses);
+        }
+
+        return new LcafListBuilder().setAfi(lispLcafAddress.getAfi().getIanaCode()).setLcafType((short) lispLcafAddress.getType().getLispCode())
+                .setAddresses(listAddresses).build();
+    }
+
+    public static LispAFIAddress transformLispSegmentLCAFAddress(LispLCAFAddress lispLcafAddress) {
+        LispSegmentLCAFAddress lispSegmentLCAFAddress = (LispSegmentLCAFAddress) lispLcafAddress;
+        org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsegmentaddress.Address address;
+        address = new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsegmentaddress.AddressBuilder().setPrimitiveAddress(
+                toPrimitive(toAFI(transformLispAddress(lispSegmentLCAFAddress.getAddress())))).build();
+
+        return new LcafSegmentBuilder().setAfi(lispLcafAddress.getAfi().getIanaCode()).setLcafType((short) lispLcafAddress.getType().getLispCode())
+                .setInstanceId((long) lispSegmentLCAFAddress.getInstanceId()).setAddress(address).build();
+
+    }
+
+    public static LispAFIAddress transformLispSourceDestLCAFAddress(LispLCAFAddress lispLcafAddress) {
+        LispSourceDestLCAFAddress lispSourceDestLCAFAddress = (LispSourceDestLCAFAddress) lispLcafAddress;
+
+        SrcAddress srcAddress = new SrcAddressBuilder().setPrimitiveAddress(
+                toPrimitive(toAFI(transformLispAddress(lispSourceDestLCAFAddress.getSrcAddress())))).build();
+
+        DstAddress dstAddress = new DstAddressBuilder().setPrimitiveAddress(
+                toPrimitive(toAFI(transformLispAddress(lispSourceDestLCAFAddress.getDstAddress())))).build();
+
+        return new LcafSourceDestBuilder().setAfi(lispLcafAddress.getAfi().getIanaCode())
+                .setLcafType((short) lispLcafAddress.getType().getLispCode()).setSrcMaskLength((short) lispSourceDestLCAFAddress.getSrcMaskLength())
+                .setDstMaskLength((short) lispSourceDestLCAFAddress.getDstMaskLength()).setSrcAddress(srcAddress).setDstAddress(dstAddress).build();
+    }
+
+    public static LispAFIAddress transformLispTrafficEngineeringLCAFAddress(LispLCAFAddress lispLcafAddress) {
+        LispTrafficEngineeringLCAFAddress lispTrafficEngineeringLCAFAddress = (LispTrafficEngineeringLCAFAddress) lispLcafAddress;
+
+        List<Hops> listHops = new ArrayList<Hops>();
+
+        for (int i = 0; i < lispTrafficEngineeringLCAFAddress.getHops().size(); i++) {
+            ReencapHop reencapHop = lispTrafficEngineeringLCAFAddress.getHops().get(i);
+
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.reencaphop.Hop hop;
+            hop = new HopBuilder().setPrimitiveAddress(toPrimitive(toAFI(transformLispAddress(reencapHop.getHop())))).build();
+
+            Hops hops = new HopsBuilder().setLookup(reencapHop.isLookup()).setRLOCProbe(reencapHop.isRLOCProbe()).setStrict(reencapHop.isStrict())
+                    .setHop(hop).build();
+
+            listHops.add(hops);
+
+        }
+
+        return new LcafTrafficEngineeringBuilder().setAfi(lispLcafAddress.getAfi().getIanaCode())
+                .setLcafType((short) lispLcafAddress.getType().getLispCode()).setHops(listHops).build();
+    }
+
     public static LispAddress transformToLispAddress(LispAddressContainer lispAddress) {
 
-        LispAddress legacyAddres = null;
+        LispAddress legacyAddress = null;
         LispAFIAddress address = (LispAFIAddress) lispAddress.getAddress();
-        short ianaCode = address.getAfi();
-
-        // TODO: add all other cases.
+        AddressFamilyNumberEnum afi = AddressFamilyNumberEnum.valueOf(address.getAfi());
 
-        switch (ianaCode) {
+        switch (afi) {
 
-        case 1:
-            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv4Address lispIpv4Address = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv4Address) address;
-            legacyAddres = new LispIpv4Address(lispIpv4Address.getIpv4Address().getValue());
+        case IP:
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv4Address lispIpv4Address;
+            lispIpv4Address = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv4Address) address;
+            legacyAddress = new LispIpv4Address(lispIpv4Address.getIpv4Address().getValue());
+            break;
+        case IP6:
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv6Address lispIpv6Address;
+            lispIpv6Address = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv6Address) address;
+            legacyAddress = new LispIpv6Address(lispIpv6Address.getIpv6Address().getValue());
+            break;
+        case AS:
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispASAddress lispASAddress;
+            lispASAddress = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispASAddress) address;
+            legacyAddress = new LispASAddress(lispASAddress.getAS());
+            break;
+        case DISTINGUISHED_NAME:
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispDistinguishedNameAddress lispDistinguishedNameAddress;
+            lispDistinguishedNameAddress = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispDistinguishedNameAddress) address;
+            legacyAddress = new LispDistinguishedNameAddress(lispDistinguishedNameAddress.getDistinguishedName());
+            break;
+        case MAC:
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispMacAddress lispMacAddress;
+            lispMacAddress = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispMacAddress) address;
+            String macString = lispMacAddress.getMacAddress().getValue();
+            macString = macString.replaceAll(":", "");
+            legacyAddress = new LispMACAddress(DatatypeConverter.parseHexBinary(macString));
             break;
-        case 2:
-            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv6Address lispIpv6Address = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv6Address) address;
-            legacyAddres = new LispIpv6Address(lispIpv6Address.getIpv6Address().getValue());
+        case NO_ADDRESS:
+            legacyAddress = new LispNoAddress();
+            break;
+        case LCAF:
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispLcafAddress lispLcafAddress;
+            lispLcafAddress = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispLcafAddress) address;
+
+            LispCanonicalAddressFormatEnum lcafEnum = LispCanonicalAddressFormatEnum.valueOf(lispLcafAddress.getLcafType());
+
+            switch (lcafEnum) {
+            case APPLICATION_DATA:
+                legacyAddress = transformToLispApplicationDataLCAFAddress(lispLcafAddress);
+                break;
+            case LIST:
+                legacyAddress = transformToLispListLCAFAddress(lispLcafAddress);
+                break;
+            case SEGMENT:
+                legacyAddress = transformToLispSegmentLCAFAddress(lispLcafAddress);
+                break;
+            case SOURCE_DEST:
+                legacyAddress = transformToLispSourceDestLCAFAddress(lispLcafAddress);
+                break;
+            case TRAFFIC_ENGINEERING:
+                legacyAddress = transformToLispTrafficEngineeringLCAFAddress(lispLcafAddress);
+                break;
+            case UNKNOWN:
+            default:
+                throw new IllegalArgumentException("LCAF type " + lcafEnum + " not supported by this transoformer");
+            }
             break;
+        case UNKNOWN:
         default:
+            throw new IllegalArgumentException("AFI " + afi + " not supported by this transformer");
+        }
 
-            break;
+        return legacyAddress;
+    }
+
+    public static LispAddress transformToLispApplicationDataLCAFAddress(
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispLcafAddress lispLcafAddress) {
+        org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafApplicationDataAddress lcafApplicationDataAddress;
+        lcafApplicationDataAddress = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafApplicationDataAddress) lispLcafAddress;
+
+        return new LispApplicationDataLCAFAddress((byte) 0, lcafApplicationDataAddress.getProtocol().byteValue(), lcafApplicationDataAddress
+                .getIpTos().intValue(), lcafApplicationDataAddress.getLocalPort().getValue().shortValue(), lcafApplicationDataAddress.getRemotePort()
+                .getValue().shortValue(), transformToLispAddress(toContainer(toAFIfromPrimitive(lcafApplicationDataAddress.getAddress()
+                .getPrimitiveAddress()))));
+    }
+
+    public static LispAddress transformToLispListLCAFAddress(org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispLcafAddress lispLcafAddress) {
+        org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafListAddress lcafListAddress;
+        lcafListAddress = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafListAddress) lispLcafAddress;
+
+        List<LispAddress> listLegacyAddress = new ArrayList<LispAddress>();
+
+        for (int i = 0; i < lcafListAddress.getAddresses().size(); i++) {
+            listLegacyAddress
+                    .add(transformToLispAddress(toContainer(toAFIfromPrimitive(lcafListAddress.getAddresses().get(i).getPrimitiveAddress()))));
         }
+        return new LispListLCAFAddress((byte) 0, listLegacyAddress);
+    }
+
+    public static LispAddress transformToLispSegmentLCAFAddress(org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispLcafAddress lispLcafAddress) {
+        org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafSegmentAddress lcafSegmentAddress;
+        lcafSegmentAddress = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafSegmentAddress) lispLcafAddress;
+
+        byte iidMaskLen = 0;
 
-        return legacyAddres;
+        return new LispSegmentLCAFAddress(iidMaskLen, lcafSegmentAddress.getInstanceId().intValue(),
+                transformToLispAddress(toContainer(toAFIfromPrimitive(lcafSegmentAddress.getAddress().getPrimitiveAddress()))));
 
     }
 
+    public static LispAddress transformToLispSourceDestLCAFAddress(
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispLcafAddress lispLcafAddress) {
+        org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafSourceDestAddress lcafSourceDestAddress;
+        lcafSourceDestAddress = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafSourceDestAddress) lispLcafAddress;
+
+        return new LispSourceDestLCAFAddress((byte) 0, (short) 0, lcafSourceDestAddress.getSrcMaskLength().byteValue(), lcafSourceDestAddress
+                .getDstMaskLength().byteValue(), transformToLispAddress(toContainer(toAFIfromPrimitive(lcafSourceDestAddress.getSrcAddress()
+                .getPrimitiveAddress()))), transformToLispAddress(toContainer(toAFIfromPrimitive(lcafSourceDestAddress.getDstAddress()
+                .getPrimitiveAddress()))));
+
+    }
+
+    public static LispAddress transformToLispTrafficEngineeringLCAFAddress(
+            org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispLcafAddress lispLcafAddress) {
+        org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafTrafficEngineeringAddress lcafTrafficEngineeringAddress;
+        lcafTrafficEngineeringAddress = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafTrafficEngineeringAddress) lispLcafAddress;
+
+        List<ReencapHop> listLegacyHops = new ArrayList<ReencapHop>();
+
+        ReencapHop legacyHop;
+        org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.ReencapHop hop;
+
+        // for (Addresses addresses : lcafListAddress.getAddresses()){
+        for (int i = 0; i < lcafTrafficEngineeringAddress.getHops().size(); i++) {
+            hop = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.ReencapHop) lcafTrafficEngineeringAddress.getHops().get(i);
+
+            legacyHop = new ReencapHop(transformToLispAddress(toContainer(toAFIfromPrimitive(hop.getHop().getPrimitiveAddress()))), (short) 0,
+                    hop.isLookup(), hop.isRLOCProbe(), hop.isStrict());
+
+            listLegacyHops.add(legacyHop);
+        }
+        return new LispTrafficEngineeringLCAFAddress((byte) 0, listLegacyHops);
+    }
+
     public static MapRegister transformMapRegister(org.opendaylight.lispflowmapping.type.lisp.MapRegister legacyMapRegister) {
 
         List<EidToLocatorRecord> listEidToLocatorRecord = new ArrayList<EidToLocatorRecord>();
@@ -189,7 +514,7 @@ public class YangTransformerNB {
 
         for (int j = 0; j < eidToLocatorRecord.getLocatorRecord().size(); j++) {
 
-            LocatorRecord locatorRecord = eidToLocatorRecord.getLocatorRecord().get(j);
+            LocatorRecord locatorRecord = (LocatorRecord) eidToLocatorRecord.getLocatorRecord().get(j);
 
             org.opendaylight.lispflowmapping.type.lisp.LocatorRecord legacyLocatorRecord = new org.opendaylight.lispflowmapping.type.lisp.LocatorRecord();
 
@@ -197,10 +522,10 @@ public class YangTransformerNB {
 
             legacyLocatorRecord.setLocator(YangTransformerNB.transformToLispAddress(rloc));
 
-            legacyLocatorRecord.setLocalLocator(legacyLocatorRecord.isLocalLocator()).setPriority((byte) legacyLocatorRecord.getPriority())
-                    .setWeight((byte) legacyLocatorRecord.getWeight()).setMulticastPriority((byte) legacyLocatorRecord.getMulticastPriority())
-                    .setMulticastWeight((byte) legacyLocatorRecord.getMulticastWeight()).setRlocProbed(legacyLocatorRecord.isRlocProbed())
-                    .setRouted(legacyLocatorRecord.isRouted());
+            legacyLocatorRecord.setLocalLocator(locatorRecord.isLocalLocator()).setPriority(locatorRecord.getPriority())
+                    .setWeight(locatorRecord.getWeight()).setMulticastPriority(locatorRecord.getMulticastPriority())
+                    .setMulticastWeight(locatorRecord.getMulticastWeight()).setRlocProbed(locatorRecord.isRlocProbed())
+                    .setRouted(locatorRecord.isRouted());
 
             legacyRecord.addLocator(legacyLocatorRecord);
         }