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=2164bb4df232c30e58851c8d4fd6f93b87c3a760;hb=a6ea70c09b13489918c387d54cde8f1095721acc;hp=0b1f58cd028d30d3128bfe71cc427c4adb5e5537;hpb=25de0a162a30fdc883a0208f626cf464d6600fa1;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 0b1f58cd02..2164bb4df2 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,21 +7,28 @@ */ 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.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +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.ImmutableNodes; import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException; import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerAttrNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class ImmutableMapEntryNodeBuilder extends AbstractImmutableDataContainerNodeAttrBuilder { - - protected final Map childrenQNamesToPaths; +public class ImmutableMapEntryNodeBuilder + extends AbstractImmutableDataContainerNodeAttrBuilder { + private static final Logger LOG = LoggerFactory.getLogger(ImmutableMapEntryNodeBuilder.class); + protected final Map childrenQNamesToPaths; protected ImmutableMapEntryNodeBuilder() { super(); @@ -39,15 +46,16 @@ public class ImmutableMapEntryNodeBuilder extends AbstractImmutableDataContainer fillQnames(node.getValue(), childrenQNamesToPaths); } - public static DataContainerNodeAttrBuilder create() { + public static DataContainerNodeAttrBuilder create() { return new ImmutableMapEntryNodeBuilder(); } - public static DataContainerNodeAttrBuilder create(final int sizeHint) { + public static DataContainerNodeAttrBuilder create(final int sizeHint) { return new ImmutableMapEntryNodeBuilder(sizeHint); } - public static DataContainerNodeAttrBuilder create(final MapEntryNode node) { + public static DataContainerNodeAttrBuilder create( + final MapEntryNode node) { if (!(node instanceof ImmutableMapEntryNode)) { throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass())); } @@ -55,12 +63,13 @@ public class ImmutableMapEntryNodeBuilder extends AbstractImmutableDataContainer return new ImmutableMapEntryNodeBuilder((ImmutableMapEntryNode)node); } - private static void fillQnames(final Iterable> iterable, final Map out) { - for (final DataContainerChild childId : iterable) { - final YangInstanceIdentifier.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; } @@ -70,19 +79,21 @@ public class ImmutableMapEntryNodeBuilder extends AbstractImmutableDataContainer @Override - public DataContainerNodeAttrBuilder withValue(final List> value) { + public DataContainerNodeAttrBuilder withValue( + final Collection> value) { fillQnames(value, childrenQNamesToPaths); return super.withValue(value); } - private static boolean isAugment(final YangInstanceIdentifier.PathArgument identifier) { - return identifier instanceof YangInstanceIdentifier.AugmentationIdentifier; + private static boolean isAugment(final PathArgument identifier) { + return identifier instanceof AugmentationIdentifier; } @Override - public DataContainerNodeAttrBuilder withChild(final DataContainerChild child) { + public DataContainerNodeAttrBuilder withChild( + final DataContainerChild child) { // Augmentation nodes cannot be keys, and do not have to be present in childrenQNamesToPaths map - if(!isAugment(child.getIdentifier())) { + if (!isAugment(child.getIdentifier())) { childrenQNamesToPaths.put(child.getNodeType(), child.getIdentifier()); } @@ -91,21 +102,29 @@ public class ImmutableMapEntryNodeBuilder extends AbstractImmutableDataContainer @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().getKeyValues().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(), getAttributes()); } - private static final class ImmutableMapEntryNode extends AbstractImmutableDataContainerAttrNode implements MapEntryNode { + private static final class ImmutableMapEntryNode + extends AbstractImmutableDataContainerAttrNode implements MapEntryNode { - ImmutableMapEntryNode(final YangInstanceIdentifier.NodeIdentifierWithPredicates nodeIdentifier, - final Map> children, final Map attributes) { + ImmutableMapEntryNode(final NodeIdentifierWithPredicates nodeIdentifier, + final Map> children, + final Map attributes) { super(children, nodeIdentifier, attributes); } }