[CORD-2583] Change Fpm protocol classes to use Builder pattern

Change-Id: Ia91b5c07529dabddb7d828bb0352143d4a6083a9
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
index 56d193e..e290aea 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
@@ -75,7 +75,6 @@
 import org.slf4j.LoggerFactory;
 
 import java.net.InetSocketAddress;
-import java.util.ArrayList;
 import java.time.Duration;
 import java.util.Collection;
 import java.util.Collections;
@@ -531,24 +530,23 @@
 
     private void sendRouteUpdateToChannel(boolean isAdd, IpPrefix prefix, Channel ch) {
 
-        int netLinkLength;
-        short addrFamily;
-        IpAddress pdPushNextHop;
-
         if (!pdPushEnabled) {
             return;
         }
 
         try {
-            // Construct list of route attributes.
-            List<RouteAttribute> attributes = new ArrayList<>();
+            int raLength;
+            short addrFamily;
+            IpAddress pdPushNextHop;
+
+            // Build route attributes.
             if (prefix.isIp4()) {
                 if (pdPushNextHopIPv4 == null) {
                     log.info("Prefix not pushed because ipv4 next-hop is null.");
                     return;
                 }
                 pdPushNextHop = pdPushNextHopIPv4;
-                netLinkLength =  Ip4Address.BYTE_LENGTH + RouteAttribute.ROUTE_ATTRIBUTE_HEADER_LENGTH;
+                raLength =  Ip4Address.BYTE_LENGTH + RouteAttribute.ROUTE_ATTRIBUTE_HEADER_LENGTH;
                 addrFamily = RtNetlink.RT_ADDRESS_FAMILY_INET;
             } else {
                 if (pdPushNextHopIPv6 == null) {
@@ -556,70 +554,48 @@
                     return;
                 }
                 pdPushNextHop = pdPushNextHopIPv6;
-                netLinkLength =  Ip6Address.BYTE_LENGTH + RouteAttribute.ROUTE_ATTRIBUTE_HEADER_LENGTH;
+                raLength =  Ip6Address.BYTE_LENGTH + RouteAttribute.ROUTE_ATTRIBUTE_HEADER_LENGTH;
                 addrFamily = RtNetlink.RT_ADDRESS_FAMILY_INET6;
             }
 
-            RouteAttributeDst raDst = new RouteAttributeDst(
-                netLinkLength,
-                RouteAttribute.RTA_DST,
-                prefix.address());
-            attributes.add(raDst);
+             RouteAttributeDst raDst = RouteAttributeDst.builder()
+                .length(raLength)
+                .type(RouteAttribute.RTA_DST)
+                .dstAddress(prefix.address())
+                .build();
 
-            RouteAttributeGateway raGateway = new RouteAttributeGateway(
-                netLinkLength,
-                RouteAttribute.RTA_GATEWAY,
-                pdPushNextHop);
-            attributes.add(raGateway);
+            RouteAttributeGateway raGateway = RouteAttributeGateway.builder()
+                .length(raLength)
+                .type(RouteAttribute.RTA_GATEWAY)
+                .gateway(pdPushNextHop)
+                .build();
 
-            // Add RtNetlink header.
-            int srcLength = 0;
-            short tos = 0;
-            short table = 0;
-            short scope = 0;
-            long rtFlags = 0;
+            // Build RtNetlink.
+            RtNetlink rtNetlink = RtNetlink.builder()
+                .addressFamily(addrFamily)
+                .dstLength(prefix.prefixLength())
+                .routeAttribute(raDst)
+                .routeAttribute(raGateway)
+                .build();
+
+            // Build Netlink.
             int messageLength = raDst.length() + raGateway.length() +
-                RtNetlink.RT_NETLINK_LENGTH;
+                                RtNetlink.RT_NETLINK_LENGTH + Netlink.NETLINK_HEADER_LENGTH;
+            Netlink netLink = Netlink.builder()
+                .length(messageLength)
+                .type(isAdd ? NetlinkMessageType.RTM_NEWROUTE : NetlinkMessageType.RTM_DELROUTE)
+                .flags(Netlink.NETLINK_REQUEST | Netlink.NETLINK_CREATE)
+                .rtNetlink(rtNetlink)
+                .build();
 
-            RtNetlink rtNetlink =  new RtNetlink(
-                addrFamily,
-                prefix.prefixLength(),
-                srcLength,
-                tos,
-                table,
-                RtProtocol.ZEBRA,
-                scope,
-                FpmHeader.FPM_TYPE_NETLINK,
-                rtFlags,
-                attributes);
-
-            // Add Netlink header.
-            NetlinkMessageType nlMsgType;
-            if (isAdd) {
-                nlMsgType = NetlinkMessageType.RTM_NEWROUTE;
-            } else {
-                nlMsgType = NetlinkMessageType.RTM_DELROUTE;
-            }
-            int flags = Netlink.NETLINK_REQUEST | Netlink.NETLINK_CREATE;
-            long sequence = 0;
-            long processPortId = 0;
-            messageLength += Netlink.NETLINK_HEADER_LENGTH;
-
-            Netlink netLink = new Netlink(messageLength,
-                nlMsgType,
-                flags,
-                sequence,
-                processPortId,
-                rtNetlink);
-
+            // Build FpmHeader.
             messageLength += FpmHeader.FPM_HEADER_LENGTH;
-
-            // Add FpmHeader.
-            FpmHeader fpmMessage = new FpmHeader(
-                FpmHeader.FPM_VERSION_1,
-                FpmHeader.FPM_TYPE_NETLINK,
-                messageLength,
-                netLink);
+            FpmHeader fpmMessage = FpmHeader.builder()
+                .version(FpmHeader.FPM_VERSION_1)
+                .type(FpmHeader.FPM_TYPE_NETLINK)
+                .length(messageLength)
+                .netlink(netLink)
+                .build();
 
             // Encode message in a channel buffer and transmit.
             ch.write(fpmMessage.encode());