blob: 01a341d327f9511c9cea7aa21052d68a8d32d1e5 [file] [log] [blame]
Madan Jampani08706ce2015-04-01 14:49:28 -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 */
Madan Jampanif4c88502016-01-21 12:35:36 -080016package org.onosproject.store.primitives.impl;
Madan Jampani08706ce2015-04-01 14:49:28 -070017
Brian Stanke7dee11e2016-01-14 14:43:48 -050018import java.lang.reflect.Array;
Flavio Castro41b1f3a2015-07-31 13:51:32 -070019import java.util.Collection;
20import java.util.Iterator;
Madan Jampania090a112016-01-18 16:38:17 -080021import java.util.concurrent.CompletableFuture;
22import java.util.concurrent.ExecutionException;
23import java.util.concurrent.TimeUnit;
24import java.util.concurrent.TimeoutException;
Madan Jampani08706ce2015-04-01 14:49:28 -070025
Madan Jampanifa242182016-01-22 13:42:54 -080026import org.onosproject.store.service.AsyncDistributedSet;
27import org.onosproject.store.service.DistributedSet;
28import org.onosproject.store.service.SetEventListener;
29import org.onosproject.store.service.StorageException;
30import org.onosproject.store.service.Synchronous;
31
Madan Jampani08706ce2015-04-01 14:49:28 -070032/**
Madan Jampania090a112016-01-18 16:38:17 -080033 * Implementation of {@link DistributedSet} that merely delegates to a {@link AsyncDistributedSet}
34 * and waits for the operation to complete.
Madan Jampani08706ce2015-04-01 14:49:28 -070035
36 * @param <E> set element type
37 */
Madan Jampania090a112016-01-18 16:38:17 -080038public class DefaultDistributedSet<E> extends Synchronous<AsyncDistributedSet<E>> implements DistributedSet<E> {
Madan Jampani08706ce2015-04-01 14:49:28 -070039
Madan Jampania090a112016-01-18 16:38:17 -080040 private static final long OPERATION_TIMEOUT_MILLIS = 5000;
Flavio Castro41b1f3a2015-07-31 13:51:32 -070041
Madan Jampania090a112016-01-18 16:38:17 -080042 private final AsyncDistributedSet<E> asyncSet;
Madan Jampani08706ce2015-04-01 14:49:28 -070043
Madan Jampania090a112016-01-18 16:38:17 -080044 public DefaultDistributedSet(AsyncDistributedSet<E> asyncSet) {
45 super(asyncSet);
46 this.asyncSet = asyncSet;
47 }
48
49 private static <T> T complete(CompletableFuture<T> future) {
50 try {
51 return future.get(OPERATION_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
52 } catch (InterruptedException e) {
53 Thread.currentThread().interrupt();
Madan Jampanifa242182016-01-22 13:42:54 -080054 throw new StorageException.Interrupted();
Madan Jampania090a112016-01-18 16:38:17 -080055 } catch (TimeoutException e) {
Madan Jampanifa242182016-01-22 13:42:54 -080056 throw new StorageException.Timeout();
Madan Jampania090a112016-01-18 16:38:17 -080057 } catch (ExecutionException e) {
Madan Jampanifa242182016-01-22 13:42:54 -080058 if (e.getCause() instanceof StorageException) {
59 throw (StorageException) e.getCause();
Madan Jampania090a112016-01-18 16:38:17 -080060 } else {
Madan Jampanifa242182016-01-22 13:42:54 -080061 throw new StorageException(e.getCause());
Madan Jampania090a112016-01-18 16:38:17 -080062 }
63 }
Madan Jampani08706ce2015-04-01 14:49:28 -070064 }
65
66 @Override
67 public int size() {
Madan Jampania090a112016-01-18 16:38:17 -080068 return complete(asyncSet.size());
Madan Jampani08706ce2015-04-01 14:49:28 -070069 }
70
71 @Override
72 public boolean isEmpty() {
Madan Jampania090a112016-01-18 16:38:17 -080073 return complete(asyncSet.isEmpty());
Madan Jampani08706ce2015-04-01 14:49:28 -070074 }
75
Madan Jampanibff6d8f2015-03-31 16:53:47 -070076 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -070077 @Override
78 public boolean contains(Object o) {
Madan Jampania090a112016-01-18 16:38:17 -080079 return complete(asyncSet.contains((E) o));
Madan Jampani08706ce2015-04-01 14:49:28 -070080 }
81
82 @Override
83 public Iterator<E> iterator() {
Madan Jampania090a112016-01-18 16:38:17 -080084 return complete(asyncSet.getAsImmutableSet()).iterator();
Madan Jampani08706ce2015-04-01 14:49:28 -070085 }
86
87 @Override
88 public Object[] toArray() {
Madan Jampania090a112016-01-18 16:38:17 -080089 return complete(asyncSet.getAsImmutableSet()).stream().toArray();
Madan Jampani08706ce2015-04-01 14:49:28 -070090 }
91
Madan Jampania090a112016-01-18 16:38:17 -080092 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -070093 @Override
94 public <T> T[] toArray(T[] a) {
Madan Jampania090a112016-01-18 16:38:17 -080095 // TODO: Optimize this to only allocate a new array if the set size
96 // is larger than the array.length. If the set size is smaller than
97 // the array.length then copy the data into the array and set the
98 // last element in the array to be null.
99 final T[] resizedArray =
100 (T[]) Array.newInstance(a.getClass().getComponentType(), complete(asyncSet.getAsImmutableSet()).size());
101 return complete(asyncSet.getAsImmutableSet()).toArray(resizedArray);
Madan Jampani08706ce2015-04-01 14:49:28 -0700102 }
103
104 @Override
105 public boolean add(E e) {
Madan Jampania090a112016-01-18 16:38:17 -0800106 return complete(asyncSet.add(e));
Madan Jampani08706ce2015-04-01 14:49:28 -0700107 }
108
Madan Jampanibff6d8f2015-03-31 16:53:47 -0700109 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -0700110 @Override
111 public boolean remove(Object o) {
Madan Jampania090a112016-01-18 16:38:17 -0800112 return complete(asyncSet.remove((E) o));
Madan Jampani08706ce2015-04-01 14:49:28 -0700113 }
114
Madan Jampania090a112016-01-18 16:38:17 -0800115 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -0700116 @Override
117 public boolean containsAll(Collection<?> c) {
Madan Jampania090a112016-01-18 16:38:17 -0800118 return complete(asyncSet.containsAll((Collection<? extends E>) c));
Madan Jampani08706ce2015-04-01 14:49:28 -0700119 }
120
121 @Override
122 public boolean addAll(Collection<? extends E> c) {
Madan Jampania090a112016-01-18 16:38:17 -0800123 return complete(asyncSet.addAll(c));
Madan Jampani08706ce2015-04-01 14:49:28 -0700124 }
125
Madan Jampania090a112016-01-18 16:38:17 -0800126 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -0700127 @Override
128 public boolean retainAll(Collection<?> c) {
Madan Jampania090a112016-01-18 16:38:17 -0800129 return complete(asyncSet.retainAll((Collection<? extends E>) c));
Madan Jampani08706ce2015-04-01 14:49:28 -0700130 }
131
Madan Jampania090a112016-01-18 16:38:17 -0800132 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -0700133 @Override
134 public boolean removeAll(Collection<?> c) {
Madan Jampania090a112016-01-18 16:38:17 -0800135 return complete(asyncSet.removeAll((Collection<? extends E>) c));
Madan Jampani08706ce2015-04-01 14:49:28 -0700136 }
137
138 @Override
139 public void clear() {
Madan Jampania090a112016-01-18 16:38:17 -0800140 complete(asyncSet.clear());
Madan Jampani08706ce2015-04-01 14:49:28 -0700141 }
Madan Jampani50589ac2015-06-08 11:38:46 -0700142
143 @Override
144 public void addListener(SetEventListener<E> listener) {
Madan Jampania090a112016-01-18 16:38:17 -0800145 complete(asyncSet.addListener(listener));
Madan Jampani50589ac2015-06-08 11:38:46 -0700146 }
147
148 @Override
149 public void removeListener(SetEventListener<E> listener) {
Madan Jampania090a112016-01-18 16:38:17 -0800150 complete(asyncSet.removeListener(listener));
Madan Jampani50589ac2015-06-08 11:38:46 -0700151 }
Madan Jampani08706ce2015-04-01 14:49:28 -0700152}