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 8ab953f844831c43cd109183f534862934262a3a..b6477100aa47843e8123eda3f62d4942d8a66da2 100644 (file)
@@ -7,30 +7,34 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
+import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableList.Builder;
-import java.util.Collection;
+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.LeafSetEntryNode;
 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 {
+    private final IntFunction<ImmutableCollection.Builder<Object>> builderFactory;
+
     LeafSetNodeCodecContext(final LeafListSchemaNode schema, final IllegalArgumentCodec<Object, Object> codec,
-        final String getterName) {
+            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).body();
-            final IllegalArgumentCodec<Object, Object> codec = getValueCodec();
-            final Builder<Object> builder = ImmutableList.builderWithExpectedSize(domValues.size());
-            for (final LeafSetEntryNode<Object> valueNode : domValues) {
+            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 builder.build();