Map system-ordered leaf-lists to Set<T>
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / LeafSetNodeCodecContext.java
index ea6947d3dbac9d3ce143108a6458783fca5765d7..b6477100aa47843e8123eda3f62d4942d8a66da2 100644 (file)
@@ -7,32 +7,37 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import org.opendaylight.yangtools.concepts.Codec;
-import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import java.util.function.IntFunction;
+import org.opendaylight.yangtools.concepts.IllegalArgumentCodec;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 
 final class LeafSetNodeCodecContext extends ValueNodeCodecContext.WithCodec {
-    LeafSetNodeCodecContext(final LeafListSchemaNode schema, final Codec<Object, Object> codec,
-        final String getterName) {
+    private final IntFunction<ImmutableCollection.Builder<Object>> builderFactory;
+
+    LeafSetNodeCodecContext(final LeafListSchemaNode schema, final IllegalArgumentCodec<Object, Object> codec,
+            final String getterName) {
         // FIXME: add support for defaults
         super(schema, codec, getterName, null);
+        builderFactory = schema.isUserOrdered() ? ImmutableList::builderWithExpectedSize
+            : ImmutableSet::builderWithExpectedSize;
     }
 
     @Override
-    protected Object deserializeObject(final NormalizedNode<?, ?> normalizedNode) {
+    protected ImmutableCollection<?> deserializeObject(final NormalizedNode normalizedNode) {
         if (normalizedNode instanceof LeafSetNode<?>) {
             @SuppressWarnings("unchecked")
-            final Collection<LeafSetEntryNode<Object>> domValues = ((LeafSetNode<Object>) normalizedNode).getValue();
-            final List<Object> result = new ArrayList<>(domValues.size());
-            for (final LeafSetEntryNode<Object> valueNode : domValues) {
-                result.add(getValueCodec().deserialize(valueNode.getValue()));
+            final var domValues = ((LeafSetNode<Object>) normalizedNode).body();
+            final var codec = getValueCodec();
+            final var builder = builderFactory.apply(domValues.size());
+            for (var valueNode : domValues) {
+                builder.add(codec.deserialize(valueNode.body()));
             }
-            return result;
+            return builder.build();
         }
         return null;
     }