blob: 333a40b20c2ae658288afa3ee3a56ca4d9835bc8 [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;
25import java.util.List;
26import java.util.Objects;
27import java.util.Optional;
28import java.util.Set;
29
30final class NonEncodableDiscreteResources implements DiscreteResources {
31 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 SHIMIZU02e6e202016-05-18 10:47:47 -070038 return new NonEncodableDiscreteResources(resources);
39 }
40
Sho SHIMIZU32f57e92016-05-18 10:23:06 -070041 private NonEncodableDiscreteResources(Set<DiscreteResource> values) {
42 this.values = values;
43 }
44
Sho SHIMIZU65de9612016-05-19 12:24:20 -070045 // for serializer
46 private NonEncodableDiscreteResources() {
47 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) {
62 return new NonEncodableDiscreteResources(Sets.difference(this.values, other.values()));
63 }
64
65 @Override
66 public boolean isEmpty() {
67 return values.isEmpty();
68 }
69
70 @Override
71 public boolean containsAny(List<DiscreteResource> other) {
72 return other.stream().anyMatch(values::contains);
73 }
74
75 // returns a new instance, not mutate the current instance
76 @Override
77 public DiscreteResources add(DiscreteResources other) {
78 Set<DiscreteResource> newValues = new LinkedHashSet<>(this.values);
79 newValues.addAll(other.values());
80 return new NonEncodableDiscreteResources(newValues);
81 }
82
83 // returns a new instance, not mutate the current instance
84 @Override
85 public DiscreteResources remove(List<DiscreteResource> removed) {
86 Set<DiscreteResource> newValues = new LinkedHashSet<>(this.values);
87 newValues.removeAll(removed);
88 return new NonEncodableDiscreteResources(newValues);
89 }
90
91 @Override
92 public Set<DiscreteResource> values() {
93 // breaks immutability, but intentionally returns the field
94 // because this class is transient
95 return values;
96 }
97
98 @Override
99 public int hashCode() {
100 return Objects.hash(values);
101 }
102
103 @Override
104 public boolean equals(Object obj) {
105 if (this == obj) {
106 return true;
107 }
108 if (obj == null || getClass() != obj.getClass()) {
109 return false;
110 }
111 final NonEncodableDiscreteResources other = (NonEncodableDiscreteResources) obj;
112 return Objects.equals(this.values, other.values);
113 }
114
115 @Override
116 public String toString() {
117 return MoreObjects.toStringHelper(this)
118 .add("values", values)
119 .toString();
120 }
121}