blob: 1f0f62d3d3eed07d5dd18da802ba3ad0b50644ec [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;
Madan Jampani37fa33c2016-06-15 16:25:23 -070020
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070021import org.onosproject.net.resource.DiscreteResource;
22import org.onosproject.net.resource.DiscreteResourceId;
23import org.onosproject.net.resource.Resources;
24
25import java.util.LinkedHashSet;
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070026import java.util.Objects;
27import java.util.Optional;
28import java.util.Set;
Sho SHIMIZU9cc4a242016-05-26 12:55:35 -070029import java.util.stream.Collectors;
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070030
Sho SHIMIZUf503a622016-05-25 11:12:23 -070031final class GenericDiscreteResources implements DiscreteResources {
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070032 private final Set<DiscreteResource> values;
33
Sho SHIMIZU65de9612016-05-19 12:24:20 -070034 static DiscreteResources of(Set<DiscreteResource> resources) {
35 if (resources.isEmpty()) {
36 return DiscreteResources.empty();
37 }
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070038
Sho SHIMIZUf503a622016-05-25 11:12:23 -070039 return new GenericDiscreteResources(resources);
Sho SHIMIZU02e6e202016-05-18 10:47:47 -070040 }
41
Sho SHIMIZUf503a622016-05-25 11:12:23 -070042 private GenericDiscreteResources(Set<DiscreteResource> values) {
Sho SHIMIZU4920d052016-06-16 14:26:35 -070043 this.values = values;
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070044 }
45
Sho SHIMIZU65de9612016-05-19 12:24:20 -070046 // for serializer
Sho SHIMIZUf503a622016-05-25 11:12:23 -070047 private GenericDiscreteResources() {
Sho SHIMIZU65de9612016-05-19 12:24:20 -070048 this.values = null;
49 }
50
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070051 @Override
52 public Optional<DiscreteResource> lookup(DiscreteResourceId id) {
53 DiscreteResource resource = Resources.discrete(id).resource();
54 if (values.contains(resource)) {
55 return Optional.of(resource);
56 } else {
57 return Optional.empty();
58 }
59 }
60
61 @Override
62 public DiscreteResources difference(DiscreteResources other) {
Sho SHIMIZUecb78982016-06-07 16:10:46 -070063 if (other instanceof GenericDiscreteResources) {
Sho SHIMIZU4920d052016-06-16 14:26:35 -070064 // make sure that the set is serializable
65 return of(new LinkedHashSet<>(Sets.difference(this.values(), other.values())));
Sho SHIMIZUecb78982016-06-07 16:10:46 -070066 } else if (other instanceof EmptyDiscreteResources) {
67 return this;
68 }
69
70 return DiscreteResources.of(Sets.difference(this.values(), other.values()));
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070071 }
72
73 @Override
74 public boolean isEmpty() {
75 return values.isEmpty();
76 }
77
78 @Override
Sho SHIMIZU34847b72016-06-07 14:31:54 -070079 public boolean containsAny(Set<DiscreteResource> other) {
Sho SHIMIZUe3718a82016-06-07 15:29:31 -070080 return !Sets.intersection(this.values(), other).isEmpty();
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070081 }
82
83 // returns a new instance, not mutate the current instance
84 @Override
85 public DiscreteResources add(DiscreteResources other) {
Sho SHIMIZU9e3031a2016-06-07 16:32:06 -070086 if (other instanceof GenericDiscreteResources) {
Sho SHIMIZU4920d052016-06-16 14:26:35 -070087 // make sure that the set is serializable
88 return of(new LinkedHashSet<>(Sets.union(this.values(), other.values())));
Sho SHIMIZU9e3031a2016-06-07 16:32:06 -070089 } else if (other instanceof EmptyDiscreteResources) {
90 return this;
91 }
92
93 return DiscreteResources.of(Sets.union(this.values(), other.values()));
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070094 }
95
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070096 @Override
97 public Set<DiscreteResource> values() {
98 // breaks immutability, but intentionally returns the field
99 // because this class is transient
100 return values;
101 }
102
103 @Override
Sho SHIMIZU9cc4a242016-05-26 12:55:35 -0700104 public <T> Set<DiscreteResource> valuesOf(Class<T> cls) {
105 return values.stream()
106 .filter(x -> x.isTypeOf(cls))
107 .collect(Collectors.toCollection(LinkedHashSet::new));
108 }
109
110 @Override
Sho SHIMIZU32f57e92016-05-18 10:23:06 -0700111 public int hashCode() {
112 return Objects.hash(values);
113 }
114
115 @Override
116 public boolean equals(Object obj) {
117 if (this == obj) {
118 return true;
119 }
120 if (obj == null || getClass() != obj.getClass()) {
121 return false;
122 }
Sho SHIMIZUf503a622016-05-25 11:12:23 -0700123 final GenericDiscreteResources other = (GenericDiscreteResources) obj;
Sho SHIMIZU32f57e92016-05-18 10:23:06 -0700124 return Objects.equals(this.values, other.values);
125 }
126
127 @Override
128 public String toString() {
129 return MoreObjects.toStringHelper(this)
130 .add("values", values)
131 .toString();
132 }
133}