Deprecate schema-aware builders
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / builder / impl / ImmutableMapEntryNodeSchemaAwareBuilder.java
index 8490e2c0988b09e7d28a5e9eaee97436bd237172..701109a3104235545442bb338a43372241f1ec65 100644 (file)
@@ -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<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> withChild(final DataContainerChild<?, ?> child) {
+    public DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> 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<NodeIdentifierWithPredicates, MapEntryNode> 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<QName> keys = schema.getKeyDefinition();
+    private NodeIdentifierWithPredicates constructNodeIdentifier() {
+        final Map<QName, Object> predicates;
+        final Collection<QName> 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<QName, Object> childrenToPredicates() {
+        final Object[] values = new Object[childrenQNamesToPaths.size()];
+        int offset = 0;
+        for (Entry<QName, PathArgument> entry : childrenQNamesToPaths.entrySet()) {
+            values[offset++] = nonnullKeyValue(entry.getKey(), getChild(entry.getValue())).getValue();
         }
+        return ImmutableMapTemplate.ordered(childrenQNamesToPaths.keySet()).instantiateWithValues(values);
+    }
 
-        final Map<QName, Object> keysToValues = new LinkedHashMap<>();
+    private Map<QName, Object> keyDefToPredicates(final Collection<QName> 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<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> 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());
     }
-
 }