blob: a55124e2b14eb748b7f98a92fa87cb82fc6db169 [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;
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080023
Sho SHIMIZU0e1a4762016-02-11 13:04:41 -080024import static com.google.common.base.Preconditions.checkNotNull;
25
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080026/**
27 * Represents a resource path which specifies a resource which can be measured
28 * as continuous value. Bandwidth of a link is an example of the resource.
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080029 */
30@Beta
Sho SHIMIZU2a704512016-01-26 14:41:34 -080031public final class ContinuousResource implements Resource {
32 private final ContinuousResourceId id;
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080033 private final double value;
34
Sho SHIMIZU2a704512016-01-26 14:41:34 -080035 ContinuousResource(ContinuousResourceId id, double value) {
36 this.id = id;
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080037 this.value = value;
38 }
39
Sho SHIMIZU7f8a7cb2016-01-27 15:09:13 -080040 // for serializer
41 ContinuousResource() {
42 this.id = null;
43 this.value = 0;
44 }
45
Sho SHIMIZU2a704512016-01-26 14:41:34 -080046 @Override
47 public ContinuousResourceId id() {
48 return id;
49 }
50
Sho SHIMIZU003ed322016-02-11 12:58:42 -080051 @Override
52 public boolean isTypeOf(Class<?> type) {
53 checkNotNull(type);
54
55 String typeName = (String) id.components().get(id.components().size() - 1);
56 return typeName.equals(type.getCanonicalName());
57 }
58
Sho SHIMIZUf33b8932016-01-25 18:43:32 -080059 /**
60 * The user of this methods must receive the return value as Double or double.
61 * Otherwise, this methods throws an exception.
62 *
63 * @param <T> type of the return value
64 * @return the volume of this resource
65 */
66 @SuppressWarnings("unchecked")
67 @Override
68 public <T> T volume() {
69 return (T) Double.valueOf(value);
70 }
71
Sho SHIMIZU2a704512016-01-26 14:41:34 -080072 /**
73 * Returns the value of the resource amount.
74 *
75 * @return the value of the resource amount
76 */
77 // FIXME: overlapping a purpose with volume()
78 public double value() {
79 return value;
80 }
81
82 @Override
Sho SHIMIZUb08d5862016-02-11 12:37:28 -080083 public boolean isSubTypeOf(Class<?> ancestor) {
Sho SHIMIZU0e1a4762016-02-11 13:04:41 -080084 checkNotNull(ancestor);
85
Sho SHIMIZU9c02f3a2016-01-29 15:11:59 -080086 String typeName = (String) id.components().get(id.components().size() - 1);
Sho SHIMIZUb08d5862016-02-11 12:37:28 -080087 boolean foundInLeaf = typeName.equals(ancestor.getCanonicalName());
Sho SHIMIZU9c02f3a2016-01-29 15:11:59 -080088 boolean foundInAncestor = id.components().subList(0, id.components().size()).stream()
89 .map(Object::getClass)
Sho SHIMIZUb08d5862016-02-11 12:37:28 -080090 .filter(x -> x.equals(ancestor))
Sho SHIMIZU9c02f3a2016-01-29 15:11:59 -080091 .findAny()
92 .isPresent();
93 return foundInAncestor || foundInLeaf;
Sho SHIMIZU2a704512016-01-26 14:41:34 -080094 }
95
96 @Override
97 public Object last() {
Sho SHIMIZU42ac51f2016-01-27 12:59:31 -080098 if (id.components().isEmpty()) {
Sho SHIMIZU2a704512016-01-26 14:41:34 -080099 return null;
100 }
Sho SHIMIZU42ac51f2016-01-27 12:59:31 -0800101 return id.components().get(id.components().size() - 1);
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800102 }
103
104 @Override
105 public DiscreteResource child(Object child) {
106 throw new UnsupportedOperationException();
107 }
108
109 @Override
110 public ContinuousResource child(Class<?> child, double value) {
111 throw new UnsupportedOperationException();
112 }
113
114 @Override
115 public Optional<DiscreteResource> parent() {
Sho SHIMIZU460b9722016-01-28 10:48:26 -0800116 return id.parent().map(x -> Resources.discrete(x).resource());
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800117 }
118
Sho SHIMIZUf33b8932016-01-25 18:43:32 -0800119 @Override
120 public int hashCode() {
Sho SHIMIZU34b55b62016-01-27 12:49:43 -0800121 return Objects.hash(id, value);
Sho SHIMIZUf33b8932016-01-25 18:43:32 -0800122 }
123
124 @Override
125 public boolean equals(Object obj) {
126 if (this == obj) {
127 return true;
128 }
129 if (obj == null || getClass() != obj.getClass()) {
130 return false;
131 }
132 final ContinuousResource other = (ContinuousResource) obj;
Sho SHIMIZU34b55b62016-01-27 12:49:43 -0800133 return Objects.equals(this.id, other.id)
Sho SHIMIZUf33b8932016-01-25 18:43:32 -0800134 && Objects.equals(this.value, other.value);
135 }
136
Sho SHIMIZU2a704512016-01-26 14:41:34 -0800137 @Override
138 public String toString() {
139 return MoreObjects.toStringHelper(this)
140 .add("id", id)
141 .add("volume", value)
142 .toString();
Sho SHIMIZUf33b8932016-01-25 18:43:32 -0800143 }
144}