X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2Ftree%2FAbstractDataTreeCandidateNode.java;h=4d67080a9870d2c57eb6792b6dd4afba675271e9;hb=refs%2Fchanges%2F56%2F21956%2F2;hp=64930c7e129b20b3adf3d3d4ca9f69827c8f1e71;hpb=6204e3cddac855bfd6d00be3b16acfc10752bb5b;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractDataTreeCandidateNode.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractDataTreeCandidateNode.java index 64930c7e12..4d67080a98 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractDataTreeCandidateNode.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractDataTreeCandidateNode.java @@ -22,25 +22,56 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode; abstract class AbstractDataTreeCandidateNode implements DataTreeCandidateNode { - private static final Function, DataTreeCandidateNode> TO_DELETED_NODES = new Function, DataTreeCandidateNode>() { + private static final Function, DataTreeCandidateNode> TO_DELETED_NODE = new Function, DataTreeCandidateNode>() { @Override public DataTreeCandidateNode apply(final NormalizedNode input) { return AbstractRecursiveCandidateNode.deleteNode(input); } - }; private static final Function, DataTreeCandidateNode> TO_WRITTEN_NODES = new Function, DataTreeCandidateNode>() { + }; + private static final Function, DataTreeCandidateNode> TO_WRITTEN_NODE = new Function, DataTreeCandidateNode>() { @Override public DataTreeCandidateNode apply(final NormalizedNode input) { return AbstractRecursiveCandidateNode.writeNode(input); } }; + private static Optional> getChild(final NormalizedNodeContainer> container, final PathArgument identifier) { + if (container != null) { + return container.getChild(identifier); + } else { + return Optional.absent(); + } + } + + static DataTreeCandidateNode deltaChild( + final NormalizedNodeContainer> oldData, + final NormalizedNodeContainer> newData, final PathArgument identifier) { + + final Optional> maybeNewChild = getChild(newData, identifier); + final Optional> maybeOldChild = getChild(oldData, identifier); + if (maybeOldChild.isPresent()) { + final NormalizedNode oldChild = maybeOldChild.get(); + if (maybeNewChild.isPresent()) { + return AbstractRecursiveCandidateNode.replaceNode(oldChild, maybeNewChild.get()); + } else { + return TO_DELETED_NODE.apply(oldChild); + } + } else { + if (maybeNewChild.isPresent()) { + return TO_WRITTEN_NODE.apply(maybeNewChild.get()); + } else { + return null; + } + } + } + static Collection deltaChildren(@Nullable final NormalizedNodeContainer> oldData, @Nullable final NormalizedNodeContainer> newData) { if (newData == null) { - return Collections2.transform(oldData.getValue(), TO_DELETED_NODES); + return Collections2.transform(oldData.getValue(), TO_DELETED_NODE); } if (oldData == null) { - return Collections2.transform(newData.getValue(), TO_WRITTEN_NODES); + return Collections2.transform(newData.getValue(), TO_WRITTEN_NODE); } // Create index for fast cross-references