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=540eb9a632d57b47913c86d63cd5c43d435a681c;hpb=0f129679000fb1a9645501dc16154a67936ad7f4;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 540eb9a632..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 @@ -10,6 +10,9 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree; import com.google.common.base.Optional; 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; @@ -37,35 +40,44 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode children; private final Optional original; private final PathArgument identifier; - private ModificationType modificationType = ModificationType.UNMODIFIED; + private LogicalOperation operation = LogicalOperation.NONE; private Optional snapshotCache; private NormalizedNode 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); } } @@ -83,24 +95,14 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode getOriginal() { return original; } - /** - * Returns modification type - * - * @return modification type - */ @Override - ModificationType getType() { - return modificationType; + LogicalOperation getOperation() { + return operation; } /** @@ -124,14 +126,15 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode getChildren() { + Collection getChildren() { return children.values(); } @@ -165,16 +168,16 @@ final class ModifiedNode extends NodeModification implements StoreTreeNode value) { clearSnapshot(); - updateModificationType(ModificationType.WRITE); + updateOperationType(LogicalOperation.WRITE); children.clear(); this.value = value; } void merge(final NormalizedNode value) { clearSnapshot(); - updateModificationType(ModificationType.MERGE); + updateOperationType(LogicalOperation.MERGE); /* * Blind overwrite of any previous data is okay, no matter whether the node @@ -244,14 +247,14 @@ 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); } }