ONOS-7007 dealing with root relative path

- workarounds to deal with root relative ResourceId used by DynamicConfigEvent
- fix issue, where duplicate KeyLeaf was getting added

Change-Id: I957044f8da3d71e064663011c8bd8fceeb1cf44e
diff --git a/apps/config/src/test/java/org/onosproject/d/config/DeviceResourceIdsTest.java b/apps/config/src/test/java/org/onosproject/d/config/DeviceResourceIdsTest.java
index 83baf5a..5a497d6 100644
--- a/apps/config/src/test/java/org/onosproject/d/config/DeviceResourceIdsTest.java
+++ b/apps/config/src/test/java/org/onosproject/d/config/DeviceResourceIdsTest.java
@@ -15,19 +15,29 @@
  */
 package org.onosproject.d.config;
 
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.*;
 import static org.onosproject.d.config.DeviceResourceIds.DCS_NAMESPACE;
 import static org.onosproject.d.config.DeviceResourceIds.DEVICES_NAME;
+import static org.onosproject.d.config.DeviceResourceIds.DEVICE_ID_KL_NAME;
+import static org.onosproject.d.config.DeviceResourceIds.DEVICE_NAME;
 import static org.onosproject.d.config.DeviceResourceIds.ROOT_NAME;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.onosproject.net.DeviceId;
+import org.onosproject.yang.model.KeyLeaf;
+import org.onosproject.yang.model.ListKey;
+import org.onosproject.yang.model.NodeKey;
 import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.SchemaId;
 
 public class DeviceResourceIdsTest {
 
-    static final DeviceId DID_A = DeviceId.deviceId("test:A");
+    static final DeviceId DID_A = DeviceId.deviceId("test:a");
 
     static final ResourceId DEVICES = ResourceId.builder()
             .addBranchPointSchema(ROOT_NAME, DCS_NAMESPACE)
@@ -52,6 +62,12 @@
                     .build();
 
         assertEquals(DID_A, DeviceResourceIds.toDeviceId(ridAchild));
+
+        NodeKey<?> nodeKey = ridA.nodeKeys().get(2);
+        assertThat(nodeKey, is(instanceOf(ListKey.class)));
+        assertThat(nodeKey.schemaId(), is(equalTo(new SchemaId(DEVICE_NAME, DCS_NAMESPACE))));
+        ListKey listKey = (ListKey) nodeKey;
+        assertThat(listKey.keyLeafs(), is(contains(new KeyLeaf(DEVICE_ID_KL_NAME, DCS_NAMESPACE, DID_A.toString()))));
     }
 
     @Test
@@ -61,4 +77,36 @@
         assertFalse(DeviceResourceIds.isRootOrDevicesNode(ridA));
     }
 
+    @Test
+    public void testDeviceSubtreeTest() {
+        ResourceId absDevice = ResourceId.builder()
+                    .addBranchPointSchema(ROOT_NAME, DCS_NAMESPACE)
+                    .addBranchPointSchema(DEVICES_NAME, DCS_NAMESPACE)
+                    .addBranchPointSchema(DEVICE_NAME, DCS_NAMESPACE)
+                    .addKeyLeaf(DEVICE_ID_KL_NAME, DCS_NAMESPACE, DID_A.toString())
+                    .build();
+
+        NodeKey<?> deviceKey = absDevice.nodeKeys().get(2);
+        assertThat(deviceKey, is(instanceOf(ListKey.class)));
+        assertThat(deviceKey.schemaId().namespace(), is(equalTo(DCS_NAMESPACE)));
+        assertThat(deviceKey.schemaId().name(), is(equalTo(DEVICE_NAME)));
+        assertTrue(DeviceResourceIds.isUnderDeviceRootNode(absDevice));
+    }
+
+    @Test
+    public void testDeviceSubtreeEventTest() {
+        // root relative ResourceId used by DynamicConfigEvent
+        ResourceId evtDevice = ResourceId.builder()
+                    .addBranchPointSchema(DEVICES_NAME, DCS_NAMESPACE)
+                    .addBranchPointSchema(DEVICE_NAME, DCS_NAMESPACE)
+                    .addKeyLeaf(DEVICE_ID_KL_NAME, DCS_NAMESPACE, DID_A.toString())
+                    .build();
+
+        NodeKey<?> deviceKey = evtDevice.nodeKeys().get(1);
+        assertThat(deviceKey, is(instanceOf(ListKey.class)));
+        assertThat(deviceKey.schemaId().namespace(), is(equalTo(DCS_NAMESPACE)));
+        assertThat(deviceKey.schemaId().name(), is(equalTo(DEVICE_NAME)));
+        assertTrue(DeviceResourceIds.isUnderDeviceRootNode(evtDevice));
+    }
+
 }
diff --git a/apps/config/src/test/java/org/onosproject/d/config/ResourceIdsTest.java b/apps/config/src/test/java/org/onosproject/d/config/ResourceIdsTest.java
index 73f682c..b1c237b 100644
--- a/apps/config/src/test/java/org/onosproject/d/config/ResourceIdsTest.java
+++ b/apps/config/src/test/java/org/onosproject/d/config/ResourceIdsTest.java
@@ -35,12 +35,12 @@
                                   DCS_NAMESPACE)
             .build();
 
-        assertEquals(DEVICES, ResourceIds.concat(DeviceResourceIds.ROOT_ID, devices));
+        assertEquals(DEVICES, ResourceIds.concat(ResourceIds.ROOT_ID, devices));
     }
 
     @Test
     public void testRelativize() {
-        ResourceId relDevices = ResourceIds.relativize(DeviceResourceIds.ROOT_ID, DEVICES);
+        ResourceId relDevices = ResourceIds.relativize(ResourceIds.ROOT_ID, DEVICES);
         assertEquals(DeviceResourceIds.DEVICES_NAME,
                      relDevices.nodeKeys().get(0).schemaId().name());
         assertEquals(DCS_NAMESPACE,