blob: beb564aadd2780bacc081dd97377c707917dd646 [file] [log] [blame]
Sho SHIMIZUf33b8932016-01-25 18:43:32 -08001/*
2 * Copyright 2016 Open Networking Laboratory
3 *
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 */
16package org.onosproject.net.newresource;
17
18import com.google.common.annotations.Beta;
Sho SHIMIZU2a704512016-01-26 14:41:34 -080019import com.google.common.base.MoreObjects;
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080020
21import java.util.Objects;
Sho SHIMIZU2a704512016-01-26 14:41:34 -080022import java.util.Optional;
23
24import static com.google.common.base.Preconditions.checkArgument;
Sho SHIMIZU0e1a4762016-02-11 13:04:41 -080025import static com.google.common.base.Preconditions.checkNotNull;
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080026
27/**
28 * Represents a resource path which specifies a resource which can be measured
29 * as a discrete unit. A VLAN ID and a MPLS label of a link are examples of the resource.
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080030 */
31@Beta
Sho SHIMIZU2a704512016-01-26 14:41:34 -080032public final class DiscreteResource implements Resource {
33 private final DiscreteResourceId id;
34
35 DiscreteResource(DiscreteResourceId id) {
36 this.id = id;
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080037 }
38
Sho SHIMIZUf95b96e2016-01-25 19:35:15 -080039 DiscreteResource() {
Sho SHIMIZU2a704512016-01-26 14:41:34 -080040 this.id = ResourceId.ROOT;
41 }
42
43 @Override
44 public DiscreteResourceId id() {
45 return id;
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080046 }
47
Sho SHIMIZU003ed322016-02-11 12:58:42 -080048 @Override
49 public boolean isTypeOf(Class<?> type) {
50 checkNotNull(type);
51
52 if (isRoot()) {
53 return false;
54 }
55
56 return type.isAssignableFrom(id.components().get(id.components().size() - 1).getClass());
57 }
58
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080059 @Override
Sho SHIMIZUb08d5862016-02-11 12:37:28 -080060 public boolean isSubTypeOf(Class<?> ancestor) {
Sho SHIMIZU0e1a4762016-02-11 13:04:41 -080061 checkNotNull(ancestor);
62
Sho SHIMIZU9c02f3a2016-01-29 15:11:59 -080063 return id.components().stream()
64 .map(Object::getClass)
Sho SHIMIZUb08d5862016-02-11 12:37:28 -080065 .filter(x -> x.equals(ancestor))
Sho SHIMIZU9c02f3a2016-01-29 15:11:59 -080066 .findAny()
67 .isPresent();
Sho SHIMIZU2a704512016-01-26 14:41:34 -080068 }
69
70 @Override
Sho SHIMIZUf08cb4c2016-02-11 18:35:59 -080071 public <T> Optional<T> valueAs(Class<T> type) {
72 checkNotNull(type);
73
74 if (!isTypeOf(type)) {
75 return Optional.empty();
76 }
77
78 @SuppressWarnings("unchecked")
79 T value = (T) id.components().get(id.components().size() - 1);
80 return Optional.of(value);
81 }
82
83 @Override
Sho SHIMIZU2a704512016-01-26 14:41:34 -080084 public Object last() {
Sho SHIMIZU42ac51f2016-01-27 12:59:31 -080085 if (id.components().isEmpty()) {
Sho SHIMIZU2a704512016-01-26 14:41:34 -080086 return null;
87 }
Sho SHIMIZU42ac51f2016-01-27 12:59:31 -080088 return id.components().get(id.components().size() - 1);
Sho SHIMIZU2a704512016-01-26 14:41:34 -080089 }
90
Sho SHIMIZU003ed322016-02-11 12:58:42 -080091 private boolean isRoot() {
92 return id.equals(ResourceId.ROOT);
93 }
94
Sho SHIMIZU2a704512016-01-26 14:41:34 -080095 @Override
96 public DiscreteResource child(Object child) {
97 checkArgument(!(child instanceof Class<?>));
98
Sho SHIMIZU460b9722016-01-28 10:48:26 -080099 return Resources.discrete(id.child(child)).resource();
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800100 }
101
102 @Override
103 public ContinuousResource child(Class<?> child, double value) {
Sho SHIMIZU460b9722016-01-28 10:48:26 -0800104 return Resources.continuous(id.child(child)).resource(value);
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800105 }
106
107 @Override
108 public Optional<DiscreteResource> parent() {
Sho SHIMIZU460b9722016-01-28 10:48:26 -0800109 return id.parent().map(x -> Resources.discrete(x).resource());
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800110 }
111
112 @Override
Sho SHIMIZUf33b8932016-01-25 18:43:32 -0800113 public int hashCode() {
114 // the value returing from volume() is excluded due to optimization
Sho SHIMIZU34b55b62016-01-27 12:49:43 -0800115 return id.hashCode();
Sho SHIMIZUf33b8932016-01-25 18:43:32 -0800116 }
117
118 @Override
119 public boolean equals(Object obj) {
120 if (this == obj) {
121 return true;
122 }
123 if (obj == null || getClass() != obj.getClass()) {
124 return false;
125 }
126 final DiscreteResource other = (DiscreteResource) obj;
127 // the value returing from volume() is excluded due to optimization
Sho SHIMIZU34b55b62016-01-27 12:49:43 -0800128 return Objects.equals(this.id, other.id);
Sho SHIMIZUf33b8932016-01-25 18:43:32 -0800129 }
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800130
131 @Override
132 public String toString() {
133 return MoreObjects.toStringHelper(this)
134 .add("id", id)
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800135 .toString();
136 }
Sho SHIMIZUf33b8932016-01-25 18:43:32 -0800137}