ONOS-4919: Implement RESTCONF client

Adding code to support RESTCONF protocol as one of
the supported SBI protocols of ONOS. This RESTCONF SBI extends
the current REST SBI protocl and adds some new APIs/functinalities
so that a provider can subscribe/register to an external restconf
server to receive notification stream.

Change-Id: I21bf0d0f0394cf788e066d743b3ade04735fe07e
diff --git a/protocols/restconf/client/api/BUCK b/protocols/restconf/client/api/BUCK
new file mode 100644
index 0000000..c1f3e2c
--- /dev/null
+++ b/protocols/restconf/client/api/BUCK
@@ -0,0 +1,10 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//incubator/api:onos-incubator-api',
+    '//utils/rest:onlab-rest',
+    '//protocols/rest/api:onos-protocols-rest-api',
+]
+
+osgi_jar_with_tests (
+    deps = COMPILE_DEPS,
+)
diff --git a/protocols/restconf/client/api/pom.xml b/protocols/restconf/client/api/pom.xml
new file mode 100644
index 0000000..5925337
--- /dev/null
+++ b/protocols/restconf/client/api/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.onosproject</groupId>
+    <artifactId>onos-restconf-client</artifactId>
+    <version>1.8.0-SNAPSHOT</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+  <artifactId>onos-restconf-client-api</artifactId>
+  <packaging>bundle</packaging>
+  <description>ONOS RESTCONF southbound plugin API</description>
+  <dependencies>
+      <dependency>
+          <groupId>org.onosproject</groupId>
+          <artifactId>onos-restsb-api</artifactId>
+          <version>${project.version}</version>
+          <type>bundle</type>
+      </dependency>
+  </dependencies>
+</project>
diff --git a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java
new file mode 100644
index 0000000..dc49a72
--- /dev/null
+++ b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java
@@ -0,0 +1,35 @@
+/*
+ * 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.protocol.restconf;
+
+import org.onosproject.net.DeviceId;
+
+/**
+ * Notifies providers about incoming RESTCONF notification events.
+ */
+public interface RestConfNotificationEventListener {
+
+    /**
+     * Handles the notification event.
+     *
+     * @param <T>
+     *
+     * @param deviceId of the restconf device
+     * @param eventJsonString the json string representation of the event
+     */
+    <T> void handleNotificationEvent(DeviceId deviceId, T eventJsonString);
+
+}
diff --git a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java
new file mode 100644
index 0000000..772aaea
--- /dev/null
+++ b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java
@@ -0,0 +1,59 @@
+/*
+ * 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.protocol.restconf;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.protocol.http.HttpSBController;
+
+/**
+ * Abstraction of a RESTCONF controller. Serves as a one stop shop for obtaining
+ * RESTCONF southbound devices and (un)register listeners.
+ */
+public interface RestConfSBController extends HttpSBController {
+
+    /**
+     * This method is to be called by whoever is interested to receive
+     * Notifications from a specific device. It does a REST GET request
+     * with specified parameters to the device, and calls the provided
+     * callBackListener upon receiving notifications to notify the requester
+     * about notifications.
+     *
+     *
+     * @param device device to make the request to
+     * @param request url of the request
+     * @param mediaType format to retrieve the content in
+     * @param callBackListener method to call when notifications arrives
+     */
+    void enableNotifications(DeviceId device, String request, String mediaType,
+                          RestConfNotificationEventListener callBackListener);
+
+    /**
+     * Register a listener for notification events that occur to restconf
+     * devices.
+     *
+     * @param deviceId the deviceId
+     * @param listener the listener to notify
+     */
+    void addNotificationListener(DeviceId deviceId,
+                                 RestConfNotificationEventListener listener);
+
+    /**
+     * Unregister the listener for the device.
+     *
+     * @param deviceId the deviceId
+     */
+    void removeNotificationListener(DeviceId deviceId);
+}
diff --git a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/package-info.java b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/package-info.java
new file mode 100644
index 0000000..15f2308
--- /dev/null
+++ b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * RESTCONF southbound protocols libraries.
+ */
+package org.onosproject.protocol.restconf;