X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fbinding%2Fimpl%2FAbstractWriteTransaction.java;h=d66eb1c79a9c0b6bfe21ab4a46d6d89d13f839be;hp=9eceeb1e436b96fd1e063e8b79e3a96bcaf54c94;hb=4ad8e1880cfee424eac9e4f12e461d98445a6e44;hpb=156015d027bd716b16b37ec90e129a603d59c477 diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractWriteTransaction.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractWriteTransaction.java index 9eceeb1e43..d66eb1c79a 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractWriteTransaction.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractWriteTransaction.java @@ -7,51 +7,61 @@ */ package org.opendaylight.controller.md.sal.binding.impl; -import java.util.Collections; -import java.util.Map.Entry; +import static com.google.common.base.Preconditions.checkArgument; -import org.opendaylight.controller.md.sal.common.api.TransactionStatus; +import com.google.common.base.Optional; +import com.google.common.util.concurrent.FluentFuture; +import java.util.Map.Entry; +import org.gaul.modernizer_maven_annotations.SuppressModernizer; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; +import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.Identifiable; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Optional; -import com.google.common.collect.Iterables; -import com.google.common.util.concurrent.ListenableFuture; /** - * - * Abstract Base Transaction for transactions which are backed by - * {@link DOMDataWriteTransaction} + * Abstract Base Transaction for transactions which are backed by {@link DOMDataWriteTransaction}. */ -public class AbstractWriteTransaction extends +@Deprecated +public abstract class AbstractWriteTransaction extends AbstractForwardedTransaction { - private static final Logger LOG = LoggerFactory.getLogger(AbstractWriteTransaction.class); - - protected AbstractWriteTransaction(final T delegate, - final BindingToNormalizedNodeCodec codec) { + protected AbstractWriteTransaction(final T delegate, final BindingToNormalizedNodeCodec codec) { super(delegate, codec); } - protected final void doPut(final LogicalDatastoreType store, - final InstanceIdentifier path, final DataObject data) { - final Entry> normalized = getCodec() - .toNormalizedNode(path, data); - ensureListParentIfNeeded(store,path,normalized); + public final void put(final LogicalDatastoreType store, + final InstanceIdentifier path, final U data, final boolean createParents) { + checkArgument(!path.isWildcarded(), "Cannot put data into wildcarded path %s", path); + + final Entry> normalized = getCodec().toNormalizedNode(path, data); + if (createParents) { + ensureParentsByMerge(store, normalized.getKey(), path); + } else { + ensureListParentIfNeeded(store,path,normalized); + } + getDelegate().put(store, normalized.getKey(), normalized.getValue()); } + public final void merge(final LogicalDatastoreType store, + final InstanceIdentifier path, final U data,final boolean createParents) { + checkArgument(!path.isWildcarded(), "Cannot merge data into wildcarded path %s", path); + + final Entry> normalized = getCodec().toNormalizedNode(path, data); + if (createParents) { + ensureParentsByMerge(store, normalized.getKey(), path); + } else { + ensureListParentIfNeeded(store,path,normalized); + } + + getDelegate().merge(store, normalized.getKey(), normalized.getValue()); + } /** - * * Ensures list parent if item is list, otherwise noop. * *

@@ -73,7 +83,7 @@ public class AbstractWriteTransaction extends * put("/nodes/node/node[key]",domNode); * * - * + *

* In order to allow that to be inserted if necessary, if we know * item is list item, we will try to merge empty MapNode or OrderedNodeMap * to ensure list exists. @@ -83,51 +93,47 @@ public class AbstractWriteTransaction extends * @param normalized Normalized version of data to be written */ private void ensureListParentIfNeeded(final LogicalDatastoreType store, final InstanceIdentifier path, - final Entry> normalized) { - if(Identifiable.class.isAssignableFrom(path.getTargetType())) { - org.opendaylight.yangtools.yang.data.api.InstanceIdentifier parentMapPath = getParent(normalized.getKey()).get(); + final Entry> normalized) { + if (Identifiable.class.isAssignableFrom(path.getTargetType())) { + YangInstanceIdentifier parentMapPath = normalized.getKey().getParent(); + checkArgument(parentMapPath != null, "Map path %s does not have a parent", path); + NormalizedNode emptyParent = getCodec().getDefaultNodeFor(parentMapPath); getDelegate().merge(store, parentMapPath, emptyParent); } - } - // FIXME (should be probaly part of InstanceIdentifier) - protected static Optional getParent( - final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier child) { - - Iterable mapEntryItemPath = child.getPathArguments(); - int parentPathSize = Iterables.size(mapEntryItemPath) - 1; - if(parentPathSize > 1) { - return Optional.of(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.create(Iterables.limit(mapEntryItemPath, parentPathSize))); - } else if(parentPathSize == 0) { - return Optional.of(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.create(Collections.emptyList())); - } else { - return Optional.absent(); - } + /** + * Deprecated. + * + * @deprecated Use {@link YangInstanceIdentifier#getParent()} instead. + */ + @Deprecated + @SuppressModernizer + protected static Optional getParent(final YangInstanceIdentifier child) { + return Optional.fromNullable(child.getParent()); } - protected final void doMerge(final LogicalDatastoreType store, - final InstanceIdentifier path, final DataObject data) { - - final Entry> normalized = getCodec() - .toNormalizedNode(path, data); - ensureListParentIfNeeded(store,path,normalized); - getDelegate().merge(store, normalized.getKey(), normalized.getValue()); - } + /** + * Subclasses of this class are required to implement creation of parent + * nodes based on behaviour of their underlying transaction. + */ + protected abstract void ensureParentsByMerge(LogicalDatastoreType store, + YangInstanceIdentifier key, InstanceIdentifier path); protected final void doDelete(final LogicalDatastoreType store, final InstanceIdentifier path) { - final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier normalized = getCodec().toNormalized(path); + checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path); + + final YangInstanceIdentifier normalized = getCodec().toYangInstanceIdentifierBlocking(path); getDelegate().delete(store, normalized); } - protected final ListenableFuture> doCommit() { + protected final FluentFuture doCommit() { return getDelegate().commit(); } protected final boolean doCancel() { return getDelegate().cancel(); } - }