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.DOMActionResult;
18 import org.opendaylight.mdsal.dom.spi.SimpleDOMActionResult;
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<DOMActionResult>
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 DOMActionResult domResult;
53 final RpcResult<O> bindingResult = Futures.getDone(userFuture);
54 if (bindingResult.getResult() != null) {
55 domResult = new SimpleDOMActionResult(adapterContext.currentSerializer()
56 .toLazyNormalizedNodeActionOutput(action, identifier, bindingResult.getResult()),
57 bindingResult.getErrors());
59 domResult = new SimpleDOMActionResult(bindingResult.getErrors());
61 } catch (ExecutionException e) {
62 adapterContext = null;
63 setException(e.getCause());
65 } catch (RuntimeException | Error e) {
66 adapterContext = null;
71 adapterContext = null;