package org.opendaylight.mdsal.binding.dom.codec.impl;
import java.lang.reflect.Method;
-import java.util.ArrayList;
import java.util.List;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.runtime.api.ListRuntimeType;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-class ListNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<D,ListSchemaNode> {
- ListNodeCodecContext(final DataContainerCodecPrototype<ListSchemaNode> prototype) {
+class ListNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<D, ListRuntimeType> {
+ ListNodeCodecContext(final DataContainerCodecPrototype<ListRuntimeType> prototype) {
super(prototype);
}
- ListNodeCodecContext(final DataContainerCodecPrototype<ListSchemaNode> prototype, final Method keyMethod) {
+ ListNodeCodecContext(final DataContainerCodecPrototype<ListRuntimeType> prototype,
+ final Method keyMethod) {
super(prototype, keyMethod);
}
@Override
- public D deserialize(final NormalizedNode<?, ?> node) {
+ public D deserialize(final NormalizedNode node) {
if (node instanceof MapEntryNode) {
- return fromMapEntry((MapEntryNode) node);
+ return createBindingProxy((MapEntryNode) node);
} else if (node instanceof UnkeyedListEntryNode) {
- return fromUnkeyedListEntry((UnkeyedListEntryNode) node);
+ return createBindingProxy((UnkeyedListEntryNode) node);
} else {
throw new IllegalStateException("Unsupported data type " + node.getClass());
}
}
@Override
- protected Object deserializeObject(final NormalizedNode<?, ?> node) {
+ protected Object deserializeObject(final NormalizedNode node) {
if (node instanceof MapNode) {
return fromMap((MapNode) node);
} else if (node instanceof MapEntryNode) {
- return fromMapEntry((MapEntryNode) node);
+ return createBindingProxy((MapEntryNode) node);
} else if (node instanceof UnkeyedListNode) {
return fromUnkeyedList((UnkeyedListNode) node);
} else if (node instanceof UnkeyedListEntryNode) {
- return fromUnkeyedListEntry((UnkeyedListEntryNode) node);
+ return createBindingProxy((UnkeyedListEntryNode) node);
} else {
throw new IllegalStateException("Unsupported data type " + node.getClass());
}
}
- private List<D> fromMap(final MapNode nodes) {
- List<D> ret = new ArrayList<>(nodes.getValue().size());
- for (MapEntryNode node : nodes.getValue()) {
- ret.add(fromMapEntry(node));
- }
- return ret;
- }
-
- private D fromMapEntry(final MapEntryNode node) {
- return createBindingProxy(node);
+ @NonNull Object fromMap(final MapNode map, final int size) {
+ return LazyBindingList.create(this, size, map.body());
}
- private D fromUnkeyedListEntry(final UnkeyedListEntryNode node) {
- return createBindingProxy(node);
+ private Object fromMap(final MapNode map) {
+ final int size;
+ // This should never happen, but we do need to ensure users never see an empty Map
+ return (size = map.size()) == 0 ? null : fromMap(map, size);
}
- private List<D> fromUnkeyedList(final UnkeyedListNode nodes) {
- // FIXME: Could be this lazy transformed list?
- List<D> ret = new ArrayList<>(nodes.getValue().size());
- for (UnkeyedListEntryNode node : nodes.getValue()) {
- ret.add(fromUnkeyedListEntry(node));
- }
- return ret;
+ private List<D> fromUnkeyedList(final UnkeyedListNode node) {
+ final int size;
+ // This should never happen, but we do need to ensure users never see an empty List
+ return (size = node.size()) == 0 ? null : LazyBindingList.create(this, size, node.body());
}
-}
\ No newline at end of file
+}