X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2Fbuilder%2Fimpl%2FImmutableMapNodeBuilder.java;h=98028944ffe4146df5a67cf729f9ba2050a77d7a;hb=0eb60011b52e4e56c62b47a36eb334f2c3b3ad6a;hp=7c26eb14ecddc78bb769a13e9cf90c9c1454aa05;hpb=f4a83855a7751d9b79cdc8037038dd3e296fa66c;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java index 7c26eb14ec..98028944ff 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java @@ -7,45 +7,63 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl; +import java.util.HashMap; import java.util.List; import java.util.Map; import org.opendaylight.yangtools.concepts.Immutable; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.util.MapAdaptor; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedNode; import com.google.common.base.Optional; import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; public class ImmutableMapNodeBuilder implements CollectionNodeBuilder { - private Map value = Maps.newLinkedHashMap(); - private InstanceIdentifier.NodeIdentifier nodeIdentifier; - private boolean dirty = false; + private final Map value; + private YangInstanceIdentifier.NodeIdentifier nodeIdentifier; + + protected ImmutableMapNodeBuilder() { + this.value = new HashMap<>(); + } + + protected ImmutableMapNodeBuilder(final ImmutableMapNode node) { + this.nodeIdentifier = node.getIdentifier(); + this.value = MapAdaptor.getDefaultInstance().takeSnapshot(node.children); + } public static CollectionNodeBuilder create() { return new ImmutableMapNodeBuilder(); } - private void checkDirty() { - if (dirty) { - value = Maps.newLinkedHashMap(value); - dirty = false; + public static CollectionNodeBuilder create(final MapNode node) { + if (!(node instanceof ImmutableMapNode)) { + throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass())); } + + return new ImmutableMapNodeBuilder((ImmutableMapNode) node); } @Override public CollectionNodeBuilder withChild(final MapEntryNode child) { - checkDirty(); this.value.put(child.getIdentifier(), child); return this; } + @Override + public CollectionNodeBuilder withoutChild(final YangInstanceIdentifier.PathArgument key) { + this.value.remove(key); + return this; + } + @Override public CollectionNodeBuilder withValue(final List value) { // TODO replace or putAll ? @@ -57,15 +75,14 @@ public class ImmutableMapNodeBuilder } @Override - public CollectionNodeBuilder withNodeIdentifier(final InstanceIdentifier.NodeIdentifier nodeIdentifier) { + public CollectionNodeBuilder withNodeIdentifier(final YangInstanceIdentifier.NodeIdentifier nodeIdentifier) { this.nodeIdentifier = nodeIdentifier; return this; } @Override public MapNode build() { - dirty = true; - return new ImmutableMapNode(nodeIdentifier, value); + return new ImmutableMapNode(nodeIdentifier, MapAdaptor.getDefaultInstance().optimize(value)); } @Override @@ -74,21 +91,33 @@ public class ImmutableMapNodeBuilder return withChild(child); } - static final class ImmutableMapNode extends AbstractImmutableNormalizedNode> implements Immutable,MapNode { - private final Map children; + @Override + public NormalizedNodeContainerBuilder removeChild( + final PathArgument key) { + return withoutChild(key); + } - ImmutableMapNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier, - final Map children) { - super(nodeIdentifier, Iterables.unmodifiableIterable(children.values())); + protected static final class ImmutableMapNode extends AbstractImmutableNormalizedNode> implements Immutable,MapNode { + + private final Map children; + + ImmutableMapNode(final YangInstanceIdentifier.NodeIdentifier nodeIdentifier, + final Map children) { + super(nodeIdentifier); this.children = children; } @Override - public Optional getChild(final InstanceIdentifier.NodeIdentifierWithPredicates child) { + public Optional getChild(final YangInstanceIdentifier.NodeIdentifierWithPredicates child) { return Optional.fromNullable(children.get(child)); } + @Override + public Iterable getValue() { + return Iterables.unmodifiableIterable(children.values()); + } + @Override protected int valueHashCode() { return children.hashCode();