2 * Copyright (c) 2018 Pantheon Technologies, s.r.o. 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.mdsal.binding.dom.adapter;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.util.concurrent.AbstractFuture;
13 import com.google.common.util.concurrent.Futures;
14 import com.google.common.util.concurrent.ListenableFuture;
15 import com.google.common.util.concurrent.MoreExecutors;
16 import java.util.concurrent.ExecutionException;
17 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
18 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
19 import org.opendaylight.yangtools.yang.binding.Action;
20 import org.opendaylight.yangtools.yang.binding.RpcOutput;
21 import org.opendaylight.yangtools.yang.common.RpcResult;
22 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
24 final class BindingOperationFluentFuture<O extends RpcOutput> extends AbstractFuture<DOMRpcResult>
25 implements BindingRpcFutureAware {
26 private final ListenableFuture<RpcResult<O>> userFuture;
27 private final Class<? extends Action<?, ?, O>> action;
28 private final NodeIdentifier identifier;
30 private AdapterContext adapterContext;
32 BindingOperationFluentFuture(final ListenableFuture<RpcResult<O>> userFuture,
33 final Class<? extends Action<?, ?, O>> action, final NodeIdentifier identifier,
34 final AdapterContext adapterContext) {
35 this.userFuture = requireNonNull(userFuture);
36 this.action = requireNonNull(action);
37 this.identifier = requireNonNull(identifier);
38 this.adapterContext = requireNonNull(adapterContext);
39 userFuture.addListener(this::userFutureCompleted, MoreExecutors.directExecutor());
42 @SuppressWarnings({ "rawtypes", "unchecked" })
44 public ListenableFuture<RpcResult<?>> getBindingFuture() {
45 return (ListenableFuture) userFuture;
48 @SuppressWarnings("checkstyle:illegalCatch")
49 private void userFutureCompleted() {
50 final DOMRpcResult domResult;
53 final var bindingResult = Futures.getDone(userFuture);
54 final var bindingValue = bindingResult.getResult();
55 domResult = new DefaultDOMRpcResult(bindingValue == null ? null
56 : adapterContext.currentSerializer().toLazyNormalizedNodeActionOutput(action, identifier, bindingValue),
57 bindingResult.getErrors());
58 } catch (ExecutionException e) {
59 adapterContext = null;
60 setException(e.getCause());
62 } catch (RuntimeException | Error e) {
63 adapterContext = null;
68 adapterContext = null;