Change the APIs to instantiate Resource and ResourceId

Now, DiscreteResource/DiscreteResourceId is provided by DiscreteFactory.
Similarly, ContinuousResource/ContinuousResourceId is provided by
ContinuousFactory. These factory instances can be obtained by static
factory method such as Resource.discrete(...) or Resource.continuous(...).

Change-Id: Ic94f7336c0e1f74cf2dddcac899de300362aff3e
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousFactory.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousFactory.java
new file mode 100644
index 0000000..2acd726
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousFactory.java
@@ -0,0 +1,55 @@
+/*
+ * 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.net.newresource;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Factory class for continuous-type resource related instances.
+ */
+@Beta
+public final class ContinuousFactory {
+    private final ContinuousResourceId id;
+
+    /**
+     * Creates an instance with the specified resource ID.
+     *
+     * @param id resource ID that is associated with the resource related instances
+     *           which will be created from this instance
+     */
+    ContinuousFactory(ContinuousResourceId id) {
+        this.id = id;
+    }
+
+    /**
+     * Returns the resource ID for continuous-type.
+     *
+     * @return continuous-type resource ID
+     */
+    public ContinuousResourceId id() {
+        return id;
+    }
+
+    /**
+     * Returns the resource for continuous-type specified by the given value.
+     *
+     * @param volume volume of the returned resource
+     * @return continuous-type resource
+     */
+    public ContinuousResource resource(double volume) {
+        return new ContinuousResource(id(), volume);
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
index af34bc5..f5301f7 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResource.java
@@ -98,7 +98,7 @@
 
     @Override
     public Optional<DiscreteResource> parent() {
-        return id.parent().map(DiscreteResource::new);
+        return id.parent().map(x -> Resource.discrete(x).resource());
     }
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java
index 5870106..4dadacf 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ContinuousResourceId.java
@@ -21,8 +21,6 @@
 import java.util.Objects;
 import java.util.Optional;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
 /**
  * ResourceId for {@link ContinuousResource}
  *
@@ -36,11 +34,6 @@
     // for printing purpose only (used in toString() implementation)
     private final String name;
 
-    ContinuousResourceId(ImmutableList<Object> components, String name) {
-        this.components = components;
-        this.name = checkNotNull(name);
-    }
-
     ContinuousResourceId(ImmutableList.Builder<Object> parentComponents, Class<?> last) {
         this.components = parentComponents.add(last.getCanonicalName()).build();
         this.name = last.getSimpleName();
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteFactory.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteFactory.java
new file mode 100644
index 0000000..b285641
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteFactory.java
@@ -0,0 +1,54 @@
+/*
+ * 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.net.newresource;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Factory class for discrete-type resource related instances.
+ */
+@Beta
+public final class DiscreteFactory {
+    private final DiscreteResourceId id;
+
+    /**
+     * Create an instance with the specified resource ID.
+     *
+     * @param id resource ID that is associated with the resource related instances
+     *           which will be created from this instance
+     */
+    DiscreteFactory(DiscreteResourceId id) {
+        this.id = id;
+    }
+
+    /**
+     * Returns the resource ID for discrete-type.
+     *
+     * @return discrete-type resource ID
+     */
+    public DiscreteResourceId id() {
+        return id;
+    }
+
+    /**
+     * Returns the resource for discrete-type.
+     *
+     * @return discrete-type resource
+     */
+    public DiscreteResource resource() {
+        return new DiscreteResource(id);
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
index c8839a6..f1876d5 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResource.java
@@ -40,7 +40,7 @@
         this.id = id;
     }
 
-    protected DiscreteResource() {
+    DiscreteResource() {
         this.id = ResourceId.ROOT;
     }
 
@@ -80,17 +80,17 @@
     public DiscreteResource child(Object child) {
         checkArgument(!(child instanceof Class<?>));
 
-        return new DiscreteResource(id.child(child));
+        return Resource.discrete(id.child(child)).resource();
     }
 
     @Override
     public ContinuousResource child(Class<?> child, double value) {
-        return new ContinuousResource(id.child(child), value);
+        return Resource.continuous(id.child(child)).resource(value);
     }
 
     @Override
     public Optional<DiscreteResource> parent() {
-        return id.parent().map(DiscreteResource::new);
+        return id.parent().map(x -> Resource.discrete(x).resource());
     }
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
index 80c8f59..804dfba 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/DiscreteResourceId.java
@@ -50,17 +50,14 @@
     public DiscreteResourceId child(Object child) {
         checkArgument(!(child instanceof Class<?>));
 
-        return new DiscreteResourceId(ImmutableList.builder()
-                .addAll(components)
-                .add(child)
-                .build());
+        return Resource.discrete(this, child).id();
     }
 
     @Override
     public ContinuousResourceId child(Class<?> child) {
         checkNotNull(child);
 
-        return new ContinuousResourceId(ImmutableList.builder().addAll(components), child);
+        return Resource.continuous(this, child).id();
     }
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
index e3c5c47..749d87e 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/Resource.java
@@ -16,14 +16,16 @@
 package org.onosproject.net.newresource;
 
 import com.google.common.annotations.Beta;
-
+import com.google.common.collect.ImmutableList;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * An object that represent a resource in a network.
@@ -46,65 +48,6 @@
 
     DiscreteResource ROOT = new DiscreteResource();
 
-    static DiscreteResource discrete(DeviceId device) {
-        return new DiscreteResource(ResourceId.discrete(device));
-    }
-
-    /**
-     * 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 components following components of the path. The order represents hierarchical structure of the resource.
-     * @return resource path instance
-     */
-    static DiscreteResource discrete(DeviceId device, Object... components) {
-        return new DiscreteResource(ResourceId.discrete(device, components));
-    }
-
-    /**
-     * 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
-     */
-    static DiscreteResource discrete(DeviceId device, PortNumber port, Object... components) {
-        return new DiscreteResource(ResourceId.discrete(device, port, components));
-    }
-
-    /**
-     * 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 components following components of the path. The order represents hierarchical structure of the resource.
-     *                   The last element of this list must be an {@link Class} instance. Otherwise, this method throws
-     *                   an IllegalArgumentException.
-     * @return resource path instance
-     */
-    static ContinuousResource continuous(double value, DeviceId device, Object... components) {
-        checkArgument(components.length > 0,
-                "Length of components must be greater thant 0, but " + components.length);
-
-        return new ContinuousResource(ResourceId.continuous(device, components), 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.
-     *                   The last element of this list must be an {@link Class} instance. Otherwise, this method throws
-     *                   an IllegalArgumentException.
-     * @return resource path instance
-     */
-    static ContinuousResource continuous(double value, DeviceId device, PortNumber port, Object... components) {
-        return new ContinuousResource(ResourceId.continuous(device, port, components), value);
-    }
-
     /**
      * Returns the components of this resource path.
      *
@@ -163,4 +106,189 @@
      * @return the ID of this resource path
      */
     ResourceId id();
+
+    /**
+     * Create a factory for discrete-type with the specified resource ID.
+     *
+     * @param id resource ID
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DiscreteResourceId id) {
+        checkNotNull(id);
+
+        return new DiscreteFactory(id);
+    }
+
+    /**
+     * Creates a factory for discrete-type with the specified parent ID and child.
+     *
+     * @param parent ID of the parent
+     * @param child child
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DiscreteResourceId parent, Object child) {
+        checkNotNull(parent);
+        checkNotNull(child);
+        checkArgument(!(child instanceof Class<?>));
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
+                .addAll(parent.components())
+                .add(child)
+                .build()));
+    }
+
+    /**
+     * Create a factory for discrete-type with the specified device ID.
+     *
+     * @param device device ID
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DeviceId device) {
+        checkNotNull(device);
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.of(device)));
+    }
+
+    /**
+     * Create a factory for discrete-type with the specified device ID and components.
+     *
+     * @param device device ID
+     * @param components resource ID components other than the device ID
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DeviceId device, Object... components) {
+        checkNotNull(device);
+        checkNotNull(components);
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
+                .add(device)
+                .add(components)
+                .build()));
+    }
+
+    /**
+     * Create a factory for discrete-type with the specified device ID, port number and components.
+     *
+     * @param device device ID
+     * @param port port number
+     * @param components resource ID components other than the device ID and port number
+     * @return {@link DiscreteFactory}
+     */
+    static DiscreteFactory discrete(DeviceId device, PortNumber port, Object... components) {
+        checkNotNull(device);
+        checkNotNull(port);
+        checkNotNull(components);
+
+        return new DiscreteFactory(new DiscreteResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port)
+                .add(components)
+                .build()));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified resource ID.
+     *
+     * @param id resource ID
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(ContinuousResourceId id) {
+        checkNotNull(id);
+
+        return new ContinuousFactory(id);
+    }
+
+    /**
+     * Creates a factory for continuous-type wit the specified parent ID and child.
+     *
+     * @param parent ID of the parent
+     * @param child child
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DiscreteResourceId parent, Class<?> child) {
+        checkNotNull(parent);
+        checkNotNull(child);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .addAll(parent.components()), child));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID and type.
+     *
+     * @param device device ID
+     * @param cls type of resource the returned factory will create
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DeviceId device, Class<?> cls) {
+        checkNotNull(device);
+        checkNotNull(cls);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder().add(device), cls));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID and components.
+     * The last element of the components must be a {@link Class} instance. Otherwise,
+     * an {@link IllegalArgumentException} is thrown.
+     *
+     * @param device device ID
+     * @param components resource ID components other than the device ID.
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DeviceId device, Object... components) {
+        checkNotNull(device);
+        checkNotNull(components);
+        checkArgument(components.length > 1);
+
+        Object last = components[components.length - 1];
+        checkArgument(last instanceof Class<?>);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .add(device)
+                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID, port number and type.
+     *
+     * @param device device ID
+     * @param port port number
+     * @param cls type of resource the returned factory will create
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DeviceId device, PortNumber port, Class<?> cls) {
+        checkNotNull(device);
+        checkNotNull(port);
+        checkNotNull(cls);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port), cls));
+    }
+
+    /**
+     * Create a factory for continuous-type with the specified device ID and components.
+     * The last element of the components must be a {@link Class} instance. Otherwise,
+     * an {@link IllegalArgumentException} is thrown.
+     *
+     * @param device device ID
+     * @param port port number
+     * @param components resource ID components other than the device ID and port number.
+     * @return {@link ContinuousFactory}
+     */
+    static ContinuousFactory continuous(DeviceId device, PortNumber port, Object... components) {
+        checkNotNull(device);
+        checkNotNull(port);
+        checkNotNull(components);
+        checkArgument(components.length > 1);
+
+        Object last = components[components.length - 1];
+        checkArgument(last instanceof Class<?>);
+
+        return new ContinuousFactory(new ContinuousResourceId(ImmutableList.builder()
+                .add(device)
+                .add(port)
+                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last));
+    }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
index 6f785df..ee1660d 100644
--- a/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceId.java
@@ -16,15 +16,9 @@
 package org.onosproject.net.newresource;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
 
-import java.util.Arrays;
 import java.util.Optional;
 
-import static com.google.common.base.Preconditions.checkArgument;
-
 /**
  * Represents identifier of resource.
  * This class is exposed to public, but intended to use only in ResourceStore implementations.
@@ -33,40 +27,6 @@
 public abstract class ResourceId {
     static final DiscreteResourceId ROOT = new DiscreteResourceId();
 
-    static DiscreteResourceId discrete(DeviceId device, Object... components) {
-        return new DiscreteResourceId(ImmutableList.builder()
-                .add(device)
-                .add(components)
-                .build());
-    }
-
-    static DiscreteResourceId discrete(DeviceId device, PortNumber port, Object... components) {
-        return new DiscreteResourceId(ImmutableList.builder()
-                .add(device)
-                .add(port)
-                .add(components)
-                .build());
-    }
-
-    static ContinuousResourceId continuous(DeviceId device, Object... components) {
-        Object last = components[components.length - 1];
-        checkArgument(last instanceof Class<?>);
-
-        return new ContinuousResourceId(ImmutableList.builder()
-                .add(device)
-                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last);
-    }
-
-    static ContinuousResourceId continuous(DeviceId device, PortNumber port, Object... components) {
-        Object last = components[components.length - 1];
-        checkArgument(last instanceof Class<?>);
-
-        return new ContinuousResourceId(ImmutableList.builder()
-                .add(device)
-                .add(port)
-                .add(Arrays.copyOfRange(components, 0, components.length - 1)), (Class<?>) last);
-    }
-
     /**
      * Returns the parent resource ID of this instance.
      *
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourceAllocationTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourceAllocationTest.java
index a9a8ed2..c8c1b17 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourceAllocationTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourceAllocationTest.java
@@ -32,9 +32,9 @@
 
     @Test
     public void testEquals() {
-        ResourceAllocation alloc1 = new ResourceAllocation(Resource.discrete(D1, P1, VLAN1), IID1);
-        ResourceAllocation sameAsAlloc1 = new ResourceAllocation(Resource.discrete(D1, P1, VLAN1), IID1);
-        ResourceAllocation alloc2 = new ResourceAllocation(Resource.discrete(D2, P1, VLAN1), IID1);
+        ResourceAllocation alloc1 = new ResourceAllocation(Resource.discrete(D1, P1, VLAN1).resource(), IID1);
+        ResourceAllocation sameAsAlloc1 = new ResourceAllocation(Resource.discrete(D1, P1, VLAN1).resource(), IID1);
+        ResourceAllocation alloc2 = new ResourceAllocation(Resource.discrete(D2, P1, VLAN1).resource(), IID1);
 
         new EqualsTester()
                 .addEqualityGroup(alloc1, sameAsAlloc1)
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourceIdTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourceIdTest.java
index 7a37d30..1d2257b 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourceIdTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourceIdTest.java
@@ -32,20 +32,20 @@
 
     @Test
     public void testDiscreteToString() {
-        ResourceId resource = ResourceId.discrete(D1, P1);
+        ResourceId resource = Resource.discrete(D1, P1).id();
 
         assertThat(resource.toString(), is(Arrays.asList(D1, P1).toString()));
     }
 
     @Test
     public void testContinuousToString() {
-        ResourceId resource = ResourceId.continuous(D1, P1, Bandwidth.class);
+        ResourceId resource = Resource.continuous(D1, P1, Bandwidth.class).id();
 
         assertThat(resource.toString(), is(Arrays.asList(D1, P1, Bandwidth.class.getSimpleName()).toString()));
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testInitWithNonClassInstance() {
-        ResourceId.continuous(D1, P1, BW1);
+        Resource.continuous(D1, P1, BW1).id();
     }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java b/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
index f7c165e..a14b947 100644
--- a/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
+++ b/core/api/src/test/java/org/onosproject/net/newresource/ResourceTest.java
@@ -39,11 +39,11 @@
 
     @Test
     public void testEquals() {
-        Resource resource1 = Resource.discrete(D1, P1, VLAN1);
-        Resource sameAsResource1 = Resource.discrete(D1, P1, VLAN1);
-        Resource resource2 = Resource.discrete(D2, P1, VLAN1);
-        Resource resource3 = Resource.continuous(BW1.bps(), D1, P1, Bandwidth.class);
-        Resource sameAsResource3 = Resource.continuous(BW1.bps(), D1, P1, Bandwidth.class);
+        Resource resource1 = Resource.discrete(D1, P1, VLAN1).resource();
+        Resource sameAsResource1 = Resource.discrete(D1, P1, VLAN1).resource();
+        Resource resource2 = Resource.discrete(D2, P1, VLAN1).resource();
+        Resource resource3 = Resource.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
+        Resource sameAsResource3 = Resource.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
 
         new EqualsTester()
                 .addEqualityGroup(resource1, sameAsResource1)
@@ -54,7 +54,7 @@
 
     @Test
     public void testComponents() {
-        Resource port = Resource.discrete(D1, P1);
+        Resource port = Resource.discrete(D1, P1).resource();
 
         assertThat(port.components(), contains(D1, P1));
     }
@@ -64,9 +64,9 @@
         ResourceId id1 = Resource.discrete(D1, P1, VLAN1).id();
         ResourceId sameAsId1 = Resource.discrete(D1, P1, VLAN1).id();
         ResourceId id2 = Resource.discrete(D2, P1, VLAN1).id();
-        ResourceId id3 = Resource.continuous(BW1.bps(), D1, P1, Bandwidth.class).id();
+        ResourceId id3 = Resource.continuous(D1, P1, Bandwidth.class).resource(BW1.bps()).id();
         // intentionally set a different value
-        ResourceId sameAsId3 = Resource.continuous(BW2.bps(), D1, P1, Bandwidth.class).id();
+        ResourceId sameAsId3 = Resource.continuous(D1, P1, Bandwidth.class).resource(BW2.bps()).id();
 
         new EqualsTester()
                 .addEqualityGroup(id1, sameAsId1)
@@ -76,30 +76,30 @@
 
     @Test
     public void testChild() {
-        Resource r1 = Resource.discrete(D1).child(P1);
-        Resource sameAsR2 = Resource.discrete(D1, P1);
+        Resource r1 = Resource.discrete(D1).resource().child(P1);
+        Resource sameAsR2 = Resource.discrete(D1, P1).resource();
 
         assertThat(r1, is(sameAsR2));
     }
 
     @Test
     public void testThereIsParent() {
-        Resource resource = Resource.discrete(D1, P1, VLAN1);
-        Resource parent = Resource.discrete(D1, P1);
+        Resource resource = Resource.discrete(D1, P1, VLAN1).resource();
+        Resource parent = Resource.discrete(D1, P1).resource();
 
         assertThat(resource.parent(), is(Optional.of(parent)));
     }
 
     @Test
     public void testNoParent() {
-        Resource resource = Resource.discrete(D1);
+        Resource resource = Resource.discrete(D1).resource();
 
         assertThat(resource.parent(), is(Optional.of(Resource.ROOT)));
     }
 
     @Test
     public void testBase() {
-        Resource resource = Resource.discrete(D1);
+        Resource resource = Resource.discrete(D1).resource();
 
         DeviceId child = (DeviceId) resource.last();
         assertThat(child, is(D1));
@@ -107,7 +107,7 @@
 
     @Test
     public void testVolumeOfDiscrete() {
-        Resource resource = Resource.discrete(D1);
+        Resource resource = Resource.discrete(D1).resource();
 
         DeviceId volume = resource.volume();
         assertThat(volume, is(D1));
@@ -115,7 +115,7 @@
 
     @Test
     public void testVolumeOfContinuous() {
-        Resource resource = Resource.continuous(BW1.bps(), D1, P1, Bandwidth.class);
+        Resource resource = Resource.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
 
         double volume = resource.volume();
         assertThat(volume, is(BW1.bps()));
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java
index a9bf1b7..511c0c2 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MplsPathIntentCompiler.java
@@ -125,8 +125,10 @@
         // TODO: introduce the concept of Tx and Rx resources of a port
         Set<Resource> resources = labels.entrySet().stream()
                 .flatMap(x -> Stream.of(
-                        Resource.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue()),
+                        Resource.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue())
+                                .resource(),
                         Resource.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
+                                .resource()
                 ))
                 .collect(Collectors.toSet());
         List<org.onosproject.net.newresource.ResourceAllocation> allocations =
@@ -154,7 +156,7 @@
     }
 
     private Set<MplsLabel> findMplsLabel(ConnectPoint cp) {
-        return resourceService.getAvailableResources(Resource.discrete(cp.deviceId(), cp.port())).stream()
+        return resourceService.getAvailableResources(Resource.discrete(cp.deviceId(), cp.port()).resource()).stream()
                 .filter(x -> x.last() instanceof MplsLabel)
                 .map(x -> (MplsLabel) x.last())
                 .collect(Collectors.toSet());
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java
index 5d47658..a08b843 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalCircuitIntentCompiler.java
@@ -160,8 +160,8 @@
         log.debug("Compiling optical circuit intent between {} and {}", src, dst);
 
         // Reserve OduClt ports
-        Resource srcPortResource = Resource.discrete(src.deviceId(), src.port());
-        Resource dstPortResource = Resource.discrete(dst.deviceId(), dst.port());
+        Resource srcPortResource = Resource.discrete(src.deviceId(), src.port()).resource();
+        Resource dstPortResource = Resource.discrete(dst.deviceId(), dst.port()).resource();
         List<ResourceAllocation> allocation = resourceService.allocate(intent.id(), srcPortResource, dstPortResource);
         if (allocation.isEmpty()) {
             throw new IntentCompilationException("Unable to reserve ports for intent " + intent);
@@ -312,7 +312,7 @@
         if (ochCP != null) {
             OchPort ochPort = (OchPort) deviceService.getPort(ochCP.deviceId(), ochCP.port());
             Optional<IntentId> intentId =
-                    resourceService.getResourceAllocations(Resource.discrete(ochCP.deviceId(), ochCP.port()))
+                    resourceService.getResourceAllocations(Resource.discrete(ochCP.deviceId(), ochCP.port()).resource())
                             .stream()
                             .map(ResourceAllocation::consumer)
                             .filter(x -> x instanceof IntentId)
@@ -333,7 +333,8 @@
             }
 
             Optional<IntentId> intentId =
-                    resourceService.getResourceAllocations(Resource.discrete(oduPort.deviceId(), port.number()))
+                    resourceService.getResourceAllocations(
+                            Resource.discrete(oduPort.deviceId(), port.number()).resource())
                             .stream()
                             .map(ResourceAllocation::consumer)
                             .filter(x -> x instanceof IntentId)
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
index 98df5f3..3becdb8 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
@@ -109,8 +109,8 @@
         log.debug("Compiling optical connectivity intent between {} and {}", src, dst);
 
         // Reserve OCh ports
-        Resource srcPortResource = Resource.discrete(src.deviceId(), src.port());
-        Resource dstPortResource = Resource.discrete(dst.deviceId(), dst.port());
+        Resource srcPortResource = Resource.discrete(src.deviceId(), src.port()).resource();
+        Resource dstPortResource = Resource.discrete(dst.deviceId(), dst.port()).resource();
         List<org.onosproject.net.newresource.ResourceAllocation> allocation =
                 resourceService.allocate(intent.id(), srcPortResource, dstPortResource);
         if (allocation.isEmpty()) {
@@ -184,8 +184,8 @@
         List<OchSignal> minLambda = findFirstLambda(lambdas, slotCount());
         List<Resource> lambdaResources = path.links().stream()
                 .flatMap(x -> Stream.of(
-                        Resource.discrete(x.src().deviceId(), x.src().port()),
-                        Resource.discrete(x.dst().deviceId(), x.dst().port())
+                        Resource.discrete(x.src().deviceId(), x.src().port()).resource(),
+                        Resource.discrete(x.dst().deviceId(), x.dst().port()).resource()
                 ))
                 .flatMap(x -> minLambda.stream().map(l -> x.child(l)))
                 .collect(Collectors.toList());
@@ -214,8 +214,8 @@
     private Set<OchSignal> findCommonLambdasOverLinks(List<Link> links) {
         return links.stream()
                 .flatMap(x -> Stream.of(
-                        Resource.discrete(x.src().deviceId(), x.src().port()),
-                        Resource.discrete(x.dst().deviceId(), x.dst().port())
+                        Resource.discrete(x.src().deviceId(), x.src().port()).resource(),
+                        Resource.discrete(x.dst().deviceId(), x.dst().port()).resource()
                 ))
                 .map(resourceService::getAvailableResources)
                 .map(x -> Iterables.filter(x, r -> r.last() instanceof OchSignal))
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
index ec7cfd7..842e5e0 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
@@ -252,8 +252,10 @@
         //same VLANID is used for both directions
         Set<Resource> resources = vlanIds.entrySet().stream()
                 .flatMap(x -> Stream.of(
-                        Resource.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue()),
+                        Resource.discrete(x.getKey().src().deviceId(), x.getKey().src().port(), x.getValue())
+                                .resource(),
                         Resource.discrete(x.getKey().dst().deviceId(), x.getKey().dst().port(), x.getValue())
+                                .resource()
                 ))
                 .collect(Collectors.toSet());
         List<org.onosproject.net.newresource.ResourceAllocation> allocations =
@@ -280,7 +282,7 @@
     }
 
     private Set<VlanId> findVlanId(ConnectPoint cp) {
-        return resourceService.getAvailableResources(Resource.discrete(cp.deviceId(), cp.port())).stream()
+        return resourceService.getAvailableResources(Resource.discrete(cp.deviceId(), cp.port()).resource()).stream()
                 .filter(x -> x.last() instanceof VlanId)
                 .map(x -> (VlanId) x.last())
                 .collect(Collectors.toSet());
diff --git a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
index e3e42ac..2a85fbb 100644
--- a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
+++ b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
@@ -118,15 +118,15 @@
     }
 
     private void registerDeviceResource(Device device) {
-        executor.submit(() -> adminService.registerResources(Resource.discrete(device.id())));
+        executor.submit(() -> adminService.registerResources(Resource.discrete(device.id()).resource()));
     }
 
     private void unregisterDeviceResource(Device device) {
-        executor.submit(() -> adminService.unregisterResources(Resource.discrete(device.id())));
+        executor.submit(() -> adminService.unregisterResources(Resource.discrete(device.id()).resource()));
     }
 
     private void registerPortResource(Device device, Port port) {
-        Resource portPath = Resource.discrete(device.id(), port.number());
+        Resource portPath = Resource.discrete(device.id(), port.number()).resource();
         executor.submit(() -> {
             adminService.registerResources(portPath);
 
@@ -174,7 +174,7 @@
     }
 
     private void unregisterPortResource(Device device, Port port) {
-        Resource resource = Resource.discrete(device.id(), port.number());
+        Resource resource = Resource.discrete(device.id(), port.number()).resource();
         executor.submit(() -> adminService.unregisterResources(resource));
     }
 
diff --git a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceNetworkConfigListener.java b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceNetworkConfigListener.java
index 88d8bc6..b8d373b 100644
--- a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceNetworkConfigListener.java
+++ b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceNetworkConfigListener.java
@@ -93,9 +93,9 @@
 
         switch (event.type()) {
         case CONFIG_ADDED:
-            if (!adminService.registerResources(continuous(bwCapacity.capacity().bps(),
-                                                           cp.deviceId(),
-                                                           cp.port(), Bandwidth.class))) {
+            if (!adminService.registerResources(continuous(cp.deviceId(),
+                                                           cp.port(), Bandwidth.class)
+                    .resource(bwCapacity.capacity().bps()))) {
                 log.info("Failed to register Bandwidth for {}, attempting update", cp);
 
                 // Bandwidth based on port speed, was probably already registered.
@@ -115,10 +115,9 @@
 
         case CONFIG_REMOVED:
             // FIXME Following should be an update to the value based on port speed
-            if (!adminService.unregisterResources(continuous(0,
-                                                             cp.deviceId(),
+            if (!adminService.unregisterResources(continuous(cp.deviceId(),
                                                              cp.port(),
-                                                             Bandwidth.class))) {
+                                                             Bandwidth.class).resource(0))) {
                 log.warn("Failed to unregister Bandwidth for {}", cp);
             }
             break;
@@ -148,13 +147,12 @@
         // but both unregisterResources(..) and  registerResources(..)
         // returns true (success)
 
-        if (!adminService.unregisterResources(continuous(0, cp.deviceId(), cp.port(), Bandwidth.class))) {
+        if (!adminService.unregisterResources(continuous(cp.deviceId(), cp.port(), Bandwidth.class).resource(0))) {
             log.warn("unregisterResources for {} failed", cp);
         }
-        return adminService.registerResources(continuous(bwCapacity.capacity().bps(),
-                                                         cp.deviceId(),
+        return adminService.registerResources(continuous(cp.deviceId(),
                                                          cp.port(),
-                                                         Bandwidth.class));
+                                                         Bandwidth.class).resource(bwCapacity.capacity().bps()));
     }
 
 }
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/ObjectiveTrackerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/ObjectiveTrackerTest.java
index 480e6e4..7c1036e 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/ObjectiveTrackerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/ObjectiveTrackerTest.java
@@ -232,7 +232,7 @@
     @Test
     public void testResourceEvent() throws Exception {
         ResourceEvent event = new ResourceEvent(RESOURCE_ADDED,
-                Resource.discrete(DeviceId.deviceId("a"), PortNumber.portNumber(1)));
+                Resource.discrete(DeviceId.deviceId("a"), PortNumber.portNumber(1)).resource());
         resourceListener.event(event);
 
         assertThat(
diff --git a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
index 54690ea..8d2d368 100644
--- a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
+++ b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
@@ -388,7 +388,7 @@
 
     @Test
     public void testResource() {
-        testSerializedEquals(Resource.discrete(DID1, P1, VLAN1));
+        testSerializedEquals(Resource.discrete(DID1, P1, VLAN1).resource());
     }
 
     @Test
@@ -399,7 +399,7 @@
     @Test
     public void testResourceAllocation() {
         testSerializedEquals(new org.onosproject.net.newresource.ResourceAllocation(
-                Resource.discrete(DID1, P1, VLAN1),
+                Resource.discrete(DID1, P1, VLAN1).resource(),
                 IntentId.valueOf(30)));
     }