[ONOS-4718] Deserialize addresses from LISP control message class

With this commit, we try to deserilize all LispAfiAddress from
all LISP control message classes.

Change-Id: Iaf911bff90c45a70859285e426dc1649c3e6db32
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
index 9493911..b1b6fda 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
@@ -60,6 +60,8 @@
     private LispAfiAddress address;
 
     /**
+     * Initializes application data type LCAF address.
+     *
      * @param protocol       protocol number
      * @param ipTos          IP type of service
      * @param localPortLow   low-ranged local port number
@@ -82,6 +84,35 @@
     }
 
     /**
+     * Initializes application data type LCAF address.
+     *
+     * @param reserved1      reserved1
+     * @param reserved2      reserved2
+     * @param flag           flag
+     * @param length         length
+     * @param protocol       protocol number
+     * @param ipTos          IP type of service
+     * @param localPortLow   low-ranged local port number
+     * @param localPortHigh  high-ranged local port number
+     * @param remotePortLow  low-ranged remote port number
+     * @param remotePortHigh high-ranged remote port number
+     * @param address        address
+     */
+    private LispAppDataLcafAddress(byte reserved1, byte reserved2, byte flag, short length,
+                                   byte protocol, int ipTos, short localPortLow,
+                                   short localPortHigh, short remotePortLow,
+                                   short remotePortHigh, LispAfiAddress address) {
+        super(LispCanonicalAddressFormatEnum.APPLICATION_DATA, reserved1, reserved2, flag, length);
+        this.protocol = protocol;
+        this.ipTos = ipTos;
+        this.localPortLow = localPortLow;
+        this.localPortHigh = localPortHigh;
+        this.remotePortLow = remotePortLow;
+        this.remotePortHigh = remotePortHigh;
+        this.address = address;
+    }
+
+    /**
      * Obtains protocol number.
      *
      * @return protocol number
@@ -182,7 +213,8 @@
                 .toString();
     }
 
-    public static final class AppDataAddressBuilder {
+    public static final class AppDataAddressBuilder
+            extends LcafAddressBuilder<AppDataAddressBuilder> {
         private byte protocol;
         private int ipTos;
         private short localPortLow;
@@ -197,7 +229,7 @@
          * @param protocol protocol number
          * @return AppDataAddressBuilder object
          */
-        AppDataAddressBuilder withProtocol(byte protocol) {
+        public AppDataAddressBuilder withProtocol(byte protocol) {
             this.protocol = protocol;
             return this;
         }
@@ -208,7 +240,7 @@
          * @param ipTos IP type of service
          * @return AppDataAddressBuilder object
          */
-        AppDataAddressBuilder withIpTos(int ipTos) {
+        public AppDataAddressBuilder withIpTos(int ipTos) {
             this.ipTos = ipTos;
             return this;
         }
@@ -219,7 +251,7 @@
          * @param localPortLow low-ranged local port number
          * @return AppDataAddressBuilder object
          */
-        AppDataAddressBuilder withLocalPortLow(short localPortLow) {
+        public AppDataAddressBuilder withLocalPortLow(short localPortLow) {
             this.localPortLow = localPortLow;
             return this;
         }
@@ -230,7 +262,7 @@
          * @param localPortHigh high-ranged local port number
          * @return AppDataAddressBuilder object
          */
-        AppDataAddressBuilder withLocalPortHigh(short localPortHigh) {
+        public AppDataAddressBuilder withLocalPortHigh(short localPortHigh) {
             this.localPortHigh = localPortHigh;
             return this;
         }
@@ -241,7 +273,7 @@
          * @param remotePortLow low-ranged remote port number
          * @return AppDataAddressBuilder object
          */
-        AppDataAddressBuilder withRemotePortLow(short remotePortLow) {
+        public AppDataAddressBuilder withRemotePortLow(short remotePortLow) {
             this.remotePortLow = remotePortLow;
             return this;
         }
@@ -252,7 +284,7 @@
          * @param remotePortHigh high-ranged remote port number
          * @return AppDataAddressBuilder object
          */
-        AppDataAddressBuilder withRemotePortHigh(short remotePortHigh) {
+        public AppDataAddressBuilder withRemotePortHigh(short remotePortHigh) {
             this.remotePortHigh = remotePortHigh;
             return this;
         }
@@ -263,7 +295,7 @@
          * @param address AFI address
          * @return AppDataAddressBuilder object
          */
-        AppDataAddressBuilder withAddress(LispAfiAddress address) {
+        public AppDataAddressBuilder withAddress(LispAfiAddress address) {
             this.address = address;
             return this;
         }
@@ -273,9 +305,10 @@
          *
          * @return LispAddDataLcafAddress instance
          */
-        LispAppDataLcafAddress build() {
-            return new LispAppDataLcafAddress(protocol, ipTos, localPortLow,
-                    localPortHigh, remotePortLow, remotePortHigh, address);
+        public LispAppDataLcafAddress build() {
+            return new LispAppDataLcafAddress(reserved1, reserved2, flag, length,
+                    protocol, ipTos, localPortLow, localPortHigh, remotePortLow,
+                    remotePortHigh, address);
         }
     }
 
@@ -288,6 +321,8 @@
         @Override
         public LispAppDataLcafAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
 
+            LispLcafAddress lcafAddress = LispLcafAddress.deserializeCommon(byteBuf);
+
             byte[] ipTosByte = new byte[3];
             byteBuf.readBytes(ipTosByte);
 
@@ -298,17 +333,21 @@
             short remotePortLow = (short) byteBuf.readUnsignedShort();
             short remotePortHigh = (short) byteBuf.readUnsignedShort();
 
-            LispAfiAddress address = new LispIpAddress.IpAddressReader().readFrom(byteBuf);
+            LispAfiAddress address = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
 
             return new AppDataAddressBuilder()
-                        .withProtocol(protocol)
-                        .withIpTos(ipTos)
-                        .withLocalPortLow(localPortLow)
-                        .withLocalPortHigh(localPortHigh)
-                        .withRemotePortLow(remotePortLow)
-                        .withRemotePortHigh(remotePortHigh)
-                        .withAddress(address)
-                        .build();
+                    .withReserved1(lcafAddress.getReserved1())
+                    .withReserved2(lcafAddress.getReserved2())
+                    .withFlag(lcafAddress.getFlag())
+                    .withLength(lcafAddress.getLength())
+                    .withProtocol(protocol)
+                    .withIpTos(ipTos)
+                    .withLocalPortLow(localPortLow)
+                    .withLocalPortHigh(localPortHigh)
+                    .withRemotePortLow(remotePortLow)
+                    .withRemotePortHigh(remotePortHigh)
+                    .withAddress(address)
+                    .build();
         }
 
         /**