8e217a447ea02b6ca17f023855db492db1ba3d1d
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / BindingDOMWriteTransactionAdapter.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. 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.dom.adapter;
9
10 import static com.google.common.base.Preconditions.checkArgument;
11
12 import com.google.common.util.concurrent.FluentFuture;
13 import java.util.Map.Entry;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.opendaylight.mdsal.binding.api.WriteTransaction;
16 import org.opendaylight.mdsal.common.api.CommitInfo;
17 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
18 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
19 import org.opendaylight.yangtools.yang.binding.DataObject;
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
22 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
23
24 class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> extends AbstractForwardedTransaction<T>
25         implements WriteTransaction {
26     BindingDOMWriteTransactionAdapter(final T delegateTx, final BindingToNormalizedNodeCodec codec) {
27         super(delegateTx, codec);
28     }
29
30     @Override
31     public final <U extends DataObject> void put(final LogicalDatastoreType store, final InstanceIdentifier<U> path,
32             final U data) {
33         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("put", path, data);
34         getDelegate().put(store, normalized.getKey(), normalized.getValue());
35     }
36
37     @Override
38     public final <U extends DataObject> void mergeParentStructurePut(@NonNull LogicalDatastoreType store,
39             @NonNull InstanceIdentifier<U> path, @NonNull U data) {
40         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("put",
41             path, data);
42         ensureParentsByMerge(store, normalized.getKey(), path);
43         getDelegate().put(store, normalized.getKey(), normalized.getValue());
44     }
45
46     @Override
47     public final <D extends DataObject> void merge(final LogicalDatastoreType store, final InstanceIdentifier<D> path,
48             final D data) {
49         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("merge", path, data);
50         getDelegate().merge(store, normalized.getKey(), normalized.getValue());
51     }
52
53     @Override
54     public final <U extends DataObject> void mergeParentStructureMerge(@NonNull LogicalDatastoreType store,
55             @NonNull InstanceIdentifier<U> path, @NonNull U data) {
56         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("merge", path, data);
57         ensureParentsByMerge(store, normalized.getKey(), path);
58         getDelegate().merge(store, normalized.getKey(), normalized.getValue());
59     }
60
61     @Override
62     public final void delete(final LogicalDatastoreType store, final InstanceIdentifier<?> path) {
63         checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path);
64
65         final YangInstanceIdentifier normalized = getCodec().toYangInstanceIdentifierBlocking(path);
66         getDelegate().delete(store, normalized);
67     }
68
69     @Override
70     public @NonNull FluentFuture<? extends @NonNull CommitInfo> commit() {
71         return getDelegate().commit();
72     }
73
74     @Override
75     public final boolean cancel() {
76         return getDelegate().cancel();
77     }
78
79     /**
80      * Subclasses of this class are required to implement creation of parent nodes based on behaviour of their
81      * underlying transaction.
82      *
83      * @param store an instance of LogicalDatastoreType
84      * @param domPath an instance of YangInstanceIdentifier
85      * @param path an instance of InstanceIdentifier
86      */
87     private void ensureParentsByMerge(final LogicalDatastoreType store, final YangInstanceIdentifier domPath,
88             final InstanceIdentifier<?> path) {
89         final YangInstanceIdentifier parentPath = domPath.getParent();
90         if (parentPath != null) {
91             final NormalizedNode<?, ?> parentNode = getCodec().instanceIdentifierToNode(parentPath);
92             getDelegate().merge(store, YangInstanceIdentifier.create(parentNode.getIdentifier()), parentNode);
93         }
94     }
95
96     private <U extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalized(
97             final String operation, final InstanceIdentifier<U> path, final U data) {
98         checkArgument(!path.isWildcarded(), "Cannot %s data into wildcarded path %s", operation, path);
99         return getCodec().toNormalizedNode(path, data);
100     }
101 }