Speed up BindingReflections.getAugmentations() 28/81728/2
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 24 Apr 2019 09:05:38 +0000 (11:05 +0200)
committerRobert Varga <nite@hq.sk>
Wed, 24 Apr 2019 12:48:43 +0000 (12:48 +0000)
One of the ways in which we can acquire augmentations is through
AugmentationHolder interface. While this is handled through
AugmentationFieldGetter.getGetter(), that is not really efficient
as it requires indirection through multiple implementations.

Since AugmentationFieldGetter is a package-internal implementation
detail, factor the check out into BindingReflections, where it can
execute directly. This not only improves locality, but also allows
us to remove one AugmentationFieldGetter implementation, resulting
in bimorphic invocation.

Change-Id: I15584dbe6151a70d13a766f27b927f598a5d21ba
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/AugmentationFieldGetter.java
binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java
binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect/AugmentationFieldGetterTest.java

index 33009197f109016591c15a89981c7673bcf7b3a2..ad0c430d2ee76e123e50019d2edba14d51896dd3 100644 (file)
@@ -24,7 +24,6 @@ import java.util.Collections;
 import java.util.Map;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
-import org.opendaylight.yangtools.yang.binding.AugmentationHolder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,19 +33,11 @@ abstract class AugmentationFieldGetter {
 
     private static final AugmentationFieldGetter DUMMY = new AugmentationFieldGetter() {
         @Override
-        protected Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
+        Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
             return Collections.emptyMap();
         }
     };
 
-    private static final AugmentationFieldGetter AUGMENTATION_HOLDER_GETTER = new AugmentationFieldGetter() {
-        @Override
-        @SuppressWarnings({"unchecked", "rawtypes"})
-        protected Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
-            return (Map) ((AugmentationHolder<?>) input).augmentations();
-        }
-    };
-
     private static final LoadingCache<Class<?>, AugmentationFieldGetter> AUGMENTATION_GETTERS =
             CacheBuilder.newBuilder().weakKeys().build(new AugmentationGetterLoader());
 
@@ -56,12 +47,9 @@ abstract class AugmentationFieldGetter {
      * @param input Input Data object, from which augmentations should be extracted
      * @return Map of Augmentation class to augmentation
      */
-    protected abstract Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(Object input);
+    abstract Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(Object input);
 
-    public static AugmentationFieldGetter getGetter(final Class<? extends Object> clz) {
-        if (AugmentationHolder.class.isAssignableFrom(clz)) {
-            return AUGMENTATION_HOLDER_GETTER;
-        }
+    static AugmentationFieldGetter getGetter(final Class<? extends Object> clz) {
         return AUGMENTATION_GETTERS.getUnchecked(clz);
     }
 
@@ -102,7 +90,7 @@ abstract class AugmentationFieldGetter {
 
         @Override
         @SuppressWarnings("checkstyle:illegalCatch")
-        protected Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
+        Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Object input) {
             try {
                 return (Map<Class<? extends Augmentation<?>>, Augmentation<?>>) fieldGetter.invokeExact(input);
             } catch (Throwable e) {
index af800bee26fbd08ac879ff93a7cd8ded32e791a2..5875f17b91a3e5e5464e7ce160a8e71763c95e62 100644 (file)
@@ -38,6 +38,7 @@ import org.opendaylight.yangtools.util.ClassLoaderUtils;
 import org.opendaylight.yangtools.yang.binding.Action;
 import org.opendaylight.yangtools.yang.binding.Augmentable;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
+import org.opendaylight.yangtools.yang.binding.AugmentationHolder;
 import org.opendaylight.yangtools.yang.binding.BaseIdentity;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.DataContainer;
@@ -548,6 +549,9 @@ public final class BindingReflections {
      * @return Map of augmentations if read was successful, otherwise empty map.
      */
     public static Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAugmentations(final Augmentable<?> input) {
+        if (input instanceof AugmentationHolder) {
+            return ((AugmentationHolder) input).augmentations();
+        }
         return AugmentationFieldGetter.getGetter(input.getClass()).getAugmentations(input);
     }
 
index e2de73d8d4bf8d98a777eeb152204a9f302a93b1..b37d713ad8f2977568b4ca0489d8acdcd1a1b5a3 100644 (file)
@@ -18,15 +18,11 @@ import java.util.HashMap;
 import java.util.Map;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
-import org.opendaylight.yangtools.yang.binding.AugmentationHolder;
 
 public class AugmentationFieldGetterTest {
 
     @Test
     public void getGetterTest() throws Exception {
-        assertNotNull(getGetter(AugmentationHolder.class));
-        assertTrue(getGetter(AugmentationHolder.class)
-                .getAugmentations(mock(AugmentationHolder.class)).isEmpty());
         assertTrue(getGetter(Object.class).getAugmentations(null).isEmpty());
         assertTrue(getGetter(TestAugmentationWrongTypeClass.class).getAugmentations(null).isEmpty());