blob: 4672d815bf5e817e25967baf36b17e844df5fc23 [file] [log] [blame]
Sho SHIMIZU32f57e92016-05-18 10:23:06 -07001/*
2 * Copyright 2016-present 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.store.resource.impl;
17
18import com.google.common.base.MoreObjects;
19import com.google.common.collect.Sets;
20import org.onosproject.net.resource.DiscreteResource;
21import org.onosproject.net.resource.DiscreteResourceId;
22import org.onosproject.net.resource.Resources;
23
24import java.util.LinkedHashSet;
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070025import java.util.Objects;
26import java.util.Optional;
27import java.util.Set;
Sho SHIMIZU9cc4a242016-05-26 12:55:35 -070028import java.util.stream.Collectors;
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070029
Sho SHIMIZUf503a622016-05-25 11:12:23 -070030final class GenericDiscreteResources implements DiscreteResources {
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070031 private final Set<DiscreteResource> values;
32
Sho SHIMIZU65de9612016-05-19 12:24:20 -070033 static DiscreteResources of(Set<DiscreteResource> resources) {
34 if (resources.isEmpty()) {
35 return DiscreteResources.empty();
36 }
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070037
Sho SHIMIZUf503a622016-05-25 11:12:23 -070038 return new GenericDiscreteResources(resources);
Sho SHIMIZU02e6e202016-05-18 10:47:47 -070039 }
40
Sho SHIMIZUf503a622016-05-25 11:12:23 -070041 private GenericDiscreteResources(Set<DiscreteResource> values) {
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070042 this.values = values;
43 }
44
Sho SHIMIZU65de9612016-05-19 12:24:20 -070045 // for serializer
Sho SHIMIZUf503a622016-05-25 11:12:23 -070046 private GenericDiscreteResources() {
Sho SHIMIZU65de9612016-05-19 12:24:20 -070047 this.values = null;
48 }
49
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070050 @Override
51 public Optional<DiscreteResource> lookup(DiscreteResourceId id) {
52 DiscreteResource resource = Resources.discrete(id).resource();
53 if (values.contains(resource)) {
54 return Optional.of(resource);
55 } else {
56 return Optional.empty();
57 }
58 }
59
60 @Override
61 public DiscreteResources difference(DiscreteResources other) {
Sho SHIMIZUecb78982016-06-07 16:10:46 -070062 if (other instanceof GenericDiscreteResources) {
63 return of(Sets.difference(this.values(), other.values()));
64 } else if (other instanceof EmptyDiscreteResources) {
65 return this;
66 }
67
68 return DiscreteResources.of(Sets.difference(this.values(), other.values()));
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070069 }
70
71 @Override
72 public boolean isEmpty() {
73 return values.isEmpty();
74 }
75
76 @Override
Sho SHIMIZU34847b72016-06-07 14:31:54 -070077 public boolean containsAny(Set<DiscreteResource> other) {
Sho SHIMIZUe3718a82016-06-07 15:29:31 -070078 return !Sets.intersection(this.values(), other).isEmpty();
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070079 }
80
81 // returns a new instance, not mutate the current instance
82 @Override
83 public DiscreteResources add(DiscreteResources other) {
84 Set<DiscreteResource> newValues = new LinkedHashSet<>(this.values);
85 newValues.addAll(other.values());
Sho SHIMIZUf503a622016-05-25 11:12:23 -070086 return new GenericDiscreteResources(newValues);
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070087 }
88
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070089 @Override
90 public Set<DiscreteResource> values() {
91 // breaks immutability, but intentionally returns the field
92 // because this class is transient
93 return values;
94 }
95
96 @Override
Sho SHIMIZU9cc4a242016-05-26 12:55:35 -070097 public <T> Set<DiscreteResource> valuesOf(Class<T> cls) {
98 return values.stream()
99 .filter(x -> x.isTypeOf(cls))
100 .collect(Collectors.toCollection(LinkedHashSet::new));
101 }
102
103 @Override
Sho SHIMIZU32f57e92016-05-18 10:23:06 -0700104 public int hashCode() {
105 return Objects.hash(values);
106 }
107
108 @Override
109 public boolean equals(Object obj) {
110 if (this == obj) {
111 return true;
112 }
113 if (obj == null || getClass() != obj.getClass()) {
114 return false;
115 }
Sho SHIMIZUf503a622016-05-25 11:12:23 -0700116 final GenericDiscreteResources other = (GenericDiscreteResources) obj;
Sho SHIMIZU32f57e92016-05-18 10:23:06 -0700117 return Objects.equals(this.values, other.values);
118 }
119
120 @Override
121 public String toString() {
122 return MoreObjects.toStringHelper(this)
123 .add("values", values)
124 .toString();
125 }
126}