blob: 83d999881062dbee8306e57ae561f15ed04de96e [file] [log] [blame]
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Sho SHIMIZUe18cb122016-02-22 21:04:56 -080016package org.onosproject.net.resource;
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070017
18import com.google.common.annotations.Beta;
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070019
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070020import java.util.Optional;
21
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070022/**
Sho SHIMIZU8fa670a2016-01-14 11:17:18 -080023 * An object that represent a resource in a network.
24 * A Resource can represents path-like hierarchical structure with its ID. An ID of resource is
25 * composed of a sequence of elementary resources that are not globally identifiable. A Resource
26 * can be globally identifiable by its ID.
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070027 *
Sho SHIMIZU60ac58e2015-11-11 12:16:38 -080028 * Two types of resource are considered. One is discrete type and the other is continuous type.
29 * Discrete type resource is a resource whose amount is measured as a discrete unit. VLAN ID and
30 * MPLS label are examples of discrete type resource. Continuous type resource is a resource whose
31 * amount is measured as a continuous value. Bandwidth is an example of continuous type resource.
32 * A double value is associated with a continuous type value.
33 *
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070034 * Users of this class must keep the semantics of resources regarding the hierarchical structure.
Sho SHIMIZU8fa670a2016-01-14 11:17:18 -080035 * For example, resource, Device:1/Port:1/VLAN ID:100, is valid, but resource,
Sho SHIMIZUb1f16252015-11-25 23:03:16 -080036 * VLAN ID:100/Device:1/Port:1 is not valid because a link is not a sub-component of a VLAN ID.
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070037 */
38@Beta
Sho SHIMIZU2a704512016-01-26 14:41:34 -080039public interface Resource {
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070040
Sho SHIMIZU2a704512016-01-26 14:41:34 -080041 DiscreteResource ROOT = new DiscreteResource();
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070042
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070043 /**
Sho SHIMIZU446fdf02016-02-11 12:31:11 -080044 * Returns the ID of this resource.
45 *
46 * @return the ID of this resource
47 */
48 ResourceId id();
49
50 /**
Sho SHIMIZU74ac9012016-02-12 10:03:21 -080051 * Returns the simple type name of this resource.
52 *
53 * Example:<br>
54 * Resource: DeviceId:1/PortNumber:1/VlanId:200<br>
55 * Simple type name: VlanId<br>
56 *
57 * @return the simple type name of this resource
58 */
59 String simpleTypeName();
60
61 /**
Sho SHIMIZU003ed322016-02-11 12:58:42 -080062 * Checks if the type of this instance is the specified type.
63 *
64 * @param type type of resource to be checked
65 * @return true if this resource is the type of the specified type. Otherwise, false.
66 */
67 boolean isTypeOf(Class<?> type);
68
69 /**
Sho SHIMIZUb08d5862016-02-11 12:37:28 -080070 * Checks if the type of this instance is the sub-type of the specified type.
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070071 *
Sho SHIMIZUb08d5862016-02-11 12:37:28 -080072 * @param ancestor type of resource to be checked.
Sho SHIMIZU9c02f3a2016-01-29 15:11:59 -080073 * @return true if this resource is under the resource whose type is the given type.
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070074 */
Sho SHIMIZUb08d5862016-02-11 12:37:28 -080075 boolean isSubTypeOf(Class<?> ancestor);
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070076
77 /**
Sho SHIMIZUf08cb4c2016-02-11 18:35:59 -080078 * Returns value interpreted as the specified type. If the specified type is
79 * incompatible with the underlying value, an empty instance is returned.
Sho SHIMIZU2d310222016-01-22 11:45:11 -080080 *
Sho SHIMIZUf08cb4c2016-02-11 18:35:59 -080081 * @param type class instance specifying the type of return value
82 * @param <T> type of the return value
83 * @return the value of this resource as the specified type. If type mismatches,
84 * returns an empty instance.
Sho SHIMIZU2d310222016-01-22 11:45:11 -080085 */
Sho SHIMIZUf08cb4c2016-02-11 18:35:59 -080086 <T> Optional<T> valueAs(Class<T> type);
Sho SHIMIZU2d310222016-01-22 11:45:11 -080087
88 /**
Sho SHIMIZU19816f42016-01-29 11:32:02 -080089 * Returns the parent resource of this instance.
90 * E.g. if this resource is Link:1/VLAN ID:100, the return value is the resource for Link:1.
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070091 *
Sho SHIMIZU19816f42016-01-29 11:32:02 -080092 * @return the parent resource of this instance.
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070093 * If there is no parent, empty instance will be returned.
94 */
Sho SHIMIZU2a704512016-01-26 14:41:34 -080095 Optional<DiscreteResource> parent();
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -070096
Sho SHIMIZU9e1e9de2015-11-25 15:48:48 -080097 /**
Sho SHIMIZU19816f42016-01-29 11:32:02 -080098 * Returns a child resource of this instance with specifying the child object.
99 * It is not allowed that a continuous type resource has a child. If the instance is
100 * ContinuousResource, {@link UnsupportedOperationException} is thrown. If the given
101 * object is a {@link Class} instance, {@link IllegalArgumentException} is thrown.
Sho SHIMIZU9e1e9de2015-11-25 15:48:48 -0800102 *
103 * @param child child object
Sho SHIMIZU19816f42016-01-29 11:32:02 -0800104 * @return a child resource
105 * @throws IllegalArgumentException if the given object is a {@link Class} instance.
Sho SHIMIZU9e1e9de2015-11-25 15:48:48 -0800106 */
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800107 DiscreteResource child(Object child);
Sho SHIMIZU60ac58e2015-11-11 12:16:38 -0800108
Sho SHIMIZU9e1e9de2015-11-25 15:48:48 -0800109 /**
Sho SHIMIZU19816f42016-01-29 11:32:02 -0800110 * Returns a child resource of this instance with specifying a child object and
111 * value. It is not allowed that a continuous type resource has a child. If the instance is
112 * ContinuousResource, {@link UnsupportedOperationException} is thrown.
Sho SHIMIZU9e1e9de2015-11-25 15:48:48 -0800113 *
114 * @param child child object
115 * @param value value
Sho SHIMIZU19816f42016-01-29 11:32:02 -0800116 * @return a child resource
Sho SHIMIZU9e1e9de2015-11-25 15:48:48 -0800117 */
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800118 ContinuousResource child(Class<?> child, double value);
Sho SHIMIZU1f5e5912015-08-10 17:00:00 -0700119}