blob: 94e3c627890fb309f5295bf2a8e1ebdb0a4aab8c [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;
28
Sho SHIMIZUf503a622016-05-25 11:12:23 -070029final class GenericDiscreteResources implements DiscreteResources {
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070030 private final Set<DiscreteResource> values;
31
Sho SHIMIZU65de9612016-05-19 12:24:20 -070032 static DiscreteResources of(Set<DiscreteResource> resources) {
33 if (resources.isEmpty()) {
34 return DiscreteResources.empty();
35 }
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070036
Sho SHIMIZUf503a622016-05-25 11:12:23 -070037 return new GenericDiscreteResources(resources);
Sho SHIMIZU02e6e202016-05-18 10:47:47 -070038 }
39
Sho SHIMIZUf503a622016-05-25 11:12:23 -070040 private GenericDiscreteResources(Set<DiscreteResource> values) {
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070041 this.values = values;
42 }
43
Sho SHIMIZU65de9612016-05-19 12:24:20 -070044 // for serializer
Sho SHIMIZUf503a622016-05-25 11:12:23 -070045 private GenericDiscreteResources() {
Sho SHIMIZU65de9612016-05-19 12:24:20 -070046 this.values = null;
47 }
48
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070049 @Override
50 public Optional<DiscreteResource> lookup(DiscreteResourceId id) {
51 DiscreteResource resource = Resources.discrete(id).resource();
52 if (values.contains(resource)) {
53 return Optional.of(resource);
54 } else {
55 return Optional.empty();
56 }
57 }
58
59 @Override
60 public DiscreteResources difference(DiscreteResources other) {
Sho SHIMIZUf503a622016-05-25 11:12:23 -070061 return new GenericDiscreteResources(Sets.difference(this.values, other.values()));
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070062 }
63
64 @Override
65 public boolean isEmpty() {
66 return values.isEmpty();
67 }
68
69 @Override
Sho SHIMIZU34847b72016-06-07 14:31:54 -070070 public boolean containsAny(Set<DiscreteResource> other) {
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070071 return other.stream().anyMatch(values::contains);
72 }
73
74 // returns a new instance, not mutate the current instance
75 @Override
76 public DiscreteResources add(DiscreteResources other) {
77 Set<DiscreteResource> newValues = new LinkedHashSet<>(this.values);
78 newValues.addAll(other.values());
Sho SHIMIZUf503a622016-05-25 11:12:23 -070079 return new GenericDiscreteResources(newValues);
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070080 }
81
82 // returns a new instance, not mutate the current instance
83 @Override
Sho SHIMIZU34847b72016-06-07 14:31:54 -070084 public DiscreteResources remove(Set<DiscreteResource> removed) {
85 return of(Sets.difference(this.values, removed));
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070086 }
87
88 @Override
89 public Set<DiscreteResource> values() {
90 // breaks immutability, but intentionally returns the field
91 // because this class is transient
92 return values;
93 }
94
95 @Override
96 public int hashCode() {
97 return Objects.hash(values);
98 }
99
100 @Override
101 public boolean equals(Object obj) {
102 if (this == obj) {
103 return true;
104 }
105 if (obj == null || getClass() != obj.getClass()) {
106 return false;
107 }
Sho SHIMIZUf503a622016-05-25 11:12:23 -0700108 final GenericDiscreteResources other = (GenericDiscreteResources) obj;
Sho SHIMIZU32f57e92016-05-18 10:23:06 -0700109 return Objects.equals(this.values, other.values);
110 }
111
112 @Override
113 public String toString() {
114 return MoreObjects.toStringHelper(this)
115 .add("values", values)
116 .toString();
117 }
118}