Application manages the IP layer topology information - Interfaces

Change-Id: Ie1dea035674ee98583e98a82cca7e33ab0858b92
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/LinkTed.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/LinkTed.java
new file mode 100644
index 0000000..3a68603
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/LinkTed.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+import org.onlab.util.Bandwidth;
+
+/**
+ * Represents Link Traffic engineering parameters.
+ */
+public class LinkTed {
+    private final Bandwidth maximumLink;
+    private final Bandwidth maxReserved;
+    private final List<Bandwidth> maxUnResBandwidth;
+    private final Metric teMetric;
+    private final Metric igpMetric;
+    private final List<Ip4Address> ipv4LocRouterId;
+    private final List<Ip6Address> ipv6LocRouterId;
+    private final List<Ip4Address> ipv4RemRouterId;
+    private final List<Ip6Address> ipv6RemRouterId;
+    private final Color color;
+    private final Signalling signalType;
+    private final List<Srlg> srlgGroup;
+    private final ProtectionType protectType;
+
+    /**
+     * Constructor to initialize its parameter.
+     *
+     * @param maximumLink maximum bandwidth can be used
+     * @param maxReserved max bandwidth that can be reserved
+     * @param maxUnResBandwidth amount of bandwidth reservable
+     * @param teMetric Traffic engineering metric
+     * @param igpMetric IGP metric
+     * @param color information on administrative group assigned to the interface
+     * @param signalType MPLS signaling protocols
+     * @param srlgGroup Shared Risk Link Group information
+     * @param protectType protection capabilities of the link
+     * @param ipv4LocRouterId IPv4 router-Id of local node
+     * @param ipv6LocRouterId IPv6 router-Id of local node
+     * @param ipv4RemRouterId IPv4 router-Id of remote node
+     * @param ipv6RemRouterId IPv6 router-Id of remote node
+     */
+    public LinkTed(Bandwidth maximumLink, Bandwidth maxReserved, List<Bandwidth> maxUnResBandwidth,
+                   Metric teMetric, Metric igpMetric, Color color, Signalling signalType, List<Srlg> srlgGroup,
+                   ProtectionType protectType, List<Ip4Address> ipv4LocRouterId, List<Ip6Address> ipv6LocRouterId,
+                   List<Ip4Address> ipv4RemRouterId, List<Ip6Address> ipv6RemRouterId) {
+        this.maximumLink = maximumLink;
+        this.maxReserved = maxReserved;
+        this.maxUnResBandwidth = maxUnResBandwidth;
+        this.teMetric = teMetric;
+        this.igpMetric = igpMetric;
+        this.color = color;
+        this.signalType = signalType;
+        this.srlgGroup = srlgGroup;
+        this.protectType = protectType;
+        this.ipv4LocRouterId = ipv4LocRouterId;
+        this.ipv6LocRouterId = ipv6LocRouterId;
+        this.ipv4RemRouterId = ipv4RemRouterId;
+        this.ipv6RemRouterId = ipv6RemRouterId;
+    }
+
+    /**
+     * Provides maximum bandwidth can be used on the link.
+     *
+     * @return maximum bandwidth
+     */
+    public Bandwidth maximumLink() {
+        return maximumLink;
+    }
+
+    /**
+     * Amount of bandwidth reservable on the link.
+     *
+     * @return unreserved bandwidth
+     */
+    public List<Bandwidth> maxUnResBandwidth() {
+        return maxUnResBandwidth;
+    }
+
+    /**
+     * Provides max bandwidth that can be reserved on the link.
+     *
+     * @return max bandwidth reserved
+     */
+    public Bandwidth maxReserved() {
+        return maxReserved;
+    }
+
+    /**
+     * Provides Traffic engineering metric for the link.
+     *
+     * @return Traffic engineering metric
+     */
+    public Metric teMetric() {
+        return teMetric;
+    }
+
+    /**
+     * Provides IGP metric for the link.
+     *
+     * @return IGP metric
+     */
+    public Metric igpMetric() {
+        return igpMetric;
+    }
+
+    /**
+     * Provides protection capabilities of the link.
+     *
+     * @return link protection type
+     */
+    public ProtectionType protectType() {
+        return protectType;
+    }
+
+    /**
+     * Provides Shared Risk Link Group information.
+     *
+     * @return Shared Risk Link Group value
+     */
+    public List<Srlg> srlgGroup() {
+        return srlgGroup;
+    }
+
+    /**
+     * Provides which MPLS signaling protocols are enabled.
+     *
+     * @return signal type
+     */
+    public Signalling signalType() {
+        return signalType;
+    }
+
+    /**
+     * Provides information on administrative group assigned to the interface.
+     *
+     * @return 4-octect bit mask assigned by network administrator
+     */
+    public Color color() {
+        return color;
+    }
+
+    /**
+     * Provides IPv4 router-Id of local node.
+     *
+     * @return IPv4 router-Id of local node
+     */
+    public List<Ip4Address> ipv4LocRouterId() {
+        return ipv4LocRouterId;
+    }
+
+    /**
+     * Provides IPv6 router-Id of local node.
+     *
+     * @return IPv6 router-Id of local node
+     */
+    public List<Ip6Address> ipv6LocRouterId() {
+        return ipv6LocRouterId;
+    }
+
+    /**
+     * Provides IPv4 router-Id of remote node.
+     *
+     * @return IPv4 router-Id of remote node
+     */
+    public List<Ip4Address> ipv4RemRouterId() {
+        return ipv4RemRouterId;
+    }
+
+    /**
+     * Provides IPv6 router-Id of remote node.
+     *
+     * @return IPv6 router-Id of remote node
+     */
+    public List<Ip6Address> ipv6RemRouterId() {
+        return ipv6RemRouterId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(maximumLink, maxReserved, maxUnResBandwidth, teMetric, igpMetric,
+                ipv4LocRouterId, ipv6LocRouterId, ipv4RemRouterId, ipv6RemRouterId,
+                color, signalType, srlgGroup, protectType);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof LinkTed) {
+            int countCommonBandwidth = 0;
+            int countOtherCommonBandwidth = 0;
+            int countOther4LocRouterId = 0;
+            int countCommon4LocRouterId = 0;
+            int countOther6RemRouterId = 0;
+            int countCommon6RemRouterId = 0;
+            int countOther4RemRouterId = 0;
+            int countCommon4RemRouterId = 0;
+            int countCommon6LocRouterId = 0;
+            int countOther6LocRouterId = 0;
+            int countCommonSrlg = 0;
+            int countOtherSrlg = 0;
+            boolean isCommonBandwidth = true;
+            boolean isCommonIp4Loc = true;
+            boolean isCommonIp4Rem = true;
+            boolean isCommonIp6Loc = true;
+            boolean isCommonIp6Rem = true;
+            boolean isCommonSrlg = true;
+            LinkTed other = (LinkTed) obj;
+            Iterator<Bandwidth> objListIterator = other.maxUnResBandwidth.iterator();
+            countOtherCommonBandwidth = other.maxUnResBandwidth.size();
+            countCommonBandwidth = maxUnResBandwidth.size();
+
+            Iterator<Ip4Address> ipv4local = other.ipv4LocRouterId.iterator();
+            countOther4LocRouterId = other.ipv4LocRouterId.size();
+            countCommon4LocRouterId = ipv4LocRouterId.size();
+
+            Iterator<Ip4Address> ipv4remote = other.ipv4RemRouterId.iterator();
+            countOther4RemRouterId = other.ipv4RemRouterId.size();
+            countCommon4RemRouterId = ipv4RemRouterId.size();
+
+            Iterator<Ip6Address> ipv6local = other.ipv6LocRouterId.iterator();
+            countOther6LocRouterId = other.ipv6LocRouterId.size();
+            countCommon6LocRouterId = ipv6LocRouterId.size();
+
+            Iterator<Ip6Address> ipv6remote = other.ipv6RemRouterId.iterator();
+            countOther6RemRouterId = other.ipv6RemRouterId.size();
+            countCommon6RemRouterId = ipv6RemRouterId.size();
+
+            Iterator<Srlg> srlg = other.srlgGroup.iterator();
+            countOtherSrlg = other.srlgGroup.size();
+            countCommonSrlg = srlgGroup.size();
+
+            if (countOtherCommonBandwidth != countCommonBandwidth
+                    || countOther4LocRouterId != countCommon4LocRouterId
+                    || countOther4RemRouterId != countCommon4RemRouterId
+                    || countOther6LocRouterId != countCommon6LocRouterId
+                    || countOther6RemRouterId != countCommon6RemRouterId
+                    || countOtherSrlg != countCommonSrlg) {
+                return false;
+            } else {
+                while (objListIterator.hasNext() && isCommonBandwidth) {
+                    Bandwidth subTlv = objListIterator.next();
+                    if (maxUnResBandwidth.contains(subTlv) && other.maxUnResBandwidth.contains(subTlv)) {
+                        isCommonBandwidth = Objects.equals(maxUnResBandwidth.get(maxUnResBandwidth.indexOf(subTlv)),
+                                other.maxUnResBandwidth.get(other.maxUnResBandwidth.indexOf(subTlv)));
+                    } else {
+                        isCommonBandwidth = false;
+                    }
+                }
+                while (ipv4local.hasNext() && isCommonIp4Loc) {
+                    Ip4Address subTlv = ipv4local.next();
+                    if (ipv4LocRouterId.contains(subTlv) && other.ipv4LocRouterId.contains(subTlv)) {
+                        isCommonIp4Loc = Objects.equals(ipv4LocRouterId.get(ipv4LocRouterId.indexOf(subTlv)),
+                                other.ipv4LocRouterId.get(other.ipv4LocRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp4Loc = false;
+                    }
+                }
+                while (ipv4remote.hasNext() && isCommonIp4Rem) {
+                    Ip4Address subTlv = ipv4remote.next();
+                    if (ipv4RemRouterId.contains(subTlv) && other.ipv4RemRouterId.contains(subTlv)) {
+                        isCommonIp4Rem = Objects.equals(ipv4RemRouterId.get(ipv4RemRouterId.indexOf(subTlv)),
+                                other.ipv4RemRouterId.get(other.ipv4RemRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp4Rem = false;
+                    }
+                }
+                while (ipv6remote.hasNext() && isCommonIp6Rem) {
+                    Ip6Address subTlv = ipv6remote.next();
+                    if (ipv6RemRouterId.contains(subTlv) && other.ipv6RemRouterId.contains(subTlv)) {
+                        isCommonIp6Rem = Objects.equals(ipv6RemRouterId.get(ipv6RemRouterId.indexOf(subTlv)),
+                                other.ipv6RemRouterId.get(other.ipv6RemRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp6Rem = false;
+                    }
+                }
+                while (ipv6local.hasNext() && isCommonIp6Loc) {
+                    Ip6Address subTlv = ipv6local.next();
+                    if (ipv6LocRouterId.contains(subTlv) && other.ipv6LocRouterId.contains(subTlv)) {
+                        isCommonIp6Loc = Objects.equals(ipv6LocRouterId.get(ipv6LocRouterId.indexOf(subTlv)),
+                                other.ipv6LocRouterId.get(other.ipv6LocRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp6Loc = false;
+                    }
+                }
+                while (srlg.hasNext() && isCommonIp6Loc) {
+                    Srlg subTlv = srlg.next();
+                    if (srlgGroup.contains(subTlv) && other.srlgGroup.contains(subTlv)) {
+                        isCommonSrlg = Objects.equals(srlgGroup.get(srlgGroup.indexOf(subTlv)),
+                                other.srlgGroup.get(other.srlgGroup.indexOf(subTlv)));
+                    } else {
+                        isCommonSrlg = false;
+                    }
+                }
+                return isCommonBandwidth && isCommonIp4Loc && isCommonIp4Rem && isCommonIp6Rem && isCommonIp6Loc
+                        && isCommonSrlg
+                        && Objects.equals(igpMetric, other.igpMetric)
+                        && Objects.equals(teMetric, other.teMetric)
+                        && Objects.equals(maximumLink, other.maximumLink)
+                        && Objects.equals(protectType, other.protectType)
+                        && Objects.equals(color, other.color)
+                        && Objects.equals(signalType, other.signalType);
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("igpMetric", igpMetric)
+                .add("teMetric", teMetric)
+                .add("maximumLink", maximumLink)
+                .add("maxReserved", maxReserved)
+                .add("maxUnResBandwidth", maxUnResBandwidth)
+                .add("ipv4LocRouterId", ipv4LocRouterId)
+                .add("ipv4RemRouterId", ipv4RemRouterId)
+                .add("ipv6LocRouterId", ipv6LocRouterId)
+                .add("ipv6RemRouterId", ipv6RemRouterId)
+                .add("protectType", protectType)
+                .add("color", color)
+                .add("srlgGroup", srlgGroup)
+                .add("signalType", signalType)
+                .toString();
+    }
+}
\ No newline at end of file