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%2FImmutableMapEntryNodeSchemaAwareBuilder.java;h=701109a3104235545442bb338a43372241f1ec65;hb=9d74a74a9d46ff8c6878bc7d76994782d938cddc;hp=8490e2c0988b09e7d28a5e9eaee97436bd237172;hpb=2d39ec6cc9b97ab981855ec4eaa7655986fed634;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeSchemaAwareBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeSchemaAwareBuilder.java index 8490e2c098..701109a310 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeSchemaAwareBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeSchemaAwareBuilder.java @@ -7,36 +7,42 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl; -import com.google.common.base.Preconditions; +import static java.util.Objects.requireNonNull; + +import com.google.common.collect.ImmutableMap; import java.util.Collection; -import java.util.LinkedHashMap; import java.util.Map; +import java.util.Map.Entry; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.util.ImmutableMapTemplate; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +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.MapEntryNode; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataNodeContainerValidator; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException; +import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException.IllegalListKeyException; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -public final class ImmutableMapEntryNodeSchemaAwareBuilder extends ImmutableMapEntryNodeBuilder{ - +@Deprecated(since = "6.0.7", forRemoval = true) +public final class ImmutableMapEntryNodeSchemaAwareBuilder extends ImmutableMapEntryNodeBuilder { private final ListSchemaNode schema; private final DataNodeContainerValidator validator; - protected ImmutableMapEntryNodeSchemaAwareBuilder(final ListSchemaNode schema) { - this.schema = Preconditions.checkNotNull(schema); + ImmutableMapEntryNodeSchemaAwareBuilder(final ListSchemaNode schema) { + this.schema = requireNonNull(schema); this.validator = new DataNodeContainerValidator(schema); } @Override - public ImmutableMapEntryNodeBuilder withNodeIdentifier(final YangInstanceIdentifier.NodeIdentifierWithPredicates nodeIdentifier) { + public ImmutableMapEntryNodeBuilder withNodeIdentifier(final NodeIdentifierWithPredicates withNodeIdentifier) { throw new UnsupportedOperationException("Node identifier created from schema"); } @Override - public DataContainerNodeAttrBuilder withChild(final DataContainerChild child) { + public DataContainerNodeBuilder withChild( + final DataContainerChild child) { validator.validateChild(child.getIdentifier()); return super.withChild(child); } @@ -47,29 +53,50 @@ public final class ImmutableMapEntryNodeSchemaAwareBuilder extends ImmutableMapE return super.build(); } + public static @NonNull DataContainerNodeBuilder create( + final ListSchemaNode schema) { + return new ImmutableMapEntryNodeSchemaAwareBuilder(schema); + } + /** - * Build map entry node identifier from schema, and provided children + * Build map entry node identifier from schema and provided children. */ - private YangInstanceIdentifier.NodeIdentifierWithPredicates constructNodeIdentifier() { - Collection keys = schema.getKeyDefinition(); + private NodeIdentifierWithPredicates constructNodeIdentifier() { + final Map predicates; + final Collection keys = schema.getKeyDefinition(); + if (!keys.isEmpty()) { + predicates = keyDefToPredicates(keys); + } else if (!childrenQNamesToPaths.isEmpty()) { + predicates = childrenToPredicates(); + } else { + predicates = ImmutableMap.of(); + } + return NodeIdentifierWithPredicates.of(schema.getQName(), predicates); + } - if (keys.isEmpty()) { - keys = childrenQNamesToPaths.keySet(); + private Map childrenToPredicates() { + final Object[] values = new Object[childrenQNamesToPaths.size()]; + int offset = 0; + for (Entry entry : childrenQNamesToPaths.entrySet()) { + values[offset++] = nonnullKeyValue(entry.getKey(), getChild(entry.getValue())).getValue(); } + return ImmutableMapTemplate.ordered(childrenQNamesToPaths.keySet()).instantiateWithValues(values); + } - final Map keysToValues = new LinkedHashMap<>(); + private Map keyDefToPredicates(final Collection keys) { + final Object[] values = new Object[keys.size()]; + int offset = 0; for (QName key : keys) { - final DataContainerChild valueForKey = getChild(childrenQNamesToPaths.get(key)); - DataValidationException.checkListKey(valueForKey, key, new YangInstanceIdentifier.NodeIdentifierWithPredicates( - schema.getQName(), keysToValues)); - keysToValues.put(key, valueForKey.getValue()); + values[offset++] = nonnullKeyValue(key, getChild(childrenQNamesToPaths.get(key))).getValue(); } - - return new YangInstanceIdentifier.NodeIdentifierWithPredicates(schema.getQName(), keysToValues); + return ImmutableMapTemplate.ordered(keys).instantiateWithValues(values); } - public static DataContainerNodeAttrBuilder create(final ListSchemaNode schema) { - return new ImmutableMapEntryNodeSchemaAwareBuilder(schema); + private DataContainerChild nonnullKeyValue(final QName key, final DataContainerChild value) { + if (value != null) { + return value; + } + throw new IllegalListKeyException("Key value not present for key: %s, in: %s values %s", key, schema.getQName(), + buildValue()); } - }