X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-binding-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fbinding%2Fimpl%2FAbstractWriteTransaction.java;h=65a9c1abebd1b1a0373a2a32b742ceb0f94cfec3;hb=74561c35949153a92df7d352be0fb135c30f39c4;hp=a8eef5a3cae2687f6cc552454407e0bb8bf9eb97;hpb=3d81e6fb622fb7d5b239a8697d51bcb6d96658db;p=controller.git 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 a8eef5a3ca..65a9c1abeb 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 @@ -16,7 +16,7 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; 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.data.api.InstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,7 +30,7 @@ import com.google.common.util.concurrent.CheckedFuture; * Abstract Base Transaction for transactions which are backed by * {@link DOMDataWriteTransaction} */ -public class AbstractWriteTransaction extends +public abstract class AbstractWriteTransaction extends AbstractForwardedTransaction { private static final Logger LOG = LoggerFactory.getLogger(AbstractWriteTransaction.class); @@ -40,15 +40,36 @@ public class AbstractWriteTransaction extends super(delegate, codec); } - protected final void doPut(final LogicalDatastoreType store, - final InstanceIdentifier path, final DataObject data) { - final Entry> normalized = getCodec() + + public final void put(final LogicalDatastoreType store, + final InstanceIdentifier path, final U data, final boolean createParents) { + final Entry> normalized = getCodec() .toNormalizedNode(path, data); - ensureListParentIfNeeded(store,path,normalized); + 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) { + + 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. @@ -82,9 +103,9 @@ 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) { + final Entry> normalized) { if(Identifiable.class.isAssignableFrom(path.getTargetType())) { - org.opendaylight.yangtools.yang.data.api.InstanceIdentifier parentMapPath = getParent(normalized.getKey()).get(); + org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier parentMapPath = getParent(normalized.getKey()).get(); NormalizedNode emptyParent = getCodec().getDefaultNodeFor(parentMapPath); getDelegate().merge(store, parentMapPath, emptyParent); } @@ -92,32 +113,34 @@ public class AbstractWriteTransaction extends } // FIXME (should be probaly part of InstanceIdentifier) - protected static Optional getParent( - final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier child) { + protected static Optional getParent( + final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier 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))); + return Optional.of(org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.create(Iterables.limit(mapEntryItemPath, parentPathSize))); } else if(parentPathSize == 0) { - return Optional.of(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.create(Collections.emptyList())); + return Optional.of(org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.create(Collections.emptyList())); } else { return Optional.absent(); } } - 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. + * + * @param store + * @param key + * @param path + */ + protected abstract void ensureParentsByMerge(LogicalDatastoreType store, + org.opendaylight.yangtools.yang.data.api.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); + final org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier normalized = getCodec().toNormalized(path); getDelegate().delete(store, normalized); }