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%2FModifiedNode.java;h=dd06b890cb367569d8dcefaa10b9452c04fb9513;hb=9a63295d0942fbb81837d54bff35a83ec0b0263b;hp=84ad738698f7e23c11b2988cae0d93e4588a0800;hpb=8c7f61fe6c73a27c748814d2610d7784ce73e796;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java index 84ad738698..dd06b890cb 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModifiedNode.java @@ -12,6 +12,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.base.Verify; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; @@ -61,14 +62,22 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode value; private ModificationType modType; - private ModifiedNode(final PathArgument identifier, final Optional original, final boolean isOrdered) { + private ModifiedNode(final PathArgument identifier, final Optional original, final ChildTrackingPolicy childPolicy) { this.identifier = identifier; this.original = original; - if (isOrdered) { + switch (childPolicy) { + case NONE: + children = Collections.emptyMap(); + break; + case ORDERED: children = new LinkedHashMap<>(); - } else { + break; + case UNORDERED: children = new HashMap<>(); + break; + default: + throw new IllegalArgumentException("Unsupported child tracking policy " + childPolicy); } } @@ -117,11 +126,12 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode value) { - final ModifiedNode ret = new ModifiedNode(getIdentifier(), Optional.absent(), false); + /* + * We are instantiating an "equivalent" of this node. Currently the only callsite does not care + * about the actual iteration order, so we do not have to specify the same tracking policy as + * we were instantiated with. Since this is the only time we need to know that policy (it affects + * only things in constructor), we do not want to retain it (saves some memory on per-instance + * basis). + * + * We could reconstruct it using two instanceof checks (to undo what the constructor has done), + * which would give perfect results. The memory saving would be at most 32 bytes of a short-lived + * object, so let's not bother with that. + */ + final ModifiedNode ret = new ModifiedNode(getIdentifier(), Optional.absent(), ChildTrackingPolicy.UNORDERED); ret.write(value); return ret; } - public static ModifiedNode createUnmodified(final TreeNode metadataTree, final boolean isOrdered) { - return new ModifiedNode(metadataTree.getIdentifier(), Optional.of(metadataTree), isOrdered); + public static ModifiedNode createUnmodified(final TreeNode metadataTree, final ChildTrackingPolicy childPolicy) { + return new ModifiedNode(metadataTree.getIdentifier(), Optional.of(metadataTree), childPolicy); } }