ONOS-4083, ONOS-4084, ONOS-4096, ONOS-4097:ISIS PDU Data Structures

Change-Id: I22d30e8f7ba7d414e75254fdec6d0865bf471ff9
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/HelloPdu.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/HelloPdu.java
new file mode 100644
index 0000000..6ce37c8
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/HelloPdu.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2016-present 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.isis.io.isispacket.pdu;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisInterfaceState;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.AdjacencyStateTlv;
+import org.onosproject.isis.io.isispacket.tlv.AreaAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.IpInterfaceAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisNeighborTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of ISIS hello PDU.
+ */
+public abstract class HelloPdu extends IsisHeader {
+
+    protected List<IsisTlv> variableLengths = new ArrayList<>();
+    private byte circuitType;
+    private String sourceId;
+    private int holdingTime;
+    private int pduLength;
+
+    public void addTlv(IsisTlv isisTlv) {
+        variableLengths.add(isisTlv);
+    }
+
+    /**
+     * Returns the variable lengths.
+     *
+     * @return variable lengths
+     */
+    public List<IsisTlv> tlvs() {
+        return variableLengths;
+    }
+
+    /**
+     * Returns the list of area addresses.
+     *
+     * @return areaAddresses area addresses
+     */
+    public List<String> areaAddress() {
+        List<String> areaAddresses = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof AreaAddressTlv) {
+                areaAddresses = ((AreaAddressTlv) tlv).areaAddress();
+            }
+        }
+        return areaAddresses;
+    }
+
+    /**
+     * Returns the list of interface IP addresses.
+     *
+     * @return interfaceIpAddresses list of interface IP addresses
+     */
+    public List<Ip4Address> interfaceIpAddresses() {
+        List<Ip4Address> interfaceIpAddresses = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof IpInterfaceAddressTlv) {
+                interfaceIpAddresses = ((IpInterfaceAddressTlv) tlv).interfaceAddress();
+            }
+        }
+        return interfaceIpAddresses;
+    }
+
+    /**
+     * Returns the list of neighbor list.
+     *
+     * @return macAddresses list of neighbor MAC address
+     */
+    public List<MacAddress> neighborList() {
+        List<MacAddress> macAddresses = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof IsisNeighborTlv) {
+                macAddresses = ((IsisNeighborTlv) tlv).neighbor();
+            }
+        }
+        return macAddresses;
+    }
+
+    /**
+     * Returns the adjacency state.
+     *
+     * @return interfaceState adjacency state
+     */
+    public IsisInterfaceState adjacencyState() {
+        IsisInterfaceState interfaceState = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof AdjacencyStateTlv) {
+                interfaceState = IsisInterfaceState.get(((AdjacencyStateTlv) tlv).adjacencyType());
+                break;
+            }
+        }
+        return interfaceState;
+    }
+
+    /**
+     * Returns the source ID.
+     *
+     * @return sourceId source ID
+     */
+    public String sourceId() {
+        return sourceId;
+    }
+
+    /**
+     * Sets source ID.
+     *
+     * @param sourceId source ID
+     */
+    public void setSourceId(String sourceId) {
+        this.sourceId = sourceId;
+    }
+
+    /**
+     * Returns the PDU length.
+     *
+     * @return pduLength PDU length
+     */
+    public int pduLength() {
+        return pduLength;
+    }
+
+    /**
+     * Sets the PDU length.
+     *
+     * @param pduLength PDU lenght
+     */
+    public void setPduLength(int pduLength) {
+        this.pduLength = pduLength;
+    }
+
+    /**
+     * Returns the holding time.
+     *
+     * @return holdingTime holding time
+     */
+    public int holdingTime() {
+        return holdingTime;
+    }
+
+    /**
+     * Sets the holding time.
+     *
+     * @param holdingTime holding time
+     */
+    public void setHoldingTime(int holdingTime) {
+        this.holdingTime = holdingTime;
+    }
+
+    /**
+     * Returns the circuit type.
+     *
+     * @return circuitType circuit type
+     */
+    public byte circuitType() {
+        return circuitType;
+    }
+
+    /**
+     * Sets the circuit type.
+     *
+     * @param circuitType circuit type
+     */
+    public void setCircuitType(byte circuitType) {
+        this.circuitType = circuitType;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("circuitType", circuitType)
+                .add("sourceId", sourceId)
+                .add("holdingTime", holdingTime)
+                .add("pduLength", pduLength)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        HelloPdu that = (HelloPdu) o;
+        return Objects.equal(circuitType, that.circuitType) &&
+                Objects.equal(sourceId, that.sourceId) &&
+                Objects.equal(holdingTime, that.holdingTime) &&
+                Objects.equal(pduLength, that.pduLength);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(circuitType, sourceId, holdingTime, pduLength);
+    }
+}
\ No newline at end of file