BUG 1975 - yang unkeyed list is transformed to map node
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / transform / base / serializer / NodeSerializerDispatcher.java
index d08a9fbf8d713ad31fd4a83aea1e69639992943a..e1ac42e5ec1e1d0fc3289841d535b24cb3921b6a 100644 (file)
@@ -7,7 +7,10 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer;
 
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
@@ -16,21 +19,22 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MixinNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializerFactory;
+import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Iterables;
-
 /**
  *
- * Dispatches the serialization process of nodes according to schema and returns the serialized elements.
+ * Dispatches the serialization process of nodes according to schema and returns
+ * the serialized elements.
  *
- * @param <E> type of serialized elements
+ * @param <E>
+ *            type of serialized elements
  */
 public interface NodeSerializerDispatcher<E> {
 
@@ -38,8 +42,9 @@ public interface NodeSerializerDispatcher<E> {
             DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> dataContainerChild);
 
     /**
-     * Abstract implementation that implements the dispatch conditions. Only requires serializers to be provided.
-     * The same instance of serializer can be provided in case it is immutable.
+     * Abstract implementation that implements the dispatch conditions. Only
+     * requires serializers to be provided. The same instance of serializer can
+     * be provided in case it is immutable.
      */
     public static abstract class BaseNodeSerializerDispatcher<E> implements NodeSerializerDispatcher<E> {
         private final FromNormalizedNodeSerializerFactory<E> factory;
@@ -55,11 +60,15 @@ public interface NodeSerializerDispatcher<E> {
                 return onContainerNode(childSchema, dataContainerChild);
             } else if (dataContainerChild instanceof LeafNode<?>) {
                 return onLeafNode(childSchema, dataContainerChild);
+            } else if (dataContainerChild instanceof AnyXmlNode) {
+                return onAnyXmlNode(childSchema, dataContainerChild);
             } else if (dataContainerChild instanceof MixinNode) {
                 if (dataContainerChild instanceof LeafSetNode<?>) {
                     return onLeafListNode(childSchema, dataContainerChild);
                 } else if (dataContainerChild instanceof MapNode) {
-                    return onListNode(childSchema, dataContainerChild);
+                    return onMapNode(childSchema, dataContainerChild);
+                } else if (dataContainerChild instanceof  UnkeyedListNode) {
+                    return onUnkeyedListNode(childSchema, dataContainerChild);
                 } else if (dataContainerChild instanceof ChoiceNode) {
                     return onChoiceNode(childSchema, dataContainerChild);
                 } else if (dataContainerChild instanceof AugmentationNode) {
@@ -85,12 +94,18 @@ public interface NodeSerializerDispatcher<E> {
                             (ChoiceNode) dataContainerChild);
         }
 
-        private Iterable<E> onListNode(Object childSchema,
+        private Iterable<E> onMapNode(Object childSchema,
                 DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> dataContainerChild) {
             checkSchemaCompatibility(childSchema, ListSchemaNode.class, dataContainerChild);
             return factory.getMapNodeSerializer().serialize((ListSchemaNode) childSchema, (MapNode) dataContainerChild);
         }
 
+        private Iterable<E> onUnkeyedListNode(Object childSchema,
+                DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> dataContainerChild) {
+            checkSchemaCompatibility(childSchema, ListSchemaNode.class, dataContainerChild);
+            return factory.getUnkeyedListNodeSerializer().serialize((ListSchemaNode) childSchema, (UnkeyedListNode) dataContainerChild);
+        }
+
         private Iterable<E> onLeafListNode(Object childSchema,
                 DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> dataContainerChild) {
             checkSchemaCompatibility(childSchema, LeafListSchemaNode.class, dataContainerChild);
@@ -107,6 +122,15 @@ public interface NodeSerializerDispatcher<E> {
             return elements;
         }
 
+        private Iterable<E> onAnyXmlNode(Object childSchema,
+                DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> dataContainerChild) {
+            checkSchemaCompatibility(childSchema, AnyXmlSchemaNode.class, dataContainerChild);
+            Iterable<E> elements = factory.getAnyXmlNodeSerializer().serialize((AnyXmlSchemaNode) childSchema,
+                    (AnyXmlNode) dataContainerChild);
+            checkOnlyOneSerializedElement(elements, dataContainerChild);
+            return elements;
+        }
+
         private static void checkOnlyOneSerializedElement(Iterable<?> elements,
                 DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> dataContainerChild) {
             final int size = Iterables.size(elements);