BUG-2856: add leaf node simplied by key 47/16947/1
authorRobert Varga <rovarga@cisco.com>
Sun, 22 Mar 2015 10:13:06 +0000 (11:13 +0100)
committerRobert Varga <rovarga@cisco.com>
Sun, 22 Mar 2015 10:22:36 +0000 (11:22 +0100)
Since we have the cross-reference between key and object leaf nodes, we
enforce the consistency. Unfortunately this is not something obvious to
users. We have enough information to correct the situation, so lower the
check to apply only when an explicit inconsistency is detected.

Change-Id: I9297a7d60e4e8d4cd0680a74c1e45f412f8b5f77
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java

index 12f26a39bed8237aa6d6b133232073b7dea26992..7dac8ab6c5903c48fa3ee5084b78793da76c01b6 100644 (file)
@@ -10,17 +10,22 @@ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 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.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<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> {
-
+    private static final Logger LOG = LoggerFactory.getLogger(ImmutableMapEntryNodeBuilder.class);
     protected final Map<QName, YangInstanceIdentifier.PathArgument> childrenQNamesToPaths;
 
     protected ImmutableMapEntryNodeBuilder() {
@@ -91,15 +96,20 @@ 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<QName, Object> key : getNodeIdentifier().getKeyValues().entrySet()) {
+            final DataContainerChild<?, ?> childNode = getChild(childrenQNamesToPaths.get(key.getValue()));
+
+            // We have enough information to fill-in missing leaf nodes, so let's do that
+            if (childNode == null) {
+                LeafNode<Object> leaf = ImmutableNodes.leafNode(key.getKey(), key.getValue());
+                LOG.debug("Adding leaf {} implied by key {}", leaf, key);
+                withChild(leaf);
+            } else {
+                DataValidationException.checkListKey(childNode, getNodeIdentifier().getKeyValues(), key.getKey(), getNodeIdentifier());
+            }
         }
+
+        return new ImmutableMapEntryNode(getNodeIdentifier(), buildValue(), getAttributes());
     }
 
     private static final class ImmutableMapEntryNode extends AbstractImmutableDataContainerAttrNode<YangInstanceIdentifier.NodeIdentifierWithPredicates> implements MapEntryNode {