X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-adapter%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fadapter%2FBindingDOMWriteTransactionAdapter.java;h=121ad0381acf3c190c3b117188fa09e2f8884a2f;hb=9918388ee26503d8516e3e6d81ac2e82794f6322;hp=eeaf5a0ceb6395c58a70035a629491b8da929ac5;hpb=ee479de332c71ae6811a9f307b0e7a3fe5e50861;p=mdsal.git diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java index eeaf5a0ceb..121ad0381a 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java @@ -7,47 +7,94 @@ */ package org.opendaylight.mdsal.binding.dom.adapter; -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; +import static com.google.common.base.Preconditions.checkArgument; -import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.FluentFuture; +import java.util.Map.Entry; import org.opendaylight.mdsal.binding.api.WriteTransaction; +import org.opendaylight.mdsal.common.api.CommitInfo; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -class BindingDOMWriteTransactionAdapter extends - AbstractWriteTransaction implements WriteTransaction { - - protected BindingDOMWriteTransactionAdapter(final T delegateTx, final BindingToNormalizedNodeCodec codec) { +class BindingDOMWriteTransactionAdapter extends AbstractForwardedTransaction + implements WriteTransaction { + BindingDOMWriteTransactionAdapter(final T delegateTx, final BindingToNormalizedNodeCodec codec) { super(delegateTx, codec); } @Override - public void put(final LogicalDatastoreType store, final InstanceIdentifier path, - final U data) { - put(store, path, data,false); + public final void put(final LogicalDatastoreType store, final InstanceIdentifier path, + final U data) { + final Entry> normalized = toNormalized("put", path, data); + getDelegate().put(store, normalized.getKey(), normalized.getValue()); } @Override - public void merge(final LogicalDatastoreType store, final InstanceIdentifier path, - final D data) { - merge(store, path, data,false); + public final void mergeParentStructurePut(final LogicalDatastoreType store, + final InstanceIdentifier path, final U data) { + final Entry> normalized = toNormalized("put", + path, data); + ensureParentsByMerge(store, normalized.getKey(), path); + getDelegate().put(store, normalized.getKey(), normalized.getValue()); } + @Override + public final void merge(final LogicalDatastoreType store, final InstanceIdentifier path, + final D data) { + final Entry> normalized = toNormalized("merge", path, data); + getDelegate().merge(store, normalized.getKey(), normalized.getValue()); + } @Override - public void delete(final LogicalDatastoreType store, final InstanceIdentifier path) { - doDelete( store, path); + public final void mergeParentStructureMerge(final LogicalDatastoreType store, + final InstanceIdentifier path, final U data) { + final Entry> normalized = toNormalized("merge", path, data); + ensureParentsByMerge(store, normalized.getKey(), path); + getDelegate().merge(store, normalized.getKey(), normalized.getValue()); } @Override - public CheckedFuture submit() { - return doSubmit(); + public final void delete(final LogicalDatastoreType store, final InstanceIdentifier path) { + checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path); + + final YangInstanceIdentifier normalized = getCodec().toYangInstanceIdentifierBlocking(path); + getDelegate().delete(store, normalized); } @Override - public boolean cancel() { - return doCancel(); + public FluentFuture commit() { + return getDelegate().commit(); + } + + @Override + public final boolean cancel() { + return getDelegate().cancel(); + } + + /** + * Subclasses of this class are required to implement creation of parent nodes based on behaviour of their + * underlying transaction. + * + * @param store an instance of LogicalDatastoreType + * @param domPath an instance of YangInstanceIdentifier + * @param path an instance of InstanceIdentifier + */ + private void ensureParentsByMerge(final LogicalDatastoreType store, final YangInstanceIdentifier domPath, + final InstanceIdentifier path) { + final YangInstanceIdentifier parentPath = domPath.getParent(); + if (parentPath != null) { + final NormalizedNode parentNode = getCodec().instanceIdentifierToNode(parentPath); + getDelegate().merge(store, YangInstanceIdentifier.create(parentNode.getIdentifier()), parentNode); + } + } + + private Entry> toNormalized( + final String operation, final InstanceIdentifier path, final U data) { + checkArgument(!path.isWildcarded(), "Cannot %s data into wildcarded path %s", operation, path); + return getCodec().toNormalizedNode(path, data); } -} \ No newline at end of file +}