From: Robert Varga Date: Thu, 22 Jun 2023 12:14:22 +0000 (+0200) Subject: Do not use BindingReflections in IdentityCodec X-Git-Tag: v12.0.0~29 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=eb87964bf5791221e2f5cf113a2760c32f385a8e;p=mdsal.git Do not use BindingReflections in IdentityCodec 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 --- diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java index 73f4945d59..3fa1a9c035 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java @@ -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 implem } } }); + private final LoadingCache<@NonNull Class, @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 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 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); + } } }