X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?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=72562f0a72bd218518a6a2cc0441c1f66af9e4be;hb=8720a3f3498bbc6fab675431f4200d26641a8ec8;hp=93719b7f531c76c948594d49003fddc3d8aa3ff3;hpb=8d160966fa8752235d01bb8dc57c11391b86f187;p=controller.git 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..72562f0a72 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,119 @@ 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.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 StoreMetadataNode newMeta; + private final StoreMetadataNode oldMeta; + private final NodeModification mod; + + protected AbstractNode(final NodeModification mod, + final StoreMetadataNode oldMeta, final StoreMetadataNode newMeta) { + this.newMeta = newMeta; + this.oldMeta = oldMeta; + this.mod = Preconditions.checkNotNull(mod); + } + + protected final NodeModification getMod() { + return mod; + } + + protected final StoreMetadataNode getNewMeta() { + return newMeta; + } + + protected final StoreMetadataNode getOldMeta() { + return oldMeta; + } + + private static final StoreMetadataNode childMeta(final StoreMetadataNode parent, final PathArgument id) { + return parent == null ? null : parent.getChild(id).orNull(); + } + + @Override + public Iterable getChildNodes() { + return Iterables.transform(mod.getModifications(), new Function() { + @Override + public DataTreeCandidateNode apply(final NodeModification input) { + final PathArgument id = input.getIdentifier(); + return new ChildNode(input, childMeta(oldMeta, id), childMeta(newMeta, id)); + } + }); + } + + @Override + public ModificationType getModificationType() { + return mod.getModificationType(); + } + + private Optional> optionalData(StoreMetadataNode meta) { + if (meta == null) { + return Optional.absent(); + } + return Optional.>of(meta.getData()); + } + + @Override + public Optional> getDataAfter() { + return optionalData(newMeta); + } + + @Override + public Optional> getDataBefore() { + return optionalData(oldMeta); + } + } + + private static final class ChildNode extends AbstractNode { + public ChildNode(NodeModification mod, StoreMetadataNode oldMeta, StoreMetadataNode newMeta) { + super(mod, oldMeta, newMeta); + } + + @Override + public PathArgument getIdentifier() { + return getMod().getIdentifier(); + } + } + + private static final class RootNode extends AbstractNode { + public RootNode(NodeModification mod, StoreMetadataNode oldMeta, StoreMetadataNode 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 NodeModification modificationRoot, + final StoreMetadataNode oldRoot, final StoreMetadataNode newRoot) { + super(rootPath); + this.root = new RootNode(modificationRoot, oldRoot, newRoot); + } + + StoreMetadataNode getAfterRoot() { + return root.getNewMeta(); + } + + StoreMetadataNode getBeforeRoot() { + return root.getOldMeta(); + } + + @Override + public DataTreeCandidateNode getRootNode() { + return root; + } }