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=a23b070140f1cbc48c85bd50f16dacae51942178;hb=0863fff8d65c6034f90f3e09366a853c7e1db8ca;hp=816cfaba52f29728bdd48491da433f53991d0737;hpb=4a5d26c9de475a4cff151ee4255e027211c2eeb4;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 816cfaba52..a23b070140 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,85 +7,107 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +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.MapEntryNode; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode; +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 com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; +public class ImmutableMapEntryNodeBuilder extends AbstractImmutableDataContainerNodeAttrBuilder { -public class ImmutableMapEntryNodeBuilder - extends AbstractImmutableDataContainerNodeBuilder { - - protected final Map childrenQNamesToPaths; + protected final Map childrenQNamesToPaths; protected ImmutableMapEntryNodeBuilder() { - this.childrenQNamesToPaths = Maps.newLinkedHashMap(); + super(); + this.childrenQNamesToPaths = new LinkedHashMap<>(); + } + + protected ImmutableMapEntryNodeBuilder(final int sizeHint) { + super(sizeHint); + this.childrenQNamesToPaths = new LinkedHashMap<>(sizeHint); } - public static DataContainerNodeBuilder create() { + protected ImmutableMapEntryNodeBuilder(final ImmutableMapEntryNode node) { + super(node); + this.childrenQNamesToPaths = new LinkedHashMap<>(); + fillQnames(node.getValue(), childrenQNamesToPaths); + } + + public static DataContainerNodeAttrBuilder create() { return new ImmutableMapEntryNodeBuilder(); } - // FIXME, find better solution than 2 maps (map from QName to Child ?) + public static DataContainerNodeAttrBuilder create(final int sizeHint) { + return new ImmutableMapEntryNodeBuilder(sizeHint); + } - @Override - public DataContainerNodeBuilder withValue(final List> value) { - for (DataContainerChild childId : value) { - InstanceIdentifier.PathArgument identifier = childId.getIdentifier(); + public static DataContainerNodeAttrBuilder create(final MapEntryNode node) { + if (!(node instanceof ImmutableMapEntryNode)) { + throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass())); + } + + 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(); // Augmentation nodes cannot be keys, and do not have to be present in childrenQNamesToPaths map - if(identifier instanceof InstanceIdentifier.AugmentationIdentifier) { + if(isAugment(identifier)) { continue; } - this.childrenQNamesToPaths.put(childId.getNodeType(), identifier); + out.put(childId.getNodeType(), identifier); } + } + + + @Override + public DataContainerNodeAttrBuilder withValue(final List> value) { + fillQnames(value, childrenQNamesToPaths); return super.withValue(value); } + private static boolean isAugment(final YangInstanceIdentifier.PathArgument identifier) { + return identifier instanceof YangInstanceIdentifier.AugmentationIdentifier; + } + @Override - public DataContainerNodeBuilder 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(child.getIdentifier() instanceof InstanceIdentifier.AugmentationIdentifier == false) { + if(isAugment(child.getIdentifier()) == false) { childrenQNamesToPaths.put(child.getNodeType(), child.getIdentifier()); } + return super.withChild(child); } @Override public MapEntryNode build() { checkKeys(); - return new ImmutableMapEntryNode(nodeIdentifier, value); + return new ImmutableMapEntryNode(getNodeIdentifier(), buildValue(), getAttributes()); } private void checkKeys() { - for (QName keyQName : nodeIdentifier.getKeyValues().keySet()) { - - InstanceIdentifier.PathArgument childNodePath = childrenQNamesToPaths.get(keyQName); - DataContainerChild childNode = value.get(childNodePath); - - Preconditions.checkNotNull(childNode, "Key child node: %s, not present", keyQName); - - Object actualValue = nodeIdentifier.getKeyValues().get(keyQName); - Object expectedValue = childNode.getValue(); - Preconditions.checkArgument(expectedValue.equals(actualValue), - "Key child node with unexpected value, is: %s, should be: %s", actualValue, expectedValue); + for (final QName keyQName : getNodeIdentifier().getKeyValues().keySet()) { + DataContainerChild childNode = getChild(childrenQNamesToPaths.get(keyQName)); + DataValidationException.checkListKey(childNode, getNodeIdentifier().getKeyValues(), keyQName, getNodeIdentifier()); } } - static final class ImmutableMapEntryNode extends AbstractImmutableDataContainerNode implements MapEntryNode { + private static final class ImmutableMapEntryNode extends AbstractImmutableDataContainerAttrNode implements MapEntryNode { - ImmutableMapEntryNode(final InstanceIdentifier.NodeIdentifierWithPredicates nodeIdentifier, - final Map> children) { - super(ImmutableMap.copyOf(children), nodeIdentifier); + ImmutableMapEntryNode(final YangInstanceIdentifier.NodeIdentifierWithPredicates nodeIdentifier, + final Map> children, final Map attributes) { + super(children, nodeIdentifier, attributes); } } }