ONOS-2387: Initial implement ResourceService

The current limitation are
- Lack of unit tests for ResourceManager and ConsistentResourceStore
- No means to declare the resource space (range) of a resource type
- Not taking care of resource hierarchy (dependency)
- Lack of automatic resource registration mechanism

Change-Id: Ib2d6734de1e498827d6cc11b9d3e224b157a27aa
diff --git a/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java b/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java
new file mode 100644
index 0000000..f2f546b
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/newresource/ResourceStore.java
@@ -0,0 +1,70 @@
+package org.onosproject.net.newresource;
+
+import com.google.common.annotations.Beta;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Service for storing resource and consumer information.
+ */
+@Beta
+public interface ResourceStore {
+    /**
+     * Allocates the specified resources to the specified consumer in transactional way.
+     * The state after completion of this method is all the resources are allocated to the consumer,
+     * or no resource is allocated to the consumer. The whole allocation fails when any one of
+     * the resource can't be allocated.
+     *
+     * @param resources resources to be allocated
+     * @param consumer resource consumer which the resources are allocated to
+     * @return true if the allocation succeeds, false otherwise.
+     */
+    boolean allocate(List<? extends Resource<?, ?>> resources, ResourceConsumer consumer);
+
+    /**
+     * Releases the specified resources allocated to the specified corresponding consumers
+     * in transactional way. The state after completion of this method is all the resources
+     * are released from the consumer, or no resource is released. The whole release fails
+     * when any one of the resource can't be released. The size of the list of resources and
+     * that of consumers must be equal. The resource and consumer with the same position from
+     * the head of each list correspond to each other.
+     *
+     * @param resources resources to be released
+     * @param consumers resource consumers to whom the resource allocated to
+     * @return true if succeeds, otherwise false
+     */
+    boolean release(List<? extends Resource<?, ?>> resources, List<ResourceConsumer> consumers);
+
+    /**
+     * Returns the resource consumer to whom the specified resource is allocated.
+     *
+     * @param resource resource whose allocated consumer to be returned
+     * @param <S> type of subject of the resource
+     * @param <T> type of resource
+     * @return resource consumer who are allocated the resource
+     */
+    <S, T> Optional<ResourceConsumer> getConsumer(Resource<S, T> resource);
+
+    /**
+     * Returns a collection of the resources allocated to the specified consumer.
+     *
+     * @param consumer resource consumer whose allocated resource are searched for
+     * @return a collection of the resources allocated to the specified consumer
+     */
+    Collection<Resource<?, ?>> getResources(ResourceConsumer consumer);
+
+    /**
+     * Returns a collection of the resources which belongs to the specified subject and
+     * whose type is the specified class.
+     *
+     * @param subject subject of the resources to be returned
+     * @param cls class instance of the resources
+     * @param <S> type of the subject
+     * @param <T> type of the resource
+     * @return a collection of the resources which belongs to the specified subject and
+     * whose type is the specified class.
+     */
+    <S, T> Collection<Resource<S, T>> getAllocatedResources(S subject, Class<T> cls);
+}