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%2Fbuilder%2Fimpl%2FImmutableMapEntryNodeBuilder.java;h=33fd8a8ef122d53b9f5b689a382f4ee8f7ac4121;hb=6d818dcbe5187d15a46cced7893be28df1cec725;hp=08d680eeec2aaec2154b566ddd22bcbfa9d10f0c;hpb=51ea178edd55313d176baaec70cdfa0463af7f6b;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java index 08d680eeec..33fd8a8ef1 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java @@ -7,39 +7,56 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl; +import java.util.Collection; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; - +import java.util.Map.Entry; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; +import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException; -import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerAttrNode; +import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ImmutableMapEntryNodeBuilder - extends AbstractImmutableDataContainerNodeAttrBuilder { - - protected final Map childrenQNamesToPaths; + extends AbstractImmutableDataContainerNodeBuilder { + private static final Logger LOG = LoggerFactory.getLogger(ImmutableMapEntryNodeBuilder.class); + protected final Map childrenQNamesToPaths; protected ImmutableMapEntryNodeBuilder() { this.childrenQNamesToPaths = new LinkedHashMap<>(); } + protected ImmutableMapEntryNodeBuilder(final int sizeHint) { + super(sizeHint); + this.childrenQNamesToPaths = new LinkedHashMap<>(sizeHint); + } + protected ImmutableMapEntryNodeBuilder(final ImmutableMapEntryNode node) { super(node); this.childrenQNamesToPaths = new LinkedHashMap<>(); fillQnames(node.getValue(), childrenQNamesToPaths); } - public static DataContainerNodeAttrBuilder create() { + public static @NonNull DataContainerNodeBuilder create() { return new ImmutableMapEntryNodeBuilder(); } - public static DataContainerNodeAttrBuilder create(final MapEntryNode node) { + public static @NonNull DataContainerNodeBuilder create( + final int sizeHint) { + return new ImmutableMapEntryNodeBuilder(sizeHint); + } + + public static @NonNull DataContainerNodeBuilder create( + final MapEntryNode node) { if (!(node instanceof ImmutableMapEntryNode)) { throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass())); } @@ -47,12 +64,13 @@ public class ImmutableMapEntryNodeBuilder return new ImmutableMapEntryNodeBuilder((ImmutableMapEntryNode)node); } - private static void fillQnames(final Iterable> iterable, final Map out) { - for (final DataContainerChild childId : iterable) { - final InstanceIdentifier.PathArgument identifier = childId.getIdentifier(); + private static void fillQnames(final Iterable> iterable, + final Map out) { + for (final DataContainerChild childId : iterable) { + final PathArgument identifier = childId.getIdentifier(); // Augmentation nodes cannot be keys, and do not have to be present in childrenQNamesToPaths map - if(isAugment(identifier)) { + if (isAugment(identifier)) { continue; } @@ -60,21 +78,22 @@ public class ImmutableMapEntryNodeBuilder } } - @Override - public DataContainerNodeAttrBuilder withValue(final List> value) { - fillQnames(value, childrenQNamesToPaths); - return super.withValue(value); + public DataContainerNodeBuilder withValue( + final Collection> withValue) { + fillQnames(withValue, childrenQNamesToPaths); + return super.withValue(withValue); } - private static boolean isAugment(InstanceIdentifier.PathArgument identifier) { - return identifier instanceof InstanceIdentifier.AugmentationIdentifier; + private static boolean isAugment(final PathArgument identifier) { + return identifier instanceof AugmentationIdentifier; } @Override - public DataContainerNodeAttrBuilder withChild(final DataContainerChild child) { + public DataContainerNodeBuilder withChild( + final DataContainerChild child) { // Augmentation nodes cannot be keys, and do not have to be present in childrenQNamesToPaths map - if(isAugment(child.getIdentifier()) == false) { + if (!isAugment(child.getIdentifier())) { childrenQNamesToPaths.put(child.getNodeType(), child.getIdentifier()); } @@ -83,22 +102,29 @@ public class ImmutableMapEntryNodeBuilder @Override public MapEntryNode build() { - checkKeys(); - return new ImmutableMapEntryNode(getNodeIdentifier(), buildValue(), getAttributes()); - } - - private void checkKeys() { - for (final QName keyQName : getNodeIdentifier().getKeyValues().keySet()) { - DataContainerChild childNode = getChild(childrenQNamesToPaths.get(keyQName)); - DataValidationException.checkListKey(childNode, getNodeIdentifier().getKeyValues(), keyQName, getNodeIdentifier()); + for (final Entry key : getNodeIdentifier().entrySet()) { + final DataContainerChild childNode = getChild(childrenQNamesToPaths.get(key.getKey())); + + // We have enough information to fill-in missing leaf nodes, so let's do that + if (childNode == null) { + LeafNode leaf = ImmutableNodes.leafNode(key.getKey(), key.getValue()); + LOG.debug("Adding leaf {} implied by key {}", leaf, key); + withChild(leaf); + } else { + DataValidationException.checkListKey(getNodeIdentifier(), key.getKey(), key.getValue(), + childNode.getValue()); + } } + + return new ImmutableMapEntryNode(getNodeIdentifier(), buildValue()); } - private static final class ImmutableMapEntryNode extends AbstractImmutableDataContainerAttrNode implements MapEntryNode { + private static final class ImmutableMapEntryNode + extends AbstractImmutableDataContainerNode implements MapEntryNode { - ImmutableMapEntryNode(final InstanceIdentifier.NodeIdentifierWithPredicates nodeIdentifier, - final Map> children, final Map attributes) { - super(children, nodeIdentifier, attributes); + ImmutableMapEntryNode(final NodeIdentifierWithPredicates nodeIdentifier, + final Map children) { + super(children, nodeIdentifier); } } }