Use bindingToString() generated for interfaces 15/91315/25
authorillia.ihushev <illia.ihushev@pantheon.tech>
Tue, 14 Jul 2020 08:21:49 +0000 (11:21 +0300)
committerRobert Varga <nite@hq.sk>
Sun, 19 Jul 2020 21:31:12 +0000 (21:31 +0000)
As we are generating a default implementation of toString(), we
can defer to that implementation from runtime-generated proxies.

This results in:
- consistent results between compile-time and runtime implementations
- faster startup time, as there is only one dispatch implementation
- lower memory overhead, as runtime-generated classes are smaller
- more maintainable code, as the implementation can be examined at
  compile-time

JIRA: MDSAL-480
Change-Id: I56aceeb70461f6d35fcd6487e924fdd127a1ba1c
Signed-off-by: illia.ihushev <illia.ihushev@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java

index 4c3c488836997d26565c39da9eeaac4bdcff3dab..7ed46506e0cc21d8db0afa5598502cc6acb5706f 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableMap;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.VarHandle;
@@ -98,11 +97,6 @@ public abstract class AugmentableCodecDataObject<T extends DataObject & Augmenta
         return super.codecAugmentedEquals(other) && augmentations().equals(BindingReflections.getAugmentations(other));
     }
 
-    @Override
-    final ToStringHelper codecAugmentedFillToString(final ToStringHelper helper) {
-        return super.codecAugmentedFillToString(helper).add("augmentation", augmentations().values());
-    }
-
     private ImmutableMap<Class<? extends Augmentation<T>>, Augmentation<T>> acquireAugmentations() {
         return (ImmutableMap<Class<? extends Augmentation<T>>, Augmentation<T>>) CACHED_AUGMENTATIONS.getAcquire(this);
     }
index d7663d2204fa2d9c08e6b6c7ab245f6dd73256c0..1850016c99d4410136ef4fbcb507ec8422edb40e 100644 (file)
@@ -10,8 +10,6 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.VarHandle;
@@ -83,10 +81,7 @@ public abstract class CodecDataObject<T extends DataObject> implements DataObjec
     }
 
     @Override
-    public final String toString() {
-        return codecAugmentedFillToString(MoreObjects.toStringHelper(implementedInterface()).omitNullValues())
-                .toString();
-    }
+    public abstract String toString();
 
     protected final Object codecMember(final VarHandle handle, final String localName) {
         final Object cached = handle.getAcquire(this);
@@ -112,8 +107,6 @@ public abstract class CodecDataObject<T extends DataObject> implements DataObjec
 
     protected abstract boolean codecEquals(T other);
 
-    protected abstract ToStringHelper codecFillToString(ToStringHelper helper);
-
     final @NonNull DataObjectCodecContext<T, ?> codecContext() {
         return context;
     }
@@ -133,11 +126,6 @@ public abstract class CodecDataObject<T extends DataObject> implements DataObjec
         return codecEquals(other);
     }
 
-    // Non-final to allow specialization in AugmentableCodecDataObject
-    ToStringHelper codecAugmentedFillToString(final ToStringHelper helper) {
-        return codecFillToString(helper);
-    }
-
     // Helper split out of codecMember to aid its inlining
     private Object loadMember(final VarHandle handle, final NodeCodecContext childCtx) {
         @SuppressWarnings("unchecked")
index 46cd63f35f0f51c7224ed2deff98647e7f5fdd03..8fbd418e8fcb4727a7009ea5a87e4daefad4799f 100644 (file)
@@ -15,7 +15,6 @@ import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.getFi
 import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.invokeMethod;
 import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.putField;
 
-import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import java.lang.invoke.MethodHandles;
@@ -60,6 +59,7 @@ import org.opendaylight.mdsal.binding.dom.codec.impl.ClassGeneratorBridge.NodeCo
 import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader;
 import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.ClassGenerator;
 import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.GeneratorResult;
+import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -259,8 +259,8 @@ abstract class CodecDataObjectGenerator<T extends CodecDataObject<?>> implements
     private static final Logger LOG = LoggerFactory.getLogger(CodecDataObjectGenerator.class);
     private static final Generic BB_BOOLEAN = TypeDefinition.Sort.describe(boolean.class);
     private static final Generic BB_DATAOBJECT = TypeDefinition.Sort.describe(DataObject.class);
-    private static final Generic BB_HELPER = TypeDefinition.Sort.describe(ToStringHelper.class);
     private static final Generic BB_INT = TypeDefinition.Sort.describe(int.class);
+    private static final Generic BB_STRING = TypeDefinition.Sort.describe(String.class);
     private static final TypeDescription BB_CDO = ForLoadedType.of(CodecDataObject.class);
     private static final TypeDescription BB_ACDO = ForLoadedType.of(AugmentableCodecDataObject.class);
     private static final Comparator<Method> METHOD_BY_ALPHABET = Comparator.comparing(Method::getName);
@@ -269,9 +269,6 @@ abstract class CodecDataObjectGenerator<T extends CodecDataObject<?>> implements
         byte[].class, byte[].class);
     private static final StackManipulation OBJECTS_EQUALS = invokeMethod(Objects.class, "equals",
         Object.class, Object.class);
-    private static final StackManipulation HELPER_ADD = invokeMethod(ToStringHelper.class, "add",
-        String.class, Object.class);
-
     private static final StackManipulation FIRST_ARG_REF = MethodVariableAccess.REFERENCE.loadFrom(1);
 
     private static final int PROT_FINAL = Opcodes.ACC_PROTECTED | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC;
@@ -339,9 +336,9 @@ abstract class CodecDataObjectGenerator<T extends CodecDataObject<?>> implements
                 // ... codecEquals() ...
                 .defineMethod("codecEquals", BB_BOOLEAN, PROT_FINAL).withParameter(BB_DATAOBJECT)
                 .intercept(codecEquals(methods))
-                // ... and codecFillToString() ...
-                .defineMethod("codecFillToString", BB_HELPER, PROT_FINAL).withParameter(BB_HELPER)
-                .intercept(codecFillToString(methods))
+                // ... toString() ...
+                .defineMethod("toString", BB_STRING, PUB_FINAL)
+                .intercept(toString(bindingInterface))
                 // ... and build it
                 .make());
     }
@@ -380,21 +377,12 @@ abstract class CodecDataObjectGenerator<T extends CodecDataObject<?>> implements
         return new Implementation.Simple(manipulations.toArray(new StackManipulation[0]));
     }
 
-    private static Implementation codecFillToString(final ImmutableMap<StackManipulation, Method> properties) {
-        final List<StackManipulation> manipulations = new ArrayList<>(properties.size() * 4 + 2);
-        // push 'return helper' to stack...
-        manipulations.add(FIRST_ARG_REF);
-        for (Entry<StackManipulation, Method> entry : properties.entrySet()) {
-            // .add("getFoo", getFoo())
-            manipulations.add(new TextConstant(entry.getValue().getName()));
-            manipulations.add(THIS);
-            manipulations.add(entry.getKey());
-            manipulations.add(HELPER_ADD);
-        }
-        // ... execute 'return helper'
-        manipulations.add(MethodReturn.REFERENCE);
-
-        return new Implementation.Simple(manipulations.toArray(new StackManipulation[0]));
+    private static Implementation toString(final Class<?> bindingInterface) {
+        return new Implementation.Simple(
+            // return Foo.bindingToString(this);
+            THIS,
+            invokeMethod(bindingInterface, BindingMapping.BINDING_TO_STRING_NAME, bindingInterface),
+            MethodReturn.REFERENCE);
     }
 
     private abstract static class AbstractMethodImplementation implements Implementation {