Simplify builder's addAugmentation() method 42/45742/7
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 20 Apr 2020 23:15:06 +0000 (01:15 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 21 Apr 2020 06:39:22 +0000 (08:39 +0200)
All augmentation already extend DataObject, which really is to say
that Augmentation should be doing the same. This has the benefit
of giving us access to DataContainer.implementedInterface(), which
we can use to add a simplified addAugmentation() method.

JIRA: MDSAL-183
Change-Id: I053a2d23e6bf95e07fa58e4078a37661e6e726a3
Signed-off-by: Michael Vorburger <vorburger@redhat.com>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectStreamer.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderTemplate.xtend
binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/util/DataObjectReadingUtil.java
binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflectionsTest.java
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/Augmentation.java

index f21856fdd4fc6eec93c11af8d9d0e664fd12bda4..547cd5b2232ebacdd7a6dbc23ef84304d73cc584 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Verify.verify;
 
 import com.google.common.annotations.Beta;
@@ -165,20 +164,16 @@ public abstract class DataObjectStreamer<T extends DataObject> implements DataOb
         writer.endNode();
     }
 
-    @SuppressWarnings("rawtypes")
-    private static void emitAugmentation(final Class type, final Augmentation<?> value,
+    private static void emitAugmentation(final Class<? extends Augmentation<?>> type, final Augmentation<?> value,
             final BindingStreamEventWriter writer, final DataObjectSerializerRegistry registry) throws IOException {
         /*
-         * Binding Specification allowed to insert augmentation with null for
-         * value, which effectively could be used to remove augmentation
-         * from builder / DTO.
+         * Binding Specification allowed to insert augmentation with null for value, which effectively could be used to
+         * remove augmentation from builder / DTO.
          */
         if (value != null) {
-            checkArgument(value instanceof DataObject);
-            @SuppressWarnings("unchecked")
             final DataObjectSerializer serializer = registry.getSerializer(type);
             if (serializer != null) {
-                serializer.serialize((DataObject) value, writer);
+                serializer.serialize(value, writer);
             } else {
                 LOG.warn("DataObjectSerializer is not present for {} in registry {}", type, registry);
             }
index 538c06ac88347c14684ca5a7899b9ae4416c01e8..571fbd8a30c13e1d9e01cf8f0ea40c44a7af6ef3 100644 (file)
@@ -1009,10 +1009,9 @@ abstract class AbstractTypeGenerator {
         final GeneratedTypeBuilder augTypeBuilder = typeProvider.newGeneratedTypeBuilder(
             JavaTypeName.create(augmentPackageName, augTypeName));
 
-        augTypeBuilder.addImplementsType(DATA_OBJECT);
+        augTypeBuilder.addImplementsType(augmentation(targetTypeRef));
         defaultImplementedInterace(augTypeBuilder);
 
-        augTypeBuilder.addImplementsType(augmentation(targetTypeRef));
         annotateDeprecatedIfNecessary(augSchema, augTypeBuilder);
         addImplementedInterfaceFromUses(augSchema, augTypeBuilder);
 
index 673ca581d61adea732f5c090fcb9454eaecab7f4..d68746279294e721957aa8010445f859d0d83715 100644 (file)
@@ -11,6 +11,7 @@ import static extension org.apache.commons.text.StringEscapeUtils.escapeJava
 import static org.opendaylight.mdsal.binding.model.util.BindingTypes.DATA_OBJECT
 import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTABLE_AUGMENTATION_NAME
 import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.AUGMENTATION_FIELD
+import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.DATA_CONTAINER_IMPLEMENTED_INTERFACE_NAME
 
 import com.google.common.collect.ImmutableList
 import java.util.ArrayList
@@ -341,6 +342,10 @@ class BuilderTemplate extends AbstractBuilderTemplate {
             «val augmentTypeRef = augmentType.importedName»
             «val jlClassRef = CLASS.importedName»
             «val hashMapRef = JU_HASHMAP.importedName»
+            public «type.name» add«AUGMENTATION_FIELD_UPPER»(«augmentTypeRef» augmentation) {
+                return add«AUGMENTATION_FIELD_UPPER»(augmentation.«DATA_CONTAINER_IMPLEMENTED_INTERFACE_NAME»(), augmentation);
+            }
+
             public «type.name» add«AUGMENTATION_FIELD_UPPER»(«jlClassRef»<? extends «augmentTypeRef»> augmentationType, «augmentTypeRef» augmentationValue) {
                 if (augmentationValue == null) {
                     return remove«AUGMENTATION_FIELD_UPPER»(augmentationType);
index 67178c8e726b78fb430d381588cd0c9f7cae5bab..1bbe219ba9e9da7edd1b18859dc018e906c8d876 100644 (file)
@@ -302,14 +302,11 @@ public final class DataObjectReadingUtil {
         }
 
         @Override
+        @SuppressWarnings({ "rawtypes", "unchecked" })
         public DataContainer read(final DataContainer parent, final Class<?> child) {
             checkArgument(Augmentation.class.isAssignableFrom(child), "Child must be Augmentation.");
             checkArgument(parent instanceof Augmentable<?>, "Parent must be Augmentable.");
-
-            @SuppressWarnings({ "rawtypes", "unchecked" })
-            Augmentation potential = ((Augmentable) parent).augmentation(child);
-            checkState(potential instanceof DataContainer, "Readed augmention must be data object");
-            return (DataContainer) potential;
+            return ((Augmentable) parent).augmentation(child);
         }
     }
 
index 1065418157335cf272e446eb89e7a0e28d0bbd3f..a0355e697770a1b4e6f88cdac8aa08f8a92971a2 100644 (file)
@@ -76,5 +76,10 @@ public class BindingReflectionsTest {
         ListenableFuture<?> rpcMethodTest2() {
             return null;
         }
+
+        @Override
+        public Class<TestImplementation> implementedInterface() {
+            return TestImplementation.class;
+        }
     }
 }
\ No newline at end of file
index 52de172fd1bf4e579fdb7bd622c14feb27e48ad3..c3e1283c2a1bd4f575a5bb32ca04d08648d36e4e 100644 (file)
@@ -16,6 +16,7 @@ package org.opendaylight.yangtools.yang.binding;
  *
  * @param <T> Class to which this implementation is extension.
  */
-public interface Augmentation<T> {
-
+public interface Augmentation<T> extends DataObject {
+    @Override
+    Class<? extends Augmentation<T>> implementedInterface();
 }