blob: 3307f384b3ea77cf95031ebfb911581aba78bbbf [file] [log] [blame]
Madan Jampani08706ce2015-04-01 14:49:28 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Madan Jampani08706ce2015-04-01 14:49:28 -07003 *
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 Jampani538be742016-02-10 14:55:38 -080016package org.onosproject.store.primitives;
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 Jampani538be742016-02-10 14:55:38 -080040 private final long operationTimeoutMillis;
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 Jampani538be742016-02-10 14:55:38 -080044 public DefaultDistributedSet(AsyncDistributedSet<E> asyncSet, long operationTimeoutMillis) {
Madan Jampania090a112016-01-18 16:38:17 -080045 super(asyncSet);
46 this.asyncSet = asyncSet;
Madan Jampani538be742016-02-10 14:55:38 -080047 this.operationTimeoutMillis = operationTimeoutMillis;
Madan Jampani08706ce2015-04-01 14:49:28 -070048 }
49
50 @Override
51 public int size() {
Madan Jampania090a112016-01-18 16:38:17 -080052 return complete(asyncSet.size());
Madan Jampani08706ce2015-04-01 14:49:28 -070053 }
54
55 @Override
56 public boolean isEmpty() {
Madan Jampania090a112016-01-18 16:38:17 -080057 return complete(asyncSet.isEmpty());
Madan Jampani08706ce2015-04-01 14:49:28 -070058 }
59
Madan Jampanibff6d8f2015-03-31 16:53:47 -070060 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -070061 @Override
62 public boolean contains(Object o) {
Madan Jampania090a112016-01-18 16:38:17 -080063 return complete(asyncSet.contains((E) o));
Madan Jampani08706ce2015-04-01 14:49:28 -070064 }
65
66 @Override
67 public Iterator<E> iterator() {
Madan Jampania090a112016-01-18 16:38:17 -080068 return complete(asyncSet.getAsImmutableSet()).iterator();
Madan Jampani08706ce2015-04-01 14:49:28 -070069 }
70
71 @Override
72 public Object[] toArray() {
Madan Jampania090a112016-01-18 16:38:17 -080073 return complete(asyncSet.getAsImmutableSet()).stream().toArray();
Madan Jampani08706ce2015-04-01 14:49:28 -070074 }
75
Madan Jampania090a112016-01-18 16:38:17 -080076 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -070077 @Override
78 public <T> T[] toArray(T[] a) {
Madan Jampania090a112016-01-18 16:38:17 -080079 // TODO: Optimize this to only allocate a new array if the set size
80 // is larger than the array.length. If the set size is smaller than
81 // the array.length then copy the data into the array and set the
82 // last element in the array to be null.
83 final T[] resizedArray =
84 (T[]) Array.newInstance(a.getClass().getComponentType(), complete(asyncSet.getAsImmutableSet()).size());
85 return complete(asyncSet.getAsImmutableSet()).toArray(resizedArray);
Madan Jampani08706ce2015-04-01 14:49:28 -070086 }
87
88 @Override
89 public boolean add(E e) {
Madan Jampania090a112016-01-18 16:38:17 -080090 return complete(asyncSet.add(e));
Madan Jampani08706ce2015-04-01 14:49:28 -070091 }
92
Madan Jampanibff6d8f2015-03-31 16:53:47 -070093 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -070094 @Override
95 public boolean remove(Object o) {
Madan Jampania090a112016-01-18 16:38:17 -080096 return complete(asyncSet.remove((E) o));
Madan Jampani08706ce2015-04-01 14:49:28 -070097 }
98
Madan Jampania090a112016-01-18 16:38:17 -080099 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -0700100 @Override
101 public boolean containsAll(Collection<?> c) {
Madan Jampania090a112016-01-18 16:38:17 -0800102 return complete(asyncSet.containsAll((Collection<? extends E>) c));
Madan Jampani08706ce2015-04-01 14:49:28 -0700103 }
104
105 @Override
106 public boolean addAll(Collection<? extends E> c) {
Madan Jampania090a112016-01-18 16:38:17 -0800107 return complete(asyncSet.addAll(c));
Madan Jampani08706ce2015-04-01 14:49:28 -0700108 }
109
Madan Jampania090a112016-01-18 16:38:17 -0800110 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -0700111 @Override
112 public boolean retainAll(Collection<?> c) {
Madan Jampania090a112016-01-18 16:38:17 -0800113 return complete(asyncSet.retainAll((Collection<? extends E>) c));
Madan Jampani08706ce2015-04-01 14:49:28 -0700114 }
115
Madan Jampania090a112016-01-18 16:38:17 -0800116 @SuppressWarnings("unchecked")
Madan Jampani08706ce2015-04-01 14:49:28 -0700117 @Override
118 public boolean removeAll(Collection<?> c) {
Madan Jampania090a112016-01-18 16:38:17 -0800119 return complete(asyncSet.removeAll((Collection<? extends E>) c));
Madan Jampani08706ce2015-04-01 14:49:28 -0700120 }
121
122 @Override
123 public void clear() {
Madan Jampania090a112016-01-18 16:38:17 -0800124 complete(asyncSet.clear());
Madan Jampani08706ce2015-04-01 14:49:28 -0700125 }
Madan Jampani50589ac2015-06-08 11:38:46 -0700126
127 @Override
128 public void addListener(SetEventListener<E> listener) {
Madan Jampania090a112016-01-18 16:38:17 -0800129 complete(asyncSet.addListener(listener));
Madan Jampani50589ac2015-06-08 11:38:46 -0700130 }
131
132 @Override
133 public void removeListener(SetEventListener<E> listener) {
Madan Jampania090a112016-01-18 16:38:17 -0800134 complete(asyncSet.removeListener(listener));
Madan Jampani50589ac2015-06-08 11:38:46 -0700135 }
Madan Jampani538be742016-02-10 14:55:38 -0800136
137 private <T> T complete(CompletableFuture<T> future) {
138 try {
139 return future.get(operationTimeoutMillis, TimeUnit.MILLISECONDS);
140 } catch (InterruptedException e) {
141 Thread.currentThread().interrupt();
142 throw new StorageException.Interrupted();
143 } catch (TimeoutException e) {
144 throw new StorageException.Timeout();
145 } catch (ExecutionException e) {
146 if (e.getCause() instanceof StorageException) {
147 throw (StorageException) e.getCause();
148 } else {
149 throw new StorageException(e.getCause());
150 }
151 }
152 }
Madan Jampani08706ce2015-04-01 14:49:28 -0700153}