Refactor binding-dom-adapter
[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.opendaylight.mdsal.binding.api.WriteTransaction;
15 import org.opendaylight.mdsal.common.api.CommitInfo;
16 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
17 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
18 import org.opendaylight.yangtools.yang.binding.DataObject;
19 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
21 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
22 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
23
24 class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> extends AbstractForwardedTransaction<T>
25         implements WriteTransaction {
26     BindingDOMWriteTransactionAdapter(final AdapterContext adapterContext, final T delegateTx) {
27         super(adapterContext, delegateTx);
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(final LogicalDatastoreType store,
39             final InstanceIdentifier<U> path, final U data) {
40         final CurrentAdapterSerializer serializer = adapterContext().currentSerializer();
41         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized(serializer, "put", path,
42             data);
43         ensureParentsByMerge(serializer, store, normalized.getKey(), path);
44         getDelegate().put(store, normalized.getKey(), normalized.getValue());
45     }
46
47     @Override
48     public final <D extends DataObject> void merge(final LogicalDatastoreType store, final InstanceIdentifier<D> path,
49             final D data) {
50         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("merge", path, data);
51         getDelegate().merge(store, normalized.getKey(), normalized.getValue());
52     }
53
54     @Override
55     public final <U extends DataObject> void mergeParentStructureMerge(final LogicalDatastoreType store,
56             final InstanceIdentifier<U> path, final U data) {
57         final CurrentAdapterSerializer serializer = adapterContext().currentSerializer();
58         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized(serializer, "merge", path,
59             data);
60         ensureParentsByMerge(serializer, store, normalized.getKey(), path);
61         getDelegate().merge(store, normalized.getKey(), normalized.getValue());
62     }
63
64     @Override
65     public final void delete(final LogicalDatastoreType store, final InstanceIdentifier<?> path) {
66         checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path);
67         getDelegate().delete(store, adapterContext().currentSerializer().toYangInstanceIdentifier(path));
68     }
69
70     @Override
71     public FluentFuture<? extends CommitInfo> commit() {
72         return getDelegate().commit();
73     }
74
75     @Override
76     public final boolean cancel() {
77         return getDelegate().cancel();
78     }
79
80     /**
81      * Subclasses of this class are required to implement creation of parent nodes based on behaviour of their
82      * underlying transaction.
83      *
84      * @param store an instance of LogicalDatastoreType
85      * @param domPath an instance of YangInstanceIdentifier
86      * @param path an instance of InstanceIdentifier
87      */
88     private void ensureParentsByMerge(final CurrentAdapterSerializer serializer, final LogicalDatastoreType store,
89             final YangInstanceIdentifier domPath, final InstanceIdentifier<?> path) {
90         final YangInstanceIdentifier parentPath = domPath.getParent();
91         if (parentPath != null && !parentPath.isEmpty()) {
92             final NormalizedNode<?, ?> parentNode = ImmutableNodes.fromInstanceId(
93                 serializer.getRuntimeContext().getSchemaContext(), parentPath);
94             getDelegate().merge(store, YangInstanceIdentifier.create(parentNode.getIdentifier()), parentNode);
95         }
96     }
97
98     private <U extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalized(
99             final String operation, final InstanceIdentifier<U> path, final U data) {
100         return toNormalized(adapterContext().currentSerializer(), operation, path, data);
101     }
102
103     private static <U extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalized(
104             final CurrentAdapterSerializer serializer, final String operation, final InstanceIdentifier<U> path,
105             final U data) {
106         checkArgument(!path.isWildcarded(), "Cannot %s data into wildcarded path %s", operation, path);
107         return serializer.toNormalizedNode(path, data);
108     }
109 }