Map system-ordered keyed lists to Map
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / DataObjectStreamerGenerator.java
index f601b0628c5baa9f0cfb7e180ff0e2b4377a7d6b..5a3bc3d22908234d0adf63d896bb6b4e1dd7a079 100644 (file)
@@ -144,7 +144,7 @@ final class DataObjectStreamerGenerator<T extends DataObjectStreamer<?>> impleme
         BindingStreamEventWriter.class, List.class);
     private static final StackManipulation STREAM_MAP = invokeMethod(DataObjectStreamer.class,
         "streamMap", Class.class, DataObjectStreamer.class, DataObjectSerializerRegistry.class,
-        BindingStreamEventWriter.class, List.class);
+        BindingStreamEventWriter.class, Map.class);
     private static final StackManipulation STREAM_ORDERED_MAP = invokeMethod(DataObjectStreamer.class,
         "streamOrderedMap", Class.class, DataObjectStreamer.class, DataObjectSerializerRegistry.class,
         BindingStreamEventWriter.class, List.class);
@@ -257,14 +257,17 @@ final class DataObjectStreamerGenerator<T extends DataObjectStreamer<?>> impleme
             final String getterName = getter.getName();
             final Type childType = props.get(getterName);
             verify(childType instanceof ParameterizedType, "Unexpected type %s for %s", childType, getterName);
-            final Type valueType = ((ParameterizedType) childType).getActualTypeArguments()[0];
+            final Type[] params = ((ParameterizedType) childType).getActualTypeArguments();
+            final ListSchemaNode listSchema = (ListSchemaNode) childSchema;
             final Class<?> valueClass;
-            try {
-                valueClass = loader.loadClass(valueType.getFullyQualifiedName());
-            } catch (ClassNotFoundException e) {
-                throw new LinkageError("Failed to load " + valueType, e);
+            if (!listSchema.isUserOrdered() && !listSchema.getKeyDefinition().isEmpty()) {
+                loadTypeClass(loader, params[0]);
+                valueClass = loadTypeClass(loader, params[1]);
+            } else {
+                valueClass = loadTypeClass(loader, params[0]);
             }
-            return listChildStream(getter, valueClass.asSubclass(DataObject.class), (ListSchemaNode) childSchema);
+
+            return listChildStream(getter, valueClass.asSubclass(DataObject.class), listSchema);
         }
         if (childSchema instanceof ChoiceSchemaNode) {
             return choiceChildStream(getter);
@@ -374,6 +377,14 @@ final class DataObjectStreamerGenerator<T extends DataObjectStreamer<?>> impleme
         }
     }
 
+    private static Class<?> loadTypeClass(final CodecClassLoader loader, final Type type) {
+        try {
+            return loader.loadClass(type.getFullyQualifiedName());
+        } catch (ClassNotFoundException e) {
+            throw new LinkageError("Failed to load " + type, e);
+        }
+    }
+
     private static final class SerializeImplementation implements Implementation {
         private final List<ChildStream> children;
         private final StackManipulation startEvent;