blob: e09b6249fc57c876ff39f09fb01186183b21ca99 [file] [log] [blame]
Madan Jampani7c521002015-03-23 12:23:01 -07001/*
2 * Copyright 2015 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 */
16
Madan Jampanif4c88502016-01-21 12:35:36 -080017package org.onosproject.store.primitives.impl;
Madan Jampani7c521002015-03-23 12:23:01 -070018
19import java.util.Collection;
Madan Jampanie1065222015-08-17 16:21:51 -070020import java.util.Map;
Madan Jampani7c521002015-03-23 12:23:01 -070021import java.util.Map.Entry;
Madan Jampanifa242182016-01-22 13:42:54 -080022import java.util.Set;
Madan Jampani7c521002015-03-23 12:23:01 -070023import java.util.concurrent.CompletableFuture;
24import java.util.concurrent.ExecutionException;
25import java.util.concurrent.TimeUnit;
26import java.util.concurrent.TimeoutException;
Madan Jampani346d4f52015-05-04 11:09:39 -070027import java.util.function.BiFunction;
28import java.util.function.Function;
29import java.util.function.Predicate;
Madan Jampani7c521002015-03-23 12:23:01 -070030
Madan Jampanif95290a2016-01-27 21:06:11 -080031import org.onosproject.store.primitives.ConsistentMapBackedJavaMap;
Madan Jampania090a112016-01-18 16:38:17 -080032import org.onosproject.store.service.AsyncConsistentMap;
Madan Jampani7c521002015-03-23 12:23:01 -070033import org.onosproject.store.service.ConsistentMap;
34import org.onosproject.store.service.ConsistentMapException;
Madan Jampani50589ac2015-06-08 11:38:46 -070035import org.onosproject.store.service.MapEventListener;
Madan Jampania090a112016-01-18 16:38:17 -080036import org.onosproject.store.service.Synchronous;
Madan Jampani7c521002015-03-23 12:23:01 -070037import org.onosproject.store.service.Versioned;
38
39/**
Madan Jampanifa242182016-01-22 13:42:54 -080040 * Default implementation of {@code ConsistentMap}.
Madan Jampani7c521002015-03-23 12:23:01 -070041 *
42 * @param <K> type of key.
43 * @param <V> type of value.
44 */
Madan Jampania090a112016-01-18 16:38:17 -080045public class DefaultConsistentMap<K, V> extends Synchronous<AsyncConsistentMap<K, V>> implements ConsistentMap<K, V> {
Madan Jampani7c521002015-03-23 12:23:01 -070046
47 private static final int OPERATION_TIMEOUT_MILLIS = 5000;
48
Madan Jampanifa242182016-01-22 13:42:54 -080049 private final AsyncConsistentMap<K, V> asyncMap;
Madan Jampanie1065222015-08-17 16:21:51 -070050 private Map<K, V> javaMap;
Madan Jampani7c521002015-03-23 12:23:01 -070051
Madan Jampanifa242182016-01-22 13:42:54 -080052 public DefaultConsistentMap(AsyncConsistentMap<K, V> asyncMap) {
Madan Jampania090a112016-01-18 16:38:17 -080053 super(asyncMap);
Madan Jampani50589ac2015-06-08 11:38:46 -070054 this.asyncMap = asyncMap;
Madan Jampani7c521002015-03-23 12:23:01 -070055 }
56
57 @Override
58 public int size() {
59 return complete(asyncMap.size());
60 }
61
62 @Override
63 public boolean isEmpty() {
64 return complete(asyncMap.isEmpty());
65 }
66
67 @Override
68 public boolean containsKey(K key) {
69 return complete(asyncMap.containsKey(key));
70 }
71
72 @Override
73 public boolean containsValue(V value) {
74 return complete(asyncMap.containsValue(value));
75 }
76
77 @Override
78 public Versioned<V> get(K key) {
79 return complete(asyncMap.get(key));
80 }
81
82 @Override
Madan Jampani346d4f52015-05-04 11:09:39 -070083 public Versioned<V> computeIfAbsent(K key,
84 Function<? super K, ? extends V> mappingFunction) {
85 return complete(asyncMap.computeIfAbsent(key, mappingFunction));
86 }
87
88 @Override
89 public Versioned<V> computeIfPresent(K key,
90 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
91 return complete(asyncMap.computeIfPresent(key, remappingFunction));
92 }
93
94 @Override
95 public Versioned<V> compute(K key,
96 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
97 return complete(asyncMap.compute(key, remappingFunction));
98 }
99
100 @Override
101 public Versioned<V> computeIf(K key,
102 Predicate<? super V> condition,
103 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
104 return complete(asyncMap.computeIf(key, condition, remappingFunction));
105 }
106
107 @Override
Madan Jampani7c521002015-03-23 12:23:01 -0700108 public Versioned<V> put(K key, V value) {
109 return complete(asyncMap.put(key, value));
110 }
111
112 @Override
Madan Jampani346d4f52015-05-04 11:09:39 -0700113 public Versioned<V> putAndGet(K key, V value) {
114 return complete(asyncMap.putAndGet(key, value));
115 }
116
117 @Override
Madan Jampani7c521002015-03-23 12:23:01 -0700118 public Versioned<V> remove(K key) {
119 return complete(asyncMap.remove(key));
120 }
121
122 @Override
123 public void clear() {
124 complete(asyncMap.clear());
125 }
126
127 @Override
128 public Set<K> keySet() {
129 return complete(asyncMap.keySet());
130 }
131
132 @Override
133 public Collection<Versioned<V>> values() {
134 return complete(asyncMap.values());
135 }
136
137 @Override
138 public Set<Entry<K, Versioned<V>>> entrySet() {
139 return complete(asyncMap.entrySet());
140 }
141
142 @Override
143 public Versioned<V> putIfAbsent(K key, V value) {
144 return complete(asyncMap.putIfAbsent(key, value));
145 }
146
147 @Override
148 public boolean remove(K key, V value) {
149 return complete(asyncMap.remove(key, value));
150 }
151
152 @Override
153 public boolean remove(K key, long version) {
154 return complete(asyncMap.remove(key, version));
155 }
156
157 @Override
Jihwan Kim9887ad92015-12-12 00:23:57 +0900158 public Versioned<V> replace(K key, V value) {
159 return complete(asyncMap.replace(key, value));
160 }
161
162 @Override
Madan Jampani7c521002015-03-23 12:23:01 -0700163 public boolean replace(K key, V oldValue, V newValue) {
164 return complete(asyncMap.replace(key, oldValue, newValue));
165 }
166
167 @Override
168 public boolean replace(K key, long oldVersion, V newValue) {
169 return complete(asyncMap.replace(key, oldVersion, newValue));
170 }
171
Madan Jampanifa242182016-01-22 13:42:54 -0800172 @Override
173 public void addListener(MapEventListener<K, V> listener) {
174 complete(asyncMap.addListener(listener));
175 }
176
177 @Override
178 public void removeListener(MapEventListener<K, V> listener) {
179 complete(asyncMap.addListener(listener));
180 }
181
182 @Override
183 public Map<K, V> asJavaMap() {
184 synchronized (this) {
185 if (javaMap == null) {
186 javaMap = new ConsistentMapBackedJavaMap<>(this);
187 }
188 }
189 return javaMap;
190 }
191
HIGUCHI Yutadc4394c2016-01-29 15:35:10 -0800192 @Override
193 public String toString() {
194 return asJavaMap().toString();
195 }
196
Madan Jampani7c521002015-03-23 12:23:01 -0700197 private static <T> T complete(CompletableFuture<T> future) {
198 try {
199 return future.get(OPERATION_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
200 } catch (InterruptedException e) {
201 Thread.currentThread().interrupt();
202 throw new ConsistentMapException.Interrupted();
203 } catch (TimeoutException e) {
204 throw new ConsistentMapException.Timeout();
205 } catch (ExecutionException e) {
Madan Jampani346d4f52015-05-04 11:09:39 -0700206 if (e.getCause() instanceof ConsistentMapException) {
207 throw (ConsistentMapException) e.getCause();
208 } else {
209 throw new ConsistentMapException(e.getCause());
210 }
Madan Jampani7c521002015-03-23 12:23:01 -0700211 }
212 }
Madan Jampani7c521002015-03-23 12:23:01 -0700213}