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=36ee87875cce637c9678e5398dde5edab972116e;hpb=a6ea70c09b13489918c387d54cde8f1095721acc;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 36ee87875c..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,41 @@ */ 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.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; +@Deprecated(since = "6.0.7", forRemoval = true) public final class ImmutableMapEntryNodeSchemaAwareBuilder extends ImmutableMapEntryNodeBuilder { - private final ListSchemaNode schema; private final DataNodeContainerValidator validator; ImmutableMapEntryNodeSchemaAwareBuilder(final ListSchemaNode schema) { - this.schema = Preconditions.checkNotNull(schema); + this.schema = requireNonNull(schema); this.validator = new DataNodeContainerValidator(schema); } @Override - public ImmutableMapEntryNodeBuilder withNodeIdentifier(final NodeIdentifierWithPredicates nodeIdentifier) { + public ImmutableMapEntryNodeBuilder withNodeIdentifier(final NodeIdentifierWithPredicates withNodeIdentifier) { throw new UnsupportedOperationException("Node identifier created from schema"); } @Override - public DataContainerNodeAttrBuilder withChild( + public DataContainerNodeBuilder withChild( final DataContainerChild child) { validator.validateChild(child.getIdentifier()); return super.withChild(child); @@ -48,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. */ private NodeIdentifierWithPredicates constructNodeIdentifier() { - Collection keys = schema.getKeyDefinition(); + 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 NodeIdentifierWithPredicates( - schema.getQName(), keysToValues)); - keysToValues.put(key, valueForKey.getValue()); + values[offset++] = nonnullKeyValue(key, getChild(childrenQNamesToPaths.get(key))).getValue(); } - - return new 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()); } }