Remove BindingToNormalizedStreamWriter.create()
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / ListNodeCodecContext.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.mdsal.binding.dom.codec.impl;
9
10 import static java.util.Objects.requireNonNull;
11
12 import java.lang.reflect.Method;
13 import java.util.List;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.opendaylight.mdsal.binding.runtime.api.ListRuntimeType;
16 import org.opendaylight.yangtools.yang.binding.DataObject;
17 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
18 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
19 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
20 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
21 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
22
23 class ListNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<D, ListRuntimeType> {
24     ListNodeCodecContext(final DataContainerCodecPrototype<ListRuntimeType> prototype) {
25         super(prototype);
26     }
27
28     ListNodeCodecContext(final DataContainerCodecPrototype<ListRuntimeType> prototype,
29             final Method keyMethod) {
30         super(prototype, keyMethod);
31     }
32
33     @Override
34     public D deserialize(final NormalizedNode node) {
35         final var nonnull = requireNonNull(node);
36         if (nonnull instanceof MapEntryNode mapEntry) {
37             return createBindingProxy(mapEntry);
38         } else if (nonnull instanceof UnkeyedListEntryNode unkeyedEntry) {
39             return createBindingProxy(unkeyedEntry);
40         } else {
41             throw new IllegalArgumentException("Expecting either a MapEntryNode or an UnkeyedListEntryNode, not "
42                 + node.contract().getSimpleName());
43         }
44     }
45
46     @Override
47     protected Object deserializeObject(final NormalizedNode node) {
48         if (node instanceof MapNode map) {
49             return fromMap(map);
50         } else if (node instanceof MapEntryNode mapEntry) {
51             return createBindingProxy(mapEntry);
52         } else if (node instanceof UnkeyedListNode list) {
53             return fromUnkeyedList(list);
54         } else if (node instanceof UnkeyedListEntryNode listEntry) {
55             return createBindingProxy(listEntry);
56         } else {
57             throw new IllegalStateException("Unsupported data type " + node.contract().getSimpleName());
58         }
59     }
60
61     @NonNull Object fromMap(final MapNode map, final int size) {
62         return LazyBindingList.create(this, size, map.body());
63     }
64
65     private Object fromMap(final MapNode map) {
66         final int size;
67         // This should never happen, but we do need to ensure users never see an empty Map
68         return (size = map.size()) == 0 ? null : fromMap(map, size);
69     }
70
71     private List<D> fromUnkeyedList(final UnkeyedListNode node) {
72         final int size;
73         // This should never happen, but we do need to ensure users never see an empty List
74         return (size = node.size()) == 0 ? null : LazyBindingList.create(this, size, node.body());
75     }
76 }