TE Topoplogy subsystem I2RS API changes

This submission contains the following:

1. Major changes in apps/tetopology. The changes are mainly introduced
   to support new searching keys in TE Topology.

2. Add RESTCONF notification support in the TE Provider. i.e., for
   south-bound RESTCONF communication with the domain controller.

Change-Id: I6786959deb66c98626edc65ff52694dcf08981a3
diff --git a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/CommonLinkData.java b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/CommonLinkData.java
new file mode 100644
index 0000000..61dbe31
--- /dev/null
+++ b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/CommonLinkData.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright 2016 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.tetopology.management.api.link;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.onosproject.tetopology.management.api.EncodingType;
+import org.onosproject.tetopology.management.api.SwitchingType;
+import org.onosproject.tetopology.management.api.TeStatus;
+
+import java.util.BitSet;
+import java.util.List;
+
+/**
+ * Representation of link common attributes.
+ */
+public class CommonLinkData {
+    private final TeStatus adminStatus;
+    private final TeStatus opStatus;
+    private final BitSet flags;
+
+    private final SwitchingType switchingLayer;
+    private final EncodingType encodingLayer;
+
+    private final ExternalLink externalLink;
+    private final UnderlayPath underlayPath;
+    private final TePathAttributes teAttributes;
+    private final List<Long> interLayerLocks;
+    private final LinkBandwidth bandwidth;
+    private final Long adminGroup;
+
+    /**
+     * Creates an instance of CommonLinkData.
+     *
+     * @param adminStatus     the admin status
+     * @param opStatus        the operational Status
+     * @param flags           the flags
+     * @param switchingLayer  the network layer switching type
+     * @param encodingLayer   the network layer encoding type
+     * @param externalLink    the external link specific attributes
+     * @param underlayPath    the link underlay path and supporting tunnel
+     * @param teAttributes    the link path TE attributes
+     * @param adminGroup      the administrative group
+     * @param interLayerLocks the supported inter-layer locks
+     * @param bandwidth       the link maximum and available bandwidth at
+     *                        each priority level
+     */
+    public CommonLinkData(TeStatus adminStatus,
+                          TeStatus opStatus, BitSet flags, SwitchingType switchingLayer,
+                          EncodingType encodingLayer, ExternalLink externalLink,
+                          UnderlayPath underlayPath, TePathAttributes teAttributes,
+                          Long adminGroup, List<Long> interLayerLocks,
+                          LinkBandwidth bandwidth) {
+        this.adminStatus = adminStatus;
+        this.opStatus = opStatus;
+        this.flags = flags;
+        this.switchingLayer = switchingLayer;
+        this.encodingLayer = encodingLayer;
+        this.externalLink = externalLink;
+        this.underlayPath = underlayPath;
+        this.teAttributes = teAttributes;
+        this.adminGroup = adminGroup;
+        this.interLayerLocks = interLayerLocks != null ?
+                Lists.newArrayList(interLayerLocks) : null;
+        this.bandwidth = bandwidth;
+    }
+
+    /**
+     * Creates an instance of CommonLinkData with a TeLink.
+     *
+     * @param link the TE link
+     */
+    public CommonLinkData(TeLink link) {
+        this.adminStatus = link.adminStatus();
+        this.opStatus = link.opStatus();
+        this.flags = link.flags();
+        this.switchingLayer = link.switchingLayer();
+        this.encodingLayer = link.encodingLayer();
+        this.externalLink = link.externalLink();
+        this.underlayPath = new UnderlayPath(link);
+        this.teAttributes = new TePathAttributes(link);
+        this.adminGroup = link.administrativeGroup();
+        this.interLayerLocks = link.interLayerLocks() != null ?
+                Lists.newArrayList(link.interLayerLocks()) : null;
+        this.bandwidth = new LinkBandwidth(link);
+    }
+
+
+    /**
+     * Returns the admin status.
+     *
+     * @return the admin status
+     */
+    public TeStatus adminStatus() {
+        return adminStatus;
+    }
+
+    /**
+     * Returns the operational status.
+     *
+     * @return the optional status
+     */
+    public TeStatus opStatus() {
+        return opStatus;
+    }
+
+    /**
+     * Returns the flags.
+     *
+     * @return the flags
+     */
+    public BitSet flags() {
+        return flags;
+    }
+
+    /**
+     * Returns the network layer switching type for this link.
+     *
+     * @return the switching layer type
+     */
+    public SwitchingType switchingLayer() {
+        return switchingLayer;
+    }
+
+    /**
+     * Returns the network layer encoding type for this link.
+     *
+     * @return the encoding type
+     */
+    public EncodingType encodingLayer() {
+        return encodingLayer;
+    }
+
+    /**
+     * Returns the external link.
+     *
+     * @return the external link
+     */
+    public ExternalLink externalLink() {
+        return externalLink;
+    }
+
+    /**
+     * Returns the link underlay path and tunnel.
+     *
+     * @return the underlay path
+     */
+    public UnderlayPath underlayPath() {
+        return underlayPath;
+    }
+
+    /**
+     * Returns the path TE attributes.
+     *
+     * @return the path TE Attributes
+     */
+    public TePathAttributes teAttributes() {
+        return teAttributes;
+    }
+
+    /**
+     * Returns the link administrative group.
+     *
+     * @return the admin group
+     */
+    public Long adminGroup() {
+        return adminGroup;
+    }
+
+    /**
+     * Returns the supported inter-layer locks.
+     *
+     * @return the inter-layer locks
+     */
+    public List<Long> interLayerLocks() {
+        if (interLayerLocks == null) {
+            return null;
+        }
+        return ImmutableList.copyOf(interLayerLocks);
+    }
+
+    /**
+     * Returns the link maximum and available bandwidth at each priority level.
+     *
+     * @return the bandwidth
+     */
+    public LinkBandwidth bandwidth() {
+        return bandwidth;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(adminStatus, opStatus, flags, switchingLayer,
+                                encodingLayer, externalLink, underlayPath,
+                                teAttributes, interLayerLocks, bandwidth);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (object instanceof CommonLinkData) {
+            CommonLinkData that = (CommonLinkData) object;
+            return Objects.equal(adminStatus, that.adminStatus) &&
+                    Objects.equal(opStatus, that.opStatus) &&
+                    Objects.equal(flags, that.flags) &&
+                    Objects.equal(switchingLayer, that.switchingLayer) &&
+                    Objects.equal(encodingLayer, that.encodingLayer) &&
+                    Objects.equal(externalLink, that.externalLink) &&
+                    Objects.equal(underlayPath, that.underlayPath) &&
+                    Objects.equal(teAttributes, that.teAttributes) &&
+                    Objects.equal(interLayerLocks, that.interLayerLocks) &&
+                    Objects.equal(bandwidth, that.bandwidth);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("adminStatus", adminStatus)
+                .add("opStatus", opStatus)
+                .add("flags", flags)
+                .add("switchingLayer", switchingLayer)
+                .add("encodingLayer", encodingLayer)
+                .add("externalLink", externalLink)
+                .add("underlayPath", underlayPath)
+                .add("teAttributes", teAttributes)
+                .add("interLayerLocks", interLayerLocks)
+                .add("bandwidth", bandwidth)
+                .toString();
+    }
+
+}