X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fdom%2Fstore%2Fimpl%2Ftree%2Fdata%2FInMemoryDataTreeCandidate.java;h=bafea6bd9770c25c3e3f74d87cc9a60ebde4e200;hp=93719b7f531c76c948594d49003fddc3d8aa3ff3;hb=290b7c23512204074fcd0fb7163b0adea48823fd;hpb=8d160966fa8752235d01bb8dc57c11391b86f187 diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeCandidate.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeCandidate.java index 93719b7f53..bafea6bd97 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeCandidate.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/store/impl/tree/data/InMemoryDataTreeCandidate.java @@ -1,32 +1,125 @@ package org.opendaylight.controller.md.sal.dom.store.impl.tree.data; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.DataTreeCandidateNode; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.ModificationType; +import org.opendaylight.controller.md.sal.dom.store.impl.tree.spi.TreeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import com.google.common.base.Function; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; final class InMemoryDataTreeCandidate extends AbstractDataTreeCandidate { - private final StoreMetadataNode newRoot; - private final StoreMetadataNode oldRoot; - - InMemoryDataTreeCandidate(final InstanceIdentifier rootPath, final NodeModification modificationRoot, - final StoreMetadataNode oldRoot, final StoreMetadataNode newRoot) { - super(rootPath, modificationRoot); - this.newRoot = Preconditions.checkNotNull(newRoot); - this.oldRoot = Preconditions.checkNotNull(oldRoot); - } - - @Override - public void close() { - // FIXME: abort operation here :) - } - - @Override - public StoreMetadataNode getBeforeRoot() { - return oldRoot; - } - - @Override - public StoreMetadataNode getAfterRoot() { - return newRoot; - } + private static abstract class AbstractNode implements DataTreeCandidateNode { + private final ModifiedNode mod; + private final TreeNode newMeta; + private final TreeNode oldMeta; + + protected AbstractNode(final ModifiedNode mod, + final TreeNode oldMeta, final TreeNode newMeta) { + this.newMeta = newMeta; + this.oldMeta = oldMeta; + this.mod = Preconditions.checkNotNull(mod); + } + + protected final ModifiedNode getMod() { + return mod; + } + + protected final TreeNode getNewMeta() { + return newMeta; + } + + protected final TreeNode getOldMeta() { + return oldMeta; + } + + private static final TreeNode childMeta(final TreeNode parent, final PathArgument id) { + if (parent != null) { + return parent.getChild(id).orNull(); + } else { + return null; + } + } + + @Override + public Iterable getChildNodes() { + return Iterables.transform(mod.getChildren(), new Function() { + @Override + public DataTreeCandidateNode apply(final ModifiedNode input) { + final PathArgument id = input.getIdentifier(); + return new ChildNode(input, childMeta(oldMeta, id), childMeta(newMeta, id)); + } + }); + } + + @Override + public ModificationType getModificationType() { + return mod.getType(); + } + + private Optional> optionalData(final TreeNode meta) { + if (meta != null) { + return Optional.>of(meta.getData()); + } else { + return Optional.absent(); + } + } + + @Override + public Optional> getDataAfter() { + return optionalData(newMeta); + } + + @Override + public Optional> getDataBefore() { + return optionalData(oldMeta); + } + } + + private static final class ChildNode extends AbstractNode { + public ChildNode(final ModifiedNode mod, final TreeNode oldMeta, final TreeNode newMeta) { + super(mod, oldMeta, newMeta); + } + + @Override + public PathArgument getIdentifier() { + return getMod().getIdentifier(); + } + } + + private static final class RootNode extends AbstractNode { + public RootNode(final ModifiedNode mod, final TreeNode oldMeta, final TreeNode newMeta) { + super(mod, oldMeta, newMeta); + } + + @Override + public PathArgument getIdentifier() { + throw new IllegalStateException("Attempted to get identifier of the root node"); + } + } + + private final RootNode root; + + InMemoryDataTreeCandidate(final InstanceIdentifier rootPath, final ModifiedNode modificationRoot, + final TreeNode beforeRoot, final TreeNode afterRoot) { + super(rootPath); + this.root = new RootNode(modificationRoot, beforeRoot, afterRoot); + } + + TreeNode getAfterRoot() { + return root.getNewMeta(); + } + + TreeNode getBeforeRoot() { + return root.getOldMeta(); + } + + @Override + public DataTreeCandidateNode getRootNode() { + return root; + } }