Clarify BindingReflections.getChildrenClassToMethod() 66/99266/2
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 12 Jan 2022 10:33:15 +0000 (11:33 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 12 Jan 2022 10:39:44 +0000 (11:39 +0100)
Keys in the returned map are not any classes, but are guaranteed to be
DataContainers. Document that fact.

Change-Id: Ieac66637f9d5e6c2a9869304fd7a36b376ed5b05
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java
binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java

index 295146b5c05af081fbdb769e2c76299ad4847174..31df98235a63633be86018d2398e973f99dd8874 100644 (file)
@@ -32,6 +32,7 @@ import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.yang.binding.Augmentable;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.Item;
@@ -97,7 +98,8 @@ public abstract class DataObjectCodecContext<D extends DataObject, T extends Dat
         final Class<D> bindingClass = getBindingClass();
 
         final ImmutableMap<Method, ValueNodeCodecContext> tmpLeaves = factory().getLeafNodes(bindingClass, getSchema());
-        final Map<Class<?>, Method> clsToMethod = BindingReflections.getChildrenClassToMethod(bindingClass);
+        final Map<Class<? extends DataContainer>, Method> clsToMethod =
+            BindingReflections.getChildrenClassToMethod(bindingClass);
 
         final Map<YangInstanceIdentifier.PathArgument, NodeContextSupplier> byYangBuilder = new HashMap<>();
         final Map<Class<?>, DataContainerCodecPrototype<?>> byStreamClassBuilder = new HashMap<>();
@@ -114,11 +116,11 @@ public abstract class DataObjectCodecContext<D extends DataObject, T extends Dat
         this.leafChild = leafChildBuilder.build();
 
         final Map<Method, Class<?>> tmpDataObjects = new HashMap<>();
-        for (final Entry<Class<?>, Method> childDataObj : clsToMethod.entrySet()) {
+        for (final Entry<Class<? extends DataContainer>, Method> childDataObj : clsToMethod.entrySet()) {
             final Method method = childDataObj.getValue();
             verify(!method.isDefault(), "Unexpected default method %s in %s", method, bindingClass);
 
-            final Class<?> retClass = childDataObj.getKey();
+            final Class<? extends DataContainer> retClass = childDataObj.getKey();
             if (OpaqueObject.class.isAssignableFrom(retClass)) {
                 // Filter OpaqueObjects, they are not containers
                 continue;
@@ -268,7 +270,7 @@ public abstract class DataObjectCodecContext<D extends DataObject, T extends Dat
         return value;
     }
 
-    private DataContainerCodecPrototype<?> loadChildPrototype(final Class<?> childClass) {
+    private DataContainerCodecPrototype<?> loadChildPrototype(final Class<? extends DataContainer> childClass) {
         final DataSchemaNode childSchema = childNonNull(
             factory().getRuntimeContext().findChildSchemaDefinition(getSchema(), namespace(), childClass), childClass,
             "Node %s does not have child named %s", getSchema(), childClass);
index f77cb5ff60a637b51c49ef281da0b956a411607d..6695cb780b783f474b7efec9d3a59e55376c4a90 100644 (file)
@@ -438,19 +438,24 @@ public final class BindingReflections {
     /**
      * Scans supplied class and returns an iterable of all data children classes.
      *
-     * @param type
-     *            YANG Modeled Entity derived from DataContainer
+     * @param type YANG Modeled Entity derived from DataContainer
      * @return Iterable of all data children, which have YANG modeled entity
      */
-    public static Map<Class<?>, Method> getChildrenClassToMethod(final Class<?> type) {
-        return getChildrenClassToMethod(type, BindingMapping.GETTER_PREFIX);
+    public static Map<Class<? extends DataContainer>, Method> getChildrenClassToMethod(final Class<?> type) {
+        return getChildClassToMethod(type, BindingMapping.GETTER_PREFIX);
+    }
+
+    @Beta
+    public static Map<Class<? extends DataContainer>, Method> getChildrenClassToNonnullMethod(final Class<?> type) {
+        return getChildClassToMethod(type, BindingMapping.NONNULL_PREFIX);
     }
 
-    private static Map<Class<?>, Method> getChildrenClassToMethod(final Class<?> type, final String prefix) {
+    private static Map<Class<? extends DataContainer>, Method> getChildClassToMethod(final Class<?> type,
+            final String prefix) {
         checkArgument(type != null, "Target type must not be null");
         checkArgument(DataContainer.class.isAssignableFrom(type), "Supplied type %s must be derived from DataContainer",
             type);
-        Map<Class<?>, Method> ret = new HashMap<>();
+        Map<Class<? extends DataContainer>, Method> ret = new HashMap<>();
         for (Method method : type.getMethods()) {
             Optional<Class<? extends DataContainer>> entity = getYangModeledReturnType(method, prefix);
             if (entity.isPresent()) {
@@ -460,11 +465,6 @@ public final class BindingReflections {
         return ret;
     }
 
-    @Beta
-    public static Map<Class<?>, Method> getChildrenClassToNonnullMethod(final Class<?> type) {
-        return getChildrenClassToMethod(type, BindingMapping.NONNULL_PREFIX);
-    }
-
     private static Optional<Class<? extends DataContainer>> getYangModeledReturnType(final Method method,
             final String prefix) {
         final String methodName = method.getName();