Adj-In RIB code fix

Change-Id: Ice870ab1aff068cc27a5337a3f4ff7090a53d84d
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLSIdentifier.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLSIdentifier.java
old mode 100755
new mode 100644
index 9b14b4b..3967a22
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLSIdentifier.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpLinkLSIdentifier.java
@@ -18,6 +18,7 @@
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -28,6 +29,7 @@
 import org.onosproject.bgpio.types.IPv6AddressTlv;
 import org.onosproject.bgpio.types.LinkLocalRemoteIdentifiersTlv;
 import org.onosproject.bgpio.types.attr.BgpAttrNodeMultiTopologyId;
+import org.onosproject.bgpio.util.Constants;
 import org.onosproject.bgpio.util.UnSupportedAttribute;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,13 +40,12 @@
 /**
  * Implementation of local node descriptors, remote node descriptors and link descriptors.
  */
-public class BgpLinkLSIdentifier {
+public class BgpLinkLSIdentifier implements Comparable<Object> {
     private static final Logger log = LoggerFactory.getLogger(BgpLinkLSIdentifier.class);
     public static final short IPV4_INTERFACE_ADDRESS_TYPE = 259;
     public static final short IPV4_NEIGHBOR_ADDRESS_TYPE = 260;
     public static final short IPV6_INTERFACE_ADDRESS_TYPE = 261;
     public static final short IPV6_NEIGHBOR_ADDRESS_TYPE = 262;
-    public static final int TYPE_AND_LEN = 4;
 
     private NodeDescriptors localNodeDescriptors;
     private NodeDescriptors remoteNodeDescriptors;
@@ -107,12 +108,13 @@
      */
     public static NodeDescriptors parseNodeDescriptors(ChannelBuffer cb, short desType, byte protocolId)
             throws BgpParseException {
-        ChannelBuffer tempBuf = cb;
+        log.debug("parse Node descriptors");
+        ChannelBuffer tempBuf = cb.copy();
         short type = cb.readShort();
         short length = cb.readShort();
         if (cb.readableBytes() < length) {
             throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR,
-                    tempBuf.readBytes(cb.readableBytes() + TYPE_AND_LEN));
+                    tempBuf.readBytes(cb.readableBytes() + Constants.TYPE_AND_LEN_AS_SHORT));
         }
         NodeDescriptors nodeIdentifier = new NodeDescriptors();
         ChannelBuffer tempCb = cb.readBytes(length);
@@ -138,12 +140,12 @@
         int count = 0;
 
         while (cb.readableBytes() > 0) {
-            ChannelBuffer tempBuf = cb;
+            ChannelBuffer tempBuf = cb.copy();
             short type = cb.readShort();
             short length = cb.readShort();
             if (cb.readableBytes() < length) {
                 throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR, BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR,
-                        tempBuf.readBytes(cb.readableBytes() + TYPE_AND_LEN));
+                        tempBuf.readBytes(cb.readableBytes() + Constants.TYPE_AND_LEN_AS_SHORT));
             }
             ChannelBuffer tempCb = cb.readBytes(length);
             switch (type) {
@@ -170,7 +172,7 @@
                     //length + 4 implies data contains type, length and value
                     throw new BgpParseException(BgpErrorType.UPDATE_MESSAGE_ERROR,
                             BgpErrorType.OPTIONAL_ATTRIBUTE_ERROR, tempBuf.readBytes(length
-                                    + TYPE_AND_LEN));
+                                    + Constants.TYPE_AND_LEN_AS_SHORT));
                 }
                 break;
             default:
@@ -231,8 +233,12 @@
             } else {
                 while (objListIterator.hasNext() && isCommonSubTlv) {
                     BgpValueType subTlv = objListIterator.next();
-                    isCommonSubTlv = Objects.equals(linkDescriptor.contains(subTlv),
-                            other.linkDescriptor.contains(subTlv));
+                    if (linkDescriptor.contains(subTlv) && other.linkDescriptor.contains(subTlv)) {
+                        isCommonSubTlv = Objects.equals(linkDescriptor.get(linkDescriptor.indexOf(subTlv)),
+                                         other.linkDescriptor.get(other.linkDescriptor.indexOf(subTlv)));
+                    } else {
+                        isCommonSubTlv = false;
+                    }
                 }
                 return isCommonSubTlv && Objects.equals(this.localNodeDescriptors, other.localNodeDescriptors)
                         && Objects.equals(this.remoteNodeDescriptors, other.remoteNodeDescriptors);
@@ -249,4 +255,42 @@
                 .add("linkDescriptor", linkDescriptor)
                 .toString();
     }
+
+    @Override
+    public int compareTo(Object o) {
+        if (this.equals(o)) {
+            return 0;
+        }
+        int result = this.localNodeDescriptors.compareTo(((BgpLinkLSIdentifier) o).localNodeDescriptors);
+        if (result != 0) {
+            return result;
+        } else if (this.remoteNodeDescriptors.compareTo(((BgpLinkLSIdentifier) o).remoteNodeDescriptors) != 0) {
+            return this.remoteNodeDescriptors.compareTo(((BgpLinkLSIdentifier) o).remoteNodeDescriptors);
+        } else {
+            int countOtherSubTlv = ((BgpLinkLSIdentifier) o).linkDescriptor.size();
+            int countObjSubTlv = linkDescriptor.size();
+            if (countOtherSubTlv != countObjSubTlv) {
+                if (countOtherSubTlv > countObjSubTlv) {
+                    return 1;
+                } else {
+                    return -1;
+                }
+           }
+            ListIterator<BgpValueType> listIterator = linkDescriptor.listIterator();
+            ListIterator<BgpValueType> listIteratorOther = ((BgpLinkLSIdentifier) o).linkDescriptor.listIterator();
+            while (listIterator.hasNext()) {
+                BgpValueType tlv = listIterator.next();
+                BgpValueType tlv1 = listIteratorOther.next();
+                if (linkDescriptor.contains(tlv) && ((BgpLinkLSIdentifier) o).linkDescriptor.contains(tlv1)) {
+                    int res = linkDescriptor.get(linkDescriptor.indexOf(tlv)).compareTo(
+                            ((BgpLinkLSIdentifier) o).linkDescriptor.get(((BgpLinkLSIdentifier) o).linkDescriptor
+                                    .indexOf(tlv1)));
+                    if (res != 0) {
+                        return res;
+                    }
+                }
+            }
+        }
+        return 0;
+    }
 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSIdentifier.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSIdentifier.java
index 25910a9..6c2c96d 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSIdentifier.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpNodeLSIdentifier.java
@@ -29,9 +29,9 @@
 /**
  * Implementation of Node Identifier which includes local node descriptor/remote node descriptors.
  */
-public class BgpNodeLSIdentifier {
+public class BgpNodeLSIdentifier implements Comparable<Object> {
 
-    protected static final Logger log = LoggerFactory.getLogger(BgpNodeLSIdentifier.class);
+    private static final Logger log = LoggerFactory.getLogger(BgpNodeLSIdentifier.class);
     private NodeDescriptors nodeDescriptors;
 
     /**
@@ -60,7 +60,8 @@
      */
     public static BgpNodeLSIdentifier parseLocalNodeDescriptors(ChannelBuffer cb, byte protocolId)
             throws BgpParseException {
-        ChannelBuffer tempBuf = cb;
+        log.debug("parse Local node descriptor");
+        ChannelBuffer tempBuf = cb.copy();
         short type = cb.readShort();
         short length = cb.readShort();
         if (cb.readableBytes() < length) {
@@ -110,4 +111,12 @@
                 .add("NodeDescriptors", nodeDescriptors)
                 .toString();
     }
+
+    @Override
+    public int compareTo(Object o) {
+        if (this.equals(o)) {
+            return 0;
+        }
+        return this.nodeDescriptors.compareTo(((BgpNodeLSIdentifier) o).nodeDescriptors);
+    }
 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixIPv4LSNlriVer4.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixIPv4LSNlriVer4.java
index 5610696..49cb74b 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixIPv4LSNlriVer4.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixIPv4LSNlriVer4.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.bgpio.protocol.linkstate;
 
-import java.util.LinkedList;
+import java.util.List;
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.bgpio.exceptions.BgpParseException;
@@ -188,7 +188,7 @@
     }
 
     @Override
-    public LinkedList<BgpValueType> getPrefixdescriptor() {
+    public List<BgpValueType> getPrefixdescriptor() {
         return this.bgpPrefixLSIdentifier.getPrefixdescriptor();
     }
 
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixLSIdentifier.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixLSIdentifier.java
index f6aaea6..d3beaae 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixLSIdentifier.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/BgpPrefixLSIdentifier.java
@@ -18,6 +18,8 @@
 
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -36,12 +38,12 @@
 /**
  * Provides Implementation of Local node descriptors and prefix descriptors.
  */
-public class BgpPrefixLSIdentifier {
+public class BgpPrefixLSIdentifier implements Comparable<Object> {
 
     protected static final Logger log = LoggerFactory.getLogger(BgpPrefixLSIdentifier.class);
     public static final int TYPE_AND_LEN = 4;
     private NodeDescriptors localNodeDescriptors;
-    private LinkedList<BgpValueType> prefixDescriptor;
+    private List<BgpValueType> prefixDescriptor;
 
     /**
      * Resets parameters.
@@ -57,7 +59,7 @@
      * @param localNodeDescriptors Local node descriptors
      * @param prefixDescriptor Prefix Descriptors
      */
-    public BgpPrefixLSIdentifier(NodeDescriptors localNodeDescriptors, LinkedList<BgpValueType> prefixDescriptor) {
+    public BgpPrefixLSIdentifier(NodeDescriptors localNodeDescriptors, List<BgpValueType> prefixDescriptor) {
         this.localNodeDescriptors = localNodeDescriptors;
         this.prefixDescriptor = prefixDescriptor;
     }
@@ -77,7 +79,7 @@
         localNodeDescriptors = parseLocalNodeDescriptors(cb, protocolId);
 
         //Parse Prefix descriptor
-        LinkedList<BgpValueType> prefixDescriptor = new LinkedList<>();
+        List<BgpValueType> prefixDescriptor = new LinkedList<>();
         prefixDescriptor = parsePrefixDescriptors(cb);
         return new BgpPrefixLSIdentifier(localNodeDescriptors, prefixDescriptor);
     }
@@ -92,7 +94,7 @@
      */
     public static NodeDescriptors parseLocalNodeDescriptors(ChannelBuffer cb, byte protocolId)
                                                                  throws BgpParseException {
-        ChannelBuffer tempBuf = cb;
+        ChannelBuffer tempBuf = cb.copy();
         short type = cb.readShort();
         short length = cb.readShort();
         if (cb.readableBytes() < length) {
@@ -119,7 +121,7 @@
      * @return list of prefix descriptors
      * @throws BgpParseException while parsing list of prefix descriptors
      */
-    public static LinkedList<BgpValueType> parsePrefixDescriptors(ChannelBuffer cb) throws BgpParseException {
+    public static List<BgpValueType> parsePrefixDescriptors(ChannelBuffer cb) throws BgpParseException {
         LinkedList<BgpValueType> prefixDescriptor = new LinkedList<>();
         BgpValueType tlv = null;
         boolean isIpReachInfo = false;
@@ -127,7 +129,7 @@
         int count = 0;
 
         while (cb.readableBytes() > 0) {
-            ChannelBuffer tempBuf = cb;
+            ChannelBuffer tempBuf = cb.copy();
             short type = cb.readShort();
             short length = cb.readShort();
             if (cb.readableBytes() < length) {
@@ -180,7 +182,7 @@
      *
      * @return Prefix descriptors
      */
-    public LinkedList<BgpValueType> getPrefixdescriptor() {
+    public List<BgpValueType> getPrefixdescriptor() {
         return this.prefixDescriptor;
     }
 
@@ -209,8 +211,12 @@
             } else {
                 while (objListIterator.hasNext() && isCommonSubTlv) {
                     BgpValueType subTlv = objListIterator.next();
-                    isCommonSubTlv = Objects.equals(prefixDescriptor.contains(subTlv),
-                            other.prefixDescriptor.contains(subTlv));
+                    if (prefixDescriptor.contains(subTlv) && other.prefixDescriptor.contains(subTlv)) {
+                        isCommonSubTlv = Objects.equals(prefixDescriptor.get(prefixDescriptor.indexOf(subTlv)),
+                                         other.prefixDescriptor.get(other.prefixDescriptor.indexOf(subTlv)));
+                    } else {
+                        isCommonSubTlv = false;
+                    }
                 }
                 return isCommonSubTlv && Objects.equals(this.localNodeDescriptors, other.localNodeDescriptors);
             }
@@ -225,4 +231,41 @@
                 .add("prefixDescriptor", prefixDescriptor)
                 .toString();
     }
+
+    @Override
+    public int compareTo(Object o) {
+        if (this.equals(o)) {
+            return 0;
+        }
+        int result = this.localNodeDescriptors.compareTo(((BgpPrefixLSIdentifier) o).localNodeDescriptors);
+        if (result != 0) {
+            return result;
+        } else {
+            int countOtherSubTlv = ((BgpPrefixLSIdentifier) o).prefixDescriptor.size();
+            int countObjSubTlv = prefixDescriptor.size();
+            if (countOtherSubTlv != countObjSubTlv) {
+                if (countOtherSubTlv > countObjSubTlv) {
+                    return 1;
+                } else {
+                    return -1;
+                }
+           }
+
+            ListIterator<BgpValueType> listIterator = prefixDescriptor.listIterator();
+            ListIterator<BgpValueType> listIteratorOther = ((BgpPrefixLSIdentifier) o).prefixDescriptor.listIterator();
+            while (listIterator.hasNext()) {
+                BgpValueType tlv = listIterator.next();
+                BgpValueType tlv1 = listIteratorOther.next();
+                if (prefixDescriptor.contains(tlv) && ((BgpPrefixLSIdentifier) o).prefixDescriptor.contains(tlv1)) {
+                    int res = prefixDescriptor.get(prefixDescriptor.indexOf(tlv)).compareTo(
+                            ((BgpPrefixLSIdentifier) o).prefixDescriptor
+                                    .get(((BgpPrefixLSIdentifier) o).prefixDescriptor.indexOf(tlv1)));
+                    if (res != 0) {
+                        return res;
+                    }
+                }
+            }
+        }
+        return 0;
+    }
 }
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/NodeDescriptors.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/NodeDescriptors.java
index 0581b70..7fb1b31 100644
--- a/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/NodeDescriptors.java
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/linkstate/NodeDescriptors.java
@@ -18,6 +18,8 @@
 
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -57,7 +59,7 @@
                    Figure : Local or Remote Node Descriptors TLV format
      */
 
-    protected static final Logger log = LoggerFactory.getLogger(NodeDescriptors.class);
+    private static final Logger log = LoggerFactory.getLogger(NodeDescriptors.class);
 
     public static final short LOCAL_NODE_DES_TYPE = 256;
     public static final short REMOTE_NODE_DES_TYPE = 257;
@@ -71,7 +73,7 @@
     public static final int ISISPSEUDONODE_LEN = 7;
     public static final int OSPFNONPSEUDONODE_LEN = 4;
     public static final int OSPFPSEUDONODE_LEN = 8;
-    private LinkedList<BgpValueType> subTlvs;
+    private List<BgpValueType> subTlvs;
     private short deslength;
     private short desType;
 
@@ -91,7 +93,7 @@
      * @param deslength Descriptors length
      * @param desType local node descriptor or remote node descriptor type
      */
-    public NodeDescriptors(LinkedList<BgpValueType> subTlvs, short deslength, short desType) {
+    public NodeDescriptors(List<BgpValueType> subTlvs, short deslength, short desType) {
         this.subTlvs = subTlvs;
         this.deslength = deslength;
         this.desType = desType;
@@ -102,7 +104,7 @@
      *
      * @return subTlvs list of subTlvs
      */
-    public LinkedList<BgpValueType> getSubTlvs() {
+    public List<BgpValueType> getSubTlvs() {
         return subTlvs;
     }
 
@@ -130,7 +132,12 @@
             } else {
                 while (objListIterator.hasNext() && isCommonSubTlv) {
                     BgpValueType subTlv = objListIterator.next();
-                    isCommonSubTlv = Objects.equals(subTlvs.contains(subTlv), other.subTlvs.contains(subTlv));
+                    if (subTlvs.contains(subTlv) && other.subTlvs.contains(subTlv)) {
+                        isCommonSubTlv = Objects.equals(subTlvs.get(subTlvs.indexOf(subTlv)),
+                                         other.subTlvs.get(other.subTlvs.indexOf(subTlv)));
+                    } else {
+                        isCommonSubTlv = false;
+                    }
                 }
                 return isCommonSubTlv;
             }
@@ -150,12 +157,12 @@
      */
     public static NodeDescriptors read(ChannelBuffer cb, short desLength, short desType, byte protocolId)
             throws BgpParseException {
-        LinkedList<BgpValueType> subTlvs;
-        subTlvs = new LinkedList<>();
+        log.debug("Read NodeDescriptor");
+        List<BgpValueType> subTlvs = new LinkedList<>();
         BgpValueType tlv = null;
 
         while (cb.readableBytes() > 0) {
-            ChannelBuffer tempBuf = cb;
+            ChannelBuffer tempBuf = cb.copy();
             short type = cb.readShort();
             short length = cb.readShort();
             if (cb.readableBytes() < length) {
@@ -222,4 +229,34 @@
                 .add("subTlvs", subTlvs)
                 .toString();
     }
+
+    public int compareTo(Object o) {
+        if (this.equals(o)) {
+            return 0;
+        }
+        ListIterator<BgpValueType> listIterator = subTlvs.listIterator();
+        ListIterator<BgpValueType> listIteratorOther = ((NodeDescriptors) o).subTlvs.listIterator();
+        int countOtherSubTlv = ((NodeDescriptors) o).subTlvs.size();
+        int countObjSubTlv = subTlvs.size();
+        if (countOtherSubTlv != countObjSubTlv) {
+             if (countOtherSubTlv > countObjSubTlv) {
+                 return 1;
+             } else {
+                 return -1;
+             }
+        } else {
+            while (listIterator.hasNext()) {
+            BgpValueType tlv = listIterator.next();
+                BgpValueType tlv1 = listIteratorOther.next();
+                if (subTlvs.contains(tlv) && ((NodeDescriptors) o).subTlvs.contains(tlv1)) {
+                    int result = subTlvs.get(subTlvs.indexOf(tlv)).compareTo(
+                            ((NodeDescriptors) o).subTlvs.get(((NodeDescriptors) o).subTlvs.indexOf(tlv1)));
+                    if (result != 0) {
+                        return result;
+                    }
+                }
+            }
+        }
+        return 0;
+    }
 }