2 * Copyright (c) 2018 Inocybe Technologies and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.sal.core.compat;
10 import com.google.common.util.concurrent.AbstractFuture;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import java.util.Optional;
13 import java.util.concurrent.ExecutionException;
14 import java.util.concurrent.Executor;
15 import java.util.concurrent.TimeUnit;
16 import java.util.concurrent.TimeoutException;
17 import org.opendaylight.mdsal.dom.api.DOMRpcException;
18 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
19 import org.opendaylight.yangtools.util.concurrent.ExceptionMapper;
22 * Base for a DOMRpcResult future adapter.
24 * @author Thomas Pantelis
27 @SuppressWarnings("checkstyle:ClassTypeParameterName")
28 public abstract class AbstractDOMRpcResultFutureAdapter<T extends DOMRpcResult, F extends DOMRpcResult,
29 D extends ListenableFuture<F>, E extends DOMRpcException> extends AbstractFuture<T> {
30 private final D delegate;
31 private final ExceptionMapper<E> exMapper;
32 private volatile Optional<T> result;
34 AbstractDOMRpcResultFutureAdapter(D delegate, ExceptionMapper<E> exMapper) {
35 this.delegate = delegate;
36 this.exMapper = exMapper;
39 protected abstract T transform(F fromResult);
46 public void addListener(Runnable listener, Executor executor) {
47 delegate.addListener(listener, executor);
51 public boolean cancel(boolean mayInterruptIfRunning) {
52 return delegate.cancel(mayInterruptIfRunning);
56 public boolean isCancelled() {
57 return delegate.isCancelled();
61 public boolean isDone() {
62 return delegate.isDone();
66 public T get() throws InterruptedException, ExecutionException {
68 return result.orElse(null);
72 return transformIfNecessary(delegate.get());
73 } catch (ExecutionException e) {
74 throw new ExecutionException(e.getMessage(), exMapper.apply(e));
79 public T get(final long timeout, final TimeUnit unit) throws InterruptedException, ExecutionException,
82 return result.orElse(null);
86 return transformIfNecessary(delegate.get(timeout, unit));
87 } catch (ExecutionException e) {
88 throw new ExecutionException(e.getMessage(), exMapper.apply(e));
92 private synchronized T transformIfNecessary(F delegateResult) {
94 if (delegateResult == null) {
95 result = Optional.empty();
97 result = Optional.of(transform(delegateResult));
101 return result.orElse(null);