Binding v2 - remove checked future
[mdsal.git] / binding2 / mdsal-binding2-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / javav2 / dom / adapter / impl / operation / LazyDOMOperationResultFuture.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.javav2.dom.adapter.impl.operation;
9
10 import com.google.common.annotations.Beta;
11 import com.google.common.base.Preconditions;
12 import com.google.common.util.concurrent.ListenableFuture;
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 javax.annotation.Nonnull;
18 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
19 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
20 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
21 import org.opendaylight.mdsal.dom.spi.DefaultDOMRpcResult;
22 import org.opendaylight.yangtools.yang.binding.DataContainer;
23 import org.opendaylight.yangtools.yang.common.RpcResult;
24 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
25
26 /**
27  * DOM operation result from Binding.
28  */
29 @Beta
30 final class LazyDOMOperationResultFuture implements ListenableFuture<DOMRpcResult> {
31
32     private final ListenableFuture<RpcResult<?>> bindingFuture;
33     private final BindingNormalizedNodeCodecRegistry codec;
34     private volatile DOMRpcResult result;
35
36     private LazyDOMOperationResultFuture(final ListenableFuture<RpcResult<?>> delegate,
37             final BindingNormalizedNodeCodecRegistry codec) {
38         this.bindingFuture = Preconditions.checkNotNull(delegate, "delegate");
39         this.codec = Preconditions.checkNotNull(codec, "codec");
40     }
41
42     static ListenableFuture<DOMRpcResult> create(final BindingNormalizedNodeCodecRegistry codec,
43             final ListenableFuture<RpcResult<?>> bindingResult) {
44         return new LazyDOMOperationResultFuture(bindingResult, codec);
45     }
46
47     ListenableFuture<RpcResult<?>> getBindingFuture() {
48         return bindingFuture;
49     }
50
51     @Override
52     public boolean cancel(final boolean mayInterruptIfRunning) {
53         return bindingFuture.cancel(mayInterruptIfRunning);
54     }
55
56     @Override
57     public void addListener(@Nonnull final Runnable listener, @Nonnull final Executor executor) {
58         bindingFuture.addListener(listener, executor);
59     }
60
61     @Override
62     public DOMRpcResult get() throws InterruptedException, ExecutionException {
63         if (result != null) {
64             return result;
65         }
66         return transformIfNecessary(bindingFuture.get());
67     }
68
69     @Override
70     public DOMRpcResult get(@Nonnull final long timeout, final TimeUnit unit)
71             throws InterruptedException, ExecutionException, TimeoutException {
72         if (result != null) {
73             return result;
74         }
75         return transformIfNecessary(bindingFuture.get(timeout, unit));
76     }
77
78     @Override
79     public boolean isCancelled() {
80         return bindingFuture.isCancelled();
81     }
82
83     @Override
84     public boolean isDone() {
85         return bindingFuture.isDone();
86     }
87
88     private synchronized DOMRpcResult transformIfNecessary(final RpcResult<?> input) {
89         if (result == null) {
90             result = transform(input);
91         }
92         return result;
93     }
94
95     private DOMRpcResult transform(final RpcResult<?> input) {
96         if (input.isSuccessful()) {
97             final Object inputData = input.getResult();
98             if (inputData instanceof DataContainer) {
99                 return new DefaultDOMRpcResult(codec.toNormalizedNodeOperationData((TreeNode) inputData));
100             } else {
101                 return new DefaultDOMRpcResult((NormalizedNode<?, ?>) null);
102             }
103         }
104         return new DefaultDOMRpcResult(input.getErrors());
105     }
106
107 }