Do not use BindingReflections in IdentityCodec 21/106621/2
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 22 Jun 2023 12:14:22 +0000 (14:14 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 22 Jun 2023 15:38:43 +0000 (17:38 +0200)
Instantiate a dedicated cache for holding object->QName mapping and use
that to service translation requests.

JIRA: MDSAL-783
Change-Id: I414a12f5f2a2e602a904d5dff0360ab0773dd26d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java

index 73f4945d59fc0d99a7015b8f4c4365fd19076f20..3fa1a9c03562da03cc048f9906ba2a39648b3f86 100644 (file)
@@ -19,7 +19,7 @@ import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingIdentityCodec;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
-import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
+import org.opendaylight.mdsal.binding.runtime.api.IdentityRuntimeType;
 import org.opendaylight.yangtools.yang.binding.BaseIdentity;
 import org.opendaylight.yangtools.yang.binding.contract.Naming;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -57,6 +57,18 @@ final class IdentityCodec extends AbstractValueCodec<QName, BaseIdentity> implem
                 }
             }
         });
+    private final LoadingCache<@NonNull Class<? extends BaseIdentity>, @NonNull QName> qnames =
+        // Note: weak keys because it is the user who is supplying implemented contract
+        CacheBuilder.newBuilder().weakKeys().build(new CacheLoader<>() {
+            @Override
+            public QName load(final Class<? extends BaseIdentity> key) {
+                final var schema = context.getTypeWithSchema(key);
+                if (schema instanceof IdentityRuntimeType identitySchema) {
+                    return identitySchema.statement().argument();
+                }
+                throw new IllegalStateException("Unexpected schema " + schema + " for " + key);
+            }
+        });
 
     private final BindingRuntimeContext context;
 
@@ -87,6 +99,11 @@ final class IdentityCodec extends AbstractValueCodec<QName, BaseIdentity> implem
 
     @Override
     public QName fromBinding(final BaseIdentity bindingValue) {
-        return BindingReflections.getQName(bindingValue);
+        try {
+            return qnames.get(bindingValue.implementedInterface());
+        } catch (ExecutionException e) {
+            Throwables.throwIfUnchecked(e.getCause());
+            throw new IllegalStateException("Unexpected error translating " + bindingValue, e);
+        }
     }
 }