2 * Copyright (c) 2014 Cisco Systems, Inc. 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 com.google.common.base.Preconditions.checkArgument;
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;
24 class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> extends AbstractForwardedTransaction<T>
25 implements WriteTransaction {
26 BindingDOMWriteTransactionAdapter(final AdapterContext adapterContext, final T delegateTx) {
27 super(adapterContext, delegateTx);
31 public final <U extends DataObject> void put(final LogicalDatastoreType store, final InstanceIdentifier<U> path,
33 final Entry<YangInstanceIdentifier, NormalizedNode> normalized = toNormalized("put", path, data);
34 getDelegate().put(store, normalized.getKey(), normalized.getValue());
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, data);
42 ensureParentsByMerge(serializer, store, normalized.getKey(), path);
43 getDelegate().put(store, normalized.getKey(), normalized.getValue());
47 public final <D extends DataObject> void merge(final LogicalDatastoreType store, final InstanceIdentifier<D> path,
49 final Entry<YangInstanceIdentifier, NormalizedNode> normalized = toNormalized("merge", path, data);
50 getDelegate().merge(store, normalized.getKey(), normalized.getValue());
54 public final <U extends DataObject> void mergeParentStructureMerge(final LogicalDatastoreType store,
55 final InstanceIdentifier<U> path, final U data) {
56 final CurrentAdapterSerializer serializer = adapterContext().currentSerializer();
57 final Entry<YangInstanceIdentifier, NormalizedNode> normalized = toNormalized(serializer, "merge", path, data);
58 ensureParentsByMerge(serializer, store, normalized.getKey(), path);
59 getDelegate().merge(store, normalized.getKey(), normalized.getValue());
63 public final void delete(final LogicalDatastoreType store, final InstanceIdentifier<?> path) {
64 checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path);
65 getDelegate().delete(store, adapterContext().currentSerializer().toYangInstanceIdentifier(path));
69 public FluentFuture<? extends CommitInfo> commit() {
70 return getDelegate().commit();
74 public final boolean cancel() {
75 return getDelegate().cancel();
79 * Subclasses of this class are required to implement creation of parent nodes based on behaviour of their
80 * underlying transaction.
82 * @param store an instance of LogicalDatastoreType
83 * @param domPath an instance of YangInstanceIdentifier
84 * @param path an instance of InstanceIdentifier
86 private void ensureParentsByMerge(final CurrentAdapterSerializer serializer, final LogicalDatastoreType store,
87 final YangInstanceIdentifier domPath, final InstanceIdentifier<?> path) {
88 final YangInstanceIdentifier parentPath = domPath.getParent();
89 if (parentPath != null && !parentPath.isEmpty()) {
90 final NormalizedNode parentNode = ImmutableNodes.fromInstanceId(
91 serializer.getRuntimeContext().getEffectiveModelContext(), parentPath);
92 getDelegate().merge(store, YangInstanceIdentifier.create(parentNode.getIdentifier()), parentNode);
96 private <U extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode> toNormalized(final String operation,
97 final InstanceIdentifier<U> path, final U data) {
98 return toNormalized(adapterContext().currentSerializer(), operation, path, data);
101 private static <U extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode> toNormalized(
102 final CurrentAdapterSerializer serializer, final String operation, final InstanceIdentifier<U> path,
104 checkArgument(!path.isWildcarded(), "Cannot %s data into wildcarded path %s", operation, path);
105 return serializer.toNormalizedNode(path, data);