+ private static Optional<NormalizedNode<?, ?>> getChild(final NormalizedNodeContainer<?, PathArgument, NormalizedNode<?, ?>> container, final PathArgument identifier) {
+ if (container != null) {
+ return container.getChild(identifier);
+ } else {
+ return Optional.absent();
+ }
+ }
+
+ static DataTreeCandidateNode deltaChild(
+ final NormalizedNodeContainer<?, PathArgument, NormalizedNode<?, ?>> oldData,
+ final NormalizedNodeContainer<?, PathArgument, NormalizedNode<?, ?>> newData, final PathArgument identifier) {
+
+ final Optional<NormalizedNode<?, ?>> maybeNewChild = getChild(newData, identifier);
+ final Optional<NormalizedNode<?, ?>> 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;
+ }
+ }
+ }
+