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=f5cb003f05947bfcc92f095e499ee4a7a0362e1c;hb=970923b5f47f7507ec78021965fa5df1a878af48;hp=aab21ebc3b0c04f983827de62cd47a2e2c48ce25;hpb=eedbf1abb168811cf17d44cce4af736e689288ff;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 aab21ebc3b..f5cb003f05 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,37 +7,43 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl; +import static java.util.Objects.requireNonNull; + +import com.google.common.collect.ImmutableMap; import java.util.Collection; import java.util.Map; - +import java.util.Map.Entry; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.util.ImmutableMapTemplate; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +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.IllegalListKeyException; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; - -public final class ImmutableMapEntryNodeSchemaAwareBuilder extends ImmutableMapEntryNodeBuilder{ +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 InstanceIdentifier.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); } @@ -48,32 +54,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 InstanceIdentifier.NodeIdentifierWithPredicates constructNodeIdentifier() { - Collection keys = schema.getKeyDefinition(); - - // If no keys defined, add all child elements as key - // FIXME should be all PRESENT child nodes, not all from schema - if(keys.isEmpty()) { - keys = childrenQNamesToPaths.keySet(); + 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); + } - final Map keysToValues = Maps.newHashMap(); - for (final QName key : keys) { - // TODO two maps ? find better solution - final DataContainerChild valueForKey = getChild(childrenQNamesToPaths.get(key)); - Preconditions.checkState(valueForKey != null, "Key value: %s cannot be empty for: %s", key, schema.getQName()); - keysToValues.put(key, valueForKey.getValue()); + 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())).body(); } - - - return new InstanceIdentifier.NodeIdentifierWithPredicates(schema.getQName(), keysToValues); + return ImmutableMapTemplate.ordered(childrenQNamesToPaths.keySet()).instantiateWithValues(values); } - public static DataContainerNodeAttrBuilder create(final ListSchemaNode schema) { - return new ImmutableMapEntryNodeSchemaAwareBuilder(schema); + private Map keyDefToPredicates(final Collection keys) { + final Object[] values = new Object[keys.size()]; + int offset = 0; + for (QName key : keys) { + values[offset++] = nonnullKeyValue(key, getChild(childrenQNamesToPaths.get(key))).body(); + } + return ImmutableMapTemplate.ordered(keys).instantiateWithValues(values); } + private DataContainerChild nonnullKeyValue(final QName key, final @Nullable 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()); + } }