BGP device id string.

Change-Id: Ie108dd2dce9b854ab3f0e42550cfaf23a9395ad6
diff --git a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java
index ed04dc9..19a9908 100755
--- a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java
+++ b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java
@@ -17,15 +17,27 @@
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.List;
+import java.util.ListIterator;
 
 import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.protocol.linkstate.BgpLinkLsNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSIdentifier;
 import org.onosproject.bgpio.protocol.linkstate.BgpNodeLSNlriVer4;
+import org.onosproject.bgpio.protocol.linkstate.NodeDescriptors;
+import org.onosproject.bgpio.types.AreaIDTlv;
+import org.onosproject.bgpio.types.AutonomousSystemTlv;
+import org.onosproject.bgpio.types.BgpLSIdentifierTlv;
+import org.onosproject.bgpio.types.BgpValueType;
+import org.onosproject.bgpio.types.IsIsNonPseudonode;
+import org.onosproject.bgpio.types.IsIsPseudonode;
+import org.onosproject.bgpio.types.OspfNonPseudonode;
+import org.onosproject.bgpio.types.OspfPseudonode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * The class representing a network  bgp device id. This class is immutable.
+ * The class representing a network bgp device id.
  */
 public final class BgpDpid {
     private static final Logger log = LoggerFactory.getLogger(BgpDpid.class);
@@ -43,15 +55,22 @@
      * @param nodeDescriptorType node descriptor type, local/remote
      */
     public BgpDpid(final BgpLinkLsNlriVer4 linkNlri, int nodeDescriptorType) {
-        this.stringBuilder = new StringBuilder("bgpls://");
+        this.stringBuilder = new StringBuilder("");
 
         if (linkNlri.getRouteDistinguisher() != null) {
-            this.stringBuilder.append(linkNlri.getRouteDistinguisher().getRouteDistinguisher()).append(':');
+            this.stringBuilder.append("RD=").append(linkNlri.getRouteDistinguisher()
+                                            .getRouteDistinguisher()).append(":");
         }
 
         try {
-            this.stringBuilder.append(linkNlri.getProtocolId()).append(':').append(linkNlri.getIdentifier())
-            .append('/');
+            if ((linkNlri.getProtocolId() == BgpNodeLSNlriVer4.ProtocolType.ISIS_LEVEL_ONE)
+                || (linkNlri.getProtocolId() == BgpNodeLSNlriVer4.ProtocolType.ISIS_LEVEL_TWO)) {
+                this.stringBuilder.append("PROTO=").append("ISIS").append(":ID=")
+                                                                               .append(linkNlri.getIdentifier());
+            } else {
+                this.stringBuilder.append("PROTO=").append(linkNlri.getProtocolId()).append(":ID=")
+                                                                               .append(linkNlri.getIdentifier());
+            }
 
             if (nodeDescriptorType == NODE_DESCRIPTOR_LOCAL) {
                 add(linkNlri.localNodeDescriptors());
@@ -64,23 +83,43 @@
 
     }
 
+    /*
+     * Get iso node ID in specified string format.
+     */
+    private String isoNodeIdString(byte[] isoNodeId) {
+        if (isoNodeId != null) {
+            int p1 = (int) isoNodeId[0] << 8 | (int) isoNodeId[1];
+            int p2 = (int) isoNodeId[2] << 8 | (int) isoNodeId[3];
+            int p3 = (int) isoNodeId[4] << 8 | (int) isoNodeId[5];
+
+            return String.format("%1$d.%2$d.%3$d", p1, p2, p3);
+        }
+        return null;
+    }
+
     /**
      * Initialize bgp id to generate URI.
      *
      * @param nodeNlri node Nlri.
      */
     public BgpDpid(final BgpNodeLSNlriVer4 nodeNlri) {
-        this.stringBuilder = new StringBuilder("bgpls://");
+        this.stringBuilder = new StringBuilder("");
 
         if (nodeNlri.getRouteDistinguisher() != null) {
-            this.stringBuilder.append(nodeNlri.getRouteDistinguisher().getRouteDistinguisher()).append(':');
+            this.stringBuilder.append("RD=").append(nodeNlri.getRouteDistinguisher()
+                                            .getRouteDistinguisher()).append(":");
         }
 
         try {
+            if ((nodeNlri.getProtocolId() == BgpNodeLSNlriVer4.ProtocolType.ISIS_LEVEL_ONE)
+                || (nodeNlri.getProtocolId() == BgpNodeLSNlriVer4.ProtocolType.ISIS_LEVEL_TWO)) {
 
-            this.stringBuilder.append(nodeNlri.getProtocolId()).append(':').append(nodeNlri.getIdentifier())
-            .append('/');
-
+                this.stringBuilder.append("PROTO=").append("ISIS").append(":ID=")
+                                                                               .append(nodeNlri.getIdentifier());
+            } else {
+                this.stringBuilder.append("PROTO=").append(nodeNlri.getProtocolId()).append(":ID=")
+                                                                               .append(nodeNlri.getIdentifier());
+            }
             add(nodeNlri.getLocalNodeDescriptors());
 
         } catch (BgpParseException e) {
@@ -89,8 +128,45 @@
     }
 
     BgpDpid add(final Object value) {
-        if (value != null) {
-            this.stringBuilder.append('&').append('=').append(value.toString());
+      NodeDescriptors nodeDescriptors = null;
+        if (value instanceof  BgpNodeLSIdentifier) {
+            BgpNodeLSIdentifier nodeLsIdentifier = (BgpNodeLSIdentifier) value;
+            nodeDescriptors = nodeLsIdentifier.getNodedescriptors();
+        } else if (value instanceof  NodeDescriptors) {
+            nodeDescriptors = (NodeDescriptors) value;
+        }
+
+        if (nodeDescriptors != null) {
+            List<BgpValueType> subTlvs = nodeDescriptors.getSubTlvs();
+            ListIterator<BgpValueType> listIterator = subTlvs.listIterator();
+            while (listIterator.hasNext()) {
+                BgpValueType tlv = listIterator.next();
+                if (tlv.getType() == AutonomousSystemTlv.TYPE) {
+                    AutonomousSystemTlv autonomousSystem = (AutonomousSystemTlv) tlv;
+                    this.stringBuilder.append(":AS=").append(autonomousSystem.getAsNum());
+                } else if (tlv.getType() == BgpLSIdentifierTlv.TYPE) {
+                    BgpLSIdentifierTlv lsIdentifierTlv = (BgpLSIdentifierTlv) tlv;
+                    this.stringBuilder.append(":LSID=").append(lsIdentifierTlv.getBgpLsIdentifier());
+                } else if (tlv.getType() ==  AreaIDTlv.TYPE) {
+                    AreaIDTlv areaIdTlv = (AreaIDTlv) tlv;
+                    this.stringBuilder.append(":AREA=").append(areaIdTlv.getAreaID());
+                } else if (tlv.getType() == NodeDescriptors.IGP_ROUTERID_TYPE) {
+                    if (tlv instanceof IsIsNonPseudonode) {
+                        IsIsNonPseudonode isisNonPseudonode = (IsIsNonPseudonode) tlv;
+                        this.stringBuilder.append(":ISOID=").append(isoNodeIdString(isisNonPseudonode.getIsoNodeId()));
+                    } else if (tlv instanceof IsIsPseudonode) {
+                        IsIsPseudonode isisPseudonode = (IsIsPseudonode) tlv;
+                        this.stringBuilder.append(":ISOID=").append(isoNodeIdString(isisPseudonode.getIsoNodeId()));
+                        this.stringBuilder.append(":PSN=").append(isisPseudonode.getPsnIdentifier());
+                    } else if (tlv instanceof OspfNonPseudonode) {
+                        OspfNonPseudonode ospfNonPseudonode = (OspfNonPseudonode) tlv;
+                        this.stringBuilder.append(":RID=").append(ospfNonPseudonode.getrouterID());
+                    } else if (tlv instanceof OspfPseudonode) {
+                        OspfPseudonode ospfPseudonode = (OspfPseudonode) tlv;
+                        this.stringBuilder.append(":RID=").append(ospfPseudonode.getrouterID());
+                    }
+                }
+            }
         }
         return this;
     }
diff --git a/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java
index 9f23d32..7a810ee 100755
--- a/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java
+++ b/providers/bgp/topology/src/test/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProviderTest.java
@@ -56,14 +56,11 @@
 public class BgpTopologyProviderTest {
 
     private static final DeviceId DID1 = DeviceId
-            .deviceId("bgp:bgpls://0:direct:0/&=bgpnodelsidentifier%7bnodedescriptors=nodedescriptors%7bdestype=512,"
-                    + "%20deslength=4,%20subtlvs=[autonomoussystemtlv%7btype=512,%20length=4,%20asnum=100%7d]%7d%7d");
+            .deviceId("bgp:rd=0:proto=direct:id=0:as=100");
     private static final DeviceId DID2 = DeviceId
-            .deviceId("bgp:bgpls://0:direct:0/&=bgpnodelsidentifier%7bnodedescriptors=nodedescriptors%7bdestype=512,"
-                    + "%20deslength=4,%20subtlvs=[autonomoussystemtlv%7btype=512,%20length=4,%20asnum=10%7d]%7d%7d");
+            .deviceId("bgp:rd=0:proto=direct:id=0:as=10");
     private static final DeviceId DID3 = DeviceId
-            .deviceId("bgp:bgpls://direct:0/&=nodedescriptors%7bdestype=512,%20deslength=4,"
-                    + "%20subtlvs=[autonomoussystemtlv%7btype=512,%20length=4,%20asnum=100%7d]%7d");
+            .deviceId("bgp:rd=0:proto=direct:id=0:as=100");
     private final BgpTopologyProvider provider = new BgpTopologyProvider();
     private final TestDeviceRegistry nodeRegistry = new TestDeviceRegistry();
     private final TestController controller = new TestController();