Composite node <-> normalized node serializer and deserializer
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / transform / base / parser / BaseDispatcherParser.java
index e24a1f7e266b38bbab883f0b449fbda59efeac0d..9de1b823acaa4399266e393832c45d6a511453d7 100644 (file)
@@ -7,14 +7,16 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.AttributesBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.AugmentationSchemaProxy;
@@ -89,14 +91,14 @@ public abstract class BaseDispatcherParser<E, N extends DataContainerNode<?>, S>
     protected abstract NodeParserDispatcher<E> getDispatcher();
 
     @Override
-    public N parse(Iterable<E> element, S schema) {
+    public N parse(Iterable<E> elements, S schema) {
 
-        checkAtLeastOneNode(schema, element);
+        checkAtLeastOneNode(schema, elements);
 
         DataContainerNodeBuilder<?, N> containerBuilder = getBuilder(schema);
 
         // Map child nodes to QName
-        LinkedListMultimap<QName, E> mappedChildElements = mapChildElements(element);
+        LinkedListMultimap<QName, E> mappedChildElements = mapChildElements(elements);
 
         // Map child nodes from Augments
         Map<QName, AugmentationSchema> mappedAugmentChildNodes = mapChildElementsFromAugments(schema);
@@ -121,7 +123,7 @@ public abstract class BaseDispatcherParser<E, N extends DataContainerNode<?>, S>
                 choicesToElements.putAll(choiceSchema, childrenForQName);
                 // Regular child nodes
             } else {
-                DataContainerChild<? extends InstanceIdentifier.PathArgument, ?> builtChildNode = getDispatcher()
+                DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> builtChildNode = getDispatcher()
                         .dispatchChildElement(childSchema, childrenForQName);
                 containerBuilder.withChild(builtChildNode);
             }
@@ -139,9 +141,20 @@ public abstract class BaseDispatcherParser<E, N extends DataContainerNode<?>, S>
             containerBuilder.withChild(getDispatcher().dispatchChildElement(augSchemaProxy, augmentsToElements.get(augmentSchema)));
         }
 
+        if (containerBuilder instanceof AttributesBuilder) {
+            final int size = Iterables.size(elements);
+            Preconditions.checkArgument(size == 1, "Unexpected number of elements: %s, should be 1 for: %s",
+                    size, schema);
+            ((AttributesBuilder<?>) containerBuilder).withAttributes(getAttributes(elements.iterator().next()));
+        }
+
         return containerBuilder.build();
     }
 
+    protected Map<QName, String> getAttributes(E e) {
+        return Collections.emptyMap();
+    }
+
     private boolean isMarkedAs(Map<QName, ?> mappedAugmentChildNodes, QName qName) {
         return mappedAugmentChildNodes.containsKey(qName);
     }