Added one more Component Config REST API; for specified component and variable.

Change-Id: I810aa90636c55c8b05c146780ad28c307cefff33
diff --git a/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java b/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java
index d93cd91..b167297 100644
--- a/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java
+++ b/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java
@@ -81,5 +81,14 @@
      */
     void unsetProperty(String componentName, String name);
 
+    /**
+     * Returns configuration property of the named components.
+     *
+     * @param componentName component name
+     * @param attribute component attribute
+     * @return configuration property
+     */
+    ConfigProperty getProperty(String componentName, String attribute);
+
 }
 
diff --git a/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java b/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java
index e0e2acc..97fa037 100644
--- a/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java
+++ b/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java
@@ -57,4 +57,9 @@
     public void unsetProperty(String componentName, String name) {
 
     }
+
+    @Override
+    public ConfigProperty getProperty(String componentName, String attribute) {
+        return null;
+    }
 }
diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
index 21a54b3..b6e6a0f 100644
--- a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
+++ b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
@@ -195,6 +195,19 @@
         store.unsetProperty(componentName, name);
     }
 
+    @Override
+    public ConfigProperty getProperty(String componentName, String attribute) {
+        checkPermission(CONFIG_READ);
+
+        Map<String, ConfigProperty> map = properties.get(componentName);
+        if (map != null) {
+            return map.get(attribute);
+        } else {
+            log.error("Attribute {} not present in component {}", attribute, componentName);
+            return null;
+        }
+    }
+
     private class InternalStoreDelegate implements ComponentConfigStoreDelegate {
 
         @Override
diff --git a/core/store/dist/src/test/java/org/onosproject/store/intent/impl/GossipIntentStoreTest.java b/core/store/dist/src/test/java/org/onosproject/store/intent/impl/GossipIntentStoreTest.java
index 54f361e..149e64b 100644
--- a/core/store/dist/src/test/java/org/onosproject/store/intent/impl/GossipIntentStoreTest.java
+++ b/core/store/dist/src/test/java/org/onosproject/store/intent/impl/GossipIntentStoreTest.java
@@ -276,5 +276,10 @@
         public void unsetProperty(String componentName, String name) {
 
         }
+
+        @Override
+        public ConfigProperty getProperty(String componentName, String attribute) {
+            return null;
+        }
     }
 }
diff --git a/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java b/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java
index 011de5a..2b6021c 100644
--- a/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java
+++ b/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java
@@ -273,5 +273,10 @@
         public void unsetProperty(String componentName, String name) {
             STRING_MAP2.remove(componentName + "#" + name);
         }
+
+        @Override
+        public ConfigProperty getProperty(String componentName, String attribute) {
+            return null;
+        }
     }
 }
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/ComponentConfigWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/ComponentConfigWebResource.java
index 9d3bcca..bf0449c 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/ComponentConfigWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/ComponentConfigWebResource.java
@@ -156,4 +156,34 @@
         props.fieldNames().forEachRemaining(k -> service.unsetProperty(component, k));
         return Response.noContent().build();
     }
+
+    /**
+     * Gets specified value of a specified component and variable.
+     *
+     * @param component component name
+     * @param attribute  attribute name
+     * @return 200 OK with a collection of component configurations
+     */
+    @GET
+    @Path("{component}/{attribute}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getComponentConfig(@PathParam("component") String component,
+                                            @PathParam("attribute") String attribute) {
+        ComponentConfigService service = get(ComponentConfigService.class);
+        ObjectNode root = mapper().createObjectNode();
+        encodeConfigs(component, attribute,
+                nullIsNotFound(service.getProperty(component, attribute),
+                        (service.getProperties(component) == null) ?
+                        "No such component" : (service.getProperty(component, attribute) == null) ?
+                        ("No such attribute in " + component) : "No such attribute and component"), root);
+        return ok(root).build();
+    }
+
+    // Encodes the specified property with attribute as an object in the given node.
+    private void encodeConfigs(String component, String attribute, ConfigProperty props,
+                               ObjectNode node) {
+        ObjectNode compNode = mapper().createObjectNode();
+        node.set(component, compNode);
+        compNode.put(attribute, props.value());
+    }
 }