Merge "Fix xml->CompositeNode transformation for rpc replies for rpcs with no output"
[yangtools.git] / yang / yang-data-codec-gson / src / main / java / org / opendaylight / yangtools / yang / data / codec / gson / ListEntryNodeDataWithSchema.java
index b08add8a36d033e345e655d21d6ac60b70228d87..315ce97e49a863d4cc8bee59ae8f97dac84dcb1d 100644 (file)
@@ -7,10 +7,12 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.gson;
 
-import static org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter.UNKNOWN_SIZE;
+import com.google.common.base.Preconditions;
 
 import java.io.IOException;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -31,7 +33,7 @@ class ListEntryNodeDataWithSchema extends CompositeNodeDataWithSchema {
 
     @Override
     public void addChild(final AbstractNodeDataWithSchema newChild) {
-        DataSchemaNode childSchema = newChild.getSchema();
+        final DataSchemaNode childSchema = newChild.getSchema();
         if (childSchema instanceof LeafSchemaNode && isPartOfKey((LeafSchemaNode) childSchema)) {
             qNameToKeys.put(childSchema.getQName(), (SimpleNodeDataWithSchema)newChild);
         }
@@ -49,29 +51,27 @@ class ListEntryNodeDataWithSchema extends CompositeNodeDataWithSchema {
     }
 
     @Override
-    protected void writeToStream(final NormalizedNodeStreamWriter nnStreamWriter) throws IOException {
-        int keyCount = ((ListSchemaNode) getSchema()).getKeyDefinition().size();
-        if (keyCount == 0) {
-            nnStreamWriter.startUnkeyedListItem(provideNodeIdentifier(), UNKNOWN_SIZE);
-            super.writeToStream(nnStreamWriter);
-            nnStreamWriter.endNode();
-        } else if (keyCount == qNameToKeys.size()) {
-            nnStreamWriter.startMapEntryNode(provideNodeIdentifierWithPredicates(), UNKNOWN_SIZE);
-            super.writeToStream(nnStreamWriter);
-            nnStreamWriter.endNode();
-        } else {
-            throw new IllegalStateException("Some of keys of " + getSchema().getQName() + " are missing in input.");
+    public void write(final NormalizedNodeStreamWriter writer) throws IOException {
+        final Collection<QName> keyDef = ((ListSchemaNode) getSchema()).getKeyDefinition();
+        if (keyDef.isEmpty()) {
+            writer.startUnkeyedListItem(provideNodeIdentifier(), childSizeHint());
+            super.write(writer);
+            writer.endNode();
+            return;
         }
-    }
 
-    private NodeIdentifierWithPredicates provideNodeIdentifierWithPredicates() {
-        Map<QName, Object> qNameToPredicateValues = new HashMap<>();
+        Preconditions.checkState(keyDef.size() == qNameToKeys.size(), "Input is missing some of the keys of %s", getSchema().getQName());
 
-        for (SimpleNodeDataWithSchema simpleNodeDataWithSchema : qNameToKeys.values()) {
-            qNameToPredicateValues.put(simpleNodeDataWithSchema.getSchema().getQName(), simpleNodeDataWithSchema.getValue());
+        // Need to restore schema order...
+        final Map<QName, Object> predicates = new LinkedHashMap<>();
+        for (QName qname : keyDef) {
+            predicates.put(qname, qNameToKeys.get(qname).getValue());
         }
 
-        return new NodeIdentifierWithPredicates(getSchema().getQName(), qNameToPredicateValues);
+        writer.startMapEntryNode(
+            new NodeIdentifierWithPredicates(getSchema().getQName(), predicates),
+            childSizeHint());
+        super.write(writer);
+        writer.endNode();
     }
-
 }