Refactor: make ResourcePath construction a bit type-safer

Change-Id: Ie10f2b873b2b5bd7c284abdb509f31605f750435
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
index c0c4e34..72f8ac0 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourcePath.java
@@ -18,6 +18,8 @@
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableList;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -41,8 +43,8 @@
  * A double value is associated with a continuous type value.
  *
  * Users of this class must keep the semantics of resources regarding the hierarchical structure.
- * For example, resource path, Link:1/VLAN ID:100, is valid, but resource path, VLAN ID:100/Link:1
- * is not valid because a link is not a sub-component of a VLAN ID.
+ * For example, resource path, Device:1/Port:1/VLAN ID:100, is valid, but resource path,
+ * VLAN ID:100/Device:1/Port:1 is not valid because a link is not a sub-component of a VLAN ID.
  */
 @Beta
 public abstract class ResourcePath {
@@ -52,29 +54,73 @@
 
     public static final Discrete ROOT = new Discrete();
 
+    public static ResourcePath discrete(DeviceId device) {
+        return new Discrete(ImmutableList.of(device));
+    }
+
     /**
      * Creates an resource path which represents a discrete-type resource from the specified components.
      *
-     * @param components components of the path. The order represents hierarchical structure of the resource.
+     * @param device device ID which is the first component of the path
+     * @param components following components of the path. The order represents hierarchical structure of the resource.
      * @return resource path instance
      */
-    public static ResourcePath discrete(Object... components) {
-        if (components.length == 0) {
-            return ROOT;
-        } else {
-            return new Discrete(ImmutableList.copyOf(components));
-        }
+    public static ResourcePath discrete(DeviceId device, Object... components) {
+        return new Discrete(ImmutableList.builder()
+                .add(device)
+                .add(components)
+                .build());
+    }
+
+    /**
+     * Creates an resource path which represents a discrete-type resource from the specified components.
+     *
+     * @param device device ID which is the first component of the path
+     * @param port port number which is the second component of the path
+     * @param components following components of the path. The order represents hierarchical structure of the resource.
+     * @return resource path instance
+     */
+    public static ResourcePath discrete(DeviceId device, PortNumber port, Object... components) {
+        return new Discrete(ImmutableList.builder()
+                .add(device)
+                .add(port)
+                .add(components)
+                .build());
     }
 
     /**
      * Creates an resource path which represents a continuous-type resource from the specified components.
      *
      * @param value amount of the resource
-     * @param components components of the path. The order represents hierarchical structure of the resource.
+     * @param device device ID which is the first component of the path
+     * @param components following components of the path. The order represents hierarchical structure of the resource.
      * @return resource path instance
      */
-    public static ResourcePath continuous(double value, Object... components) {
-        return new Continuous(ImmutableList.copyOf(components), value);
+    public static ResourcePath continuous(double value, DeviceId device, Object... components) {
+        checkArgument(components.length > 0,
+                "Length of components must be greater thant 0, but " + components.length);
+
+        return new Continuous(ImmutableList.builder()
+                .add(device)
+                .add(components)
+                .build(), value);
+    }
+
+    /**
+     * Creates an resource path which represents a continuous-type resource from the specified components.
+     *
+     * @param value amount of the resource
+     * @param device device ID which is the first component of the path.
+     * @param port port number which is the second component of the path.
+     * @param components following components of the path. The order represents hierarchical structure of the resource.
+     * @return resource path instance
+     */
+    public static ResourcePath continuous(double value, DeviceId device, PortNumber port, Object... components) {
+        return new Continuous(ImmutableList.builder()
+                .add(device)
+                .add(port)
+                .add(components)
+                .build(), value);
     }
 
     /**
@@ -82,7 +128,7 @@
      *
      * @param components components of the path. The order represents hierarchical structure of the resource.
      */
-    ResourcePath(List<Object> components) {
+    protected ResourcePath(List<Object> components) {
         checkNotNull(components);
         checkArgument(!components.isEmpty());
 
@@ -101,7 +147,7 @@
      * @param parent the parent of this resource
      * @param last a child of the parent
      */
-    ResourcePath(Discrete parent, Object last) {
+    protected ResourcePath(Discrete parent, Object last) {
         checkNotNull(parent);
         checkNotNull(last);
 
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
index 15b457c..4bbb458 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourcePathTest.java
@@ -53,13 +53,6 @@
     }
 
     @Test
-    public void testCreateWithZeroComponent() {
-        ResourcePath path = ResourcePath.discrete();
-
-        assertThat(path, is(ResourcePath.ROOT));
-    }
-
-    @Test
     public void testComponents() {
         ResourcePath port = ResourcePath.discrete(D1, P1);