From 61fdc5953d6041f6be61663b941d926b1fbd3221 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 21 Feb 2022 14:34:38 +0100 Subject: [PATCH] Separate out notification handling This reverts another part of 7a17eba49deb73733bdbb9579d2edd672bb0d71e as well as 576ae2cd595f0ce17abd1f33150b068b7f0f801d, hence not allowing Notifications to be entered through streamChild(). JIRA: MDSAL-724 Change-Id: I1b37139fcb8bd8aaf92465943a46e71069e87f3e Signed-off-by: Robert Varga --- .../codec/impl/SchemaRootCodecContext.java | 21 ++++++++++++------- .../binding/dom/codec/impl/Mdsal724Test.java | 13 ++++++++++++ .../api/AbstractBindingRuntimeContext.java | 3 +++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java index be48e153fd..bfa286ac54 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java @@ -61,13 +61,6 @@ final class SchemaRootCodecContext extends DataContainerCo CacheBuilder.newBuilder().build(new CacheLoader<>() { @Override public DataContainerCodecContext load(final Class key) { - if (Notification.class.isAssignableFrom(key)) { - checkArgument(key.isInterface(), "Supplied class must be interface."); - final QName qname = BindingReflections.findQName(key); - final NotificationDefinition schema = getSchema().findNotification(qname).orElseThrow( - () -> new IllegalArgumentException("Supplied " + key + " is not valid notification")); - return new NotificationCodecContext<>(key, schema, factory()); - } return createDataTreeChildContext(key); } }); @@ -88,6 +81,18 @@ final class SchemaRootCodecContext extends DataContainerCo } }); + private final LoadingCache, NotificationCodecContext> notificationsByClass = CacheBuilder.newBuilder() + .build(new CacheLoader, NotificationCodecContext>() { + @Override + public NotificationCodecContext load(final Class key) { + checkArgument(key.isInterface(), "Supplied class must be interface."); + final QName qname = BindingReflections.findQName(key); + final NotificationDefinition schema = getSchema().findNotification(qname).orElseThrow( + () -> new IllegalArgumentException("Supplied " + key + " is not valid notification")); + return new NotificationCodecContext<>(key, schema, factory()); + } + }); + private final LoadingCache, ContainerNodeCodecContext> rpcDataByClass = CacheBuilder.newBuilder() .build(new CacheLoader, ContainerNodeCodecContext>() { @Override @@ -205,7 +210,7 @@ final class SchemaRootCodecContext extends DataContainerCo } NotificationCodecContext getNotification(final Class> notification) { - return (NotificationCodecContext) streamChild((Class)notification); + return getOrRethrow(notificationsByClass, notification); } NotificationCodecContext getNotification(final Absolute notification) { diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Mdsal724Test.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Mdsal724Test.java index 0da0bed50f..33da2fe7ec 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Mdsal724Test.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Mdsal724Test.java @@ -7,15 +7,28 @@ */ package org.opendaylight.mdsal.binding.dom.codec.impl; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import org.junit.Test; import org.opendaylight.mdsal.binding.dom.codec.api.IncorrectNestingException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.notification.rev150205.OutOfPixieDustNotification; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.md.sal.knock.knock.rev180723.KnockKnockInput; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public class Mdsal724Test extends AbstractBindingCodecTest { + @Test + public void testNotificationInstanceIdentifier() { + // An InstanceIdentifier pointing at a notification, unsafe to create + @SuppressWarnings({ "rawtypes", "unchecked" }) + final var iid = InstanceIdentifier.create((Class) OutOfPixieDustNotification.class); + + final var ex = assertThrows(IllegalArgumentException.class, () -> codecContext.toYangInstanceIdentifier(iid)); + assertThat(ex.getMessage(), startsWith("Supplied class must not be a notification (")); + } + @Test public void testRpcInputInstanceIdentifier() { // An InstanceIdentifier pointing at a notification, unsafe to create diff --git a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/AbstractBindingRuntimeContext.java b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/AbstractBindingRuntimeContext.java index 3b0d074c37..f7587ee913 100644 --- a/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/AbstractBindingRuntimeContext.java +++ b/binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/mdsal/binding/runtime/api/AbstractBindingRuntimeContext.java @@ -34,6 +34,7 @@ import org.opendaylight.mdsal.binding.model.api.Type; import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder; import org.opendaylight.yangtools.yang.binding.Action; import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; @@ -87,6 +88,8 @@ public abstract class AbstractBindingRuntimeContext implements BindingRuntimeCon checkArgument(!Augmentation.class.isAssignableFrom(cls), "Supplied class must not be an augmentation (%s is)", cls); checkArgument(!Action.class.isAssignableFrom(cls), "Supplied class must not be an action (%s is)", cls); + checkArgument(!Notification.class.isAssignableFrom(cls), "Supplied class must not be a notification (%s is)", + cls); return (DataSchemaNode) getTypes().findSchema(Type.of(cls)).orElse(null); } -- 2.36.6