Use mdsal's MappingCheckedFuture
[mdsal.git] / binding2 / mdsal-binding2-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / javav2 / dom / adapter / impl / data / tree / BindingDOMDataTreeCommitCohortAdapter.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.data.tree;
9
10 import com.google.common.annotations.Beta;
11 import com.google.common.base.Preconditions;
12 import com.google.common.util.concurrent.CheckedFuture;
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.ArrayList;
17 import java.util.List;
18 import java.util.function.BiConsumer;
19 import javax.annotation.Nonnull;
20 import org.opendaylight.mdsal.binding.javav2.api.DataTreeCommitCohort;
21 import org.opendaylight.mdsal.binding.javav2.api.DataTreeModification;
22 import org.opendaylight.mdsal.binding.javav2.dom.codec.impl.BindingToNormalizedNodeCodec;
23 import org.opendaylight.mdsal.binding.javav2.dom.codec.modification.LazyDataTreeModification;
24 import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
25 import org.opendaylight.mdsal.common.api.DataValidationFailedException;
26 import org.opendaylight.mdsal.common.api.MappingCheckedFuture;
27 import org.opendaylight.mdsal.common.api.PostCanCommitStep;
28 import org.opendaylight.mdsal.dom.api.DOMDataTreeCandidate;
29 import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohort;
30 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
31
32 /**
33  * Data tree commit cohort adapter.
34  *
35  * @param <T>
36  *            - {@link TreeNode} type
37  */
38 @Beta
39 public class BindingDOMDataTreeCommitCohortAdapter<T extends TreeNode> implements DOMDataTreeCommitCohort {
40
41     private final BindingToNormalizedNodeCodec codec;
42     private final DataTreeCommitCohort<T> cohort;
43
44     public BindingDOMDataTreeCommitCohortAdapter(final BindingToNormalizedNodeCodec codec,
45             final DataTreeCommitCohort<T> cohort) {
46         this.codec = Preconditions.checkNotNull(codec);
47         this.cohort = Preconditions.checkNotNull(cohort);
48     }
49
50     @Nonnull
51     @Override
52     public CheckedFuture<PostCanCommitStep, DataValidationFailedException> canCommit(@Nonnull final Object txId,
53             @Nonnull final DOMDataTreeCandidate candidate, @Nonnull final SchemaContext ctx) {
54         final DataTreeModification<T> modification = LazyDataTreeModification.create(codec, candidate);
55         final List<CheckedFuture<PostCanCommitStep, DataValidationFailedException>> futures = new ArrayList<>();
56         final BiConsumer<DataValidationFailedException, PostCanCommitStep> biConsumer = (ex, cc) -> {
57             final ListenableFuture<PostCanCommitStep> immediateFuture = Futures.immediateFuture(cc);
58             futures.add(MappingCheckedFuture.create(immediateFuture,
59                             new DataValidationFailedExceptionMapper("canCommit", candidate.getRootPath())));
60         };
61         final ListenableFuture<PostCanCommitStep> resultFuture =
62                 Futures.transform(Futures.allAsList(futures), input -> input.get(input.size() - 1),
63                         MoreExecutors.directExecutor());
64         cohort.canCommit(txId, modification, biConsumer);
65         return MappingCheckedFuture.create(resultFuture,
66                 new DataValidationFailedExceptionMapper("canCommit", candidate.getRootPath()));
67     }
68 }
69