From: Robert Varga Date: Sun, 28 May 2023 13:50:41 +0000 (+0200) Subject: Improve BindingCodecTree interface X-Git-Tag: v12.0.0~104 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=578068bf0c41c9902638695d3b48ccc0e06d4c9c;p=mdsal.git Improve BindingCodecTree interface We have users which know statically that they are dealing with a plain DataObject or an Augmentation. Add methods to help them to get the right codec. JIRA: MDSAL-820 Change-Id: Idf0209c9dc705cf8359688a0eef2dd2e9fa00df2 Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTree.java b/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTree.java index b1f3a38cf3..5986c2a652 100644 --- a/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTree.java +++ b/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTree.java @@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Empty; @@ -39,6 +40,29 @@ public interface BindingCodecTree extends BindingDataObjectCodecTreeParent DataObject type + * @param path Binding path + * @return A {@link BindingAugmentationCodecTreeNode} + * @throws NullPointerException if {@code path} is {@code null} + * @throws IllegalArgumentException if the codec cannot be resolved + */ + > @NonNull BindingAugmentationCodecTreeNode getAugmentationCodec( + InstanceIdentifier path); + + /** + * Look up the codec for specified ordinary DataObject path. + * + * @param DataObject type + * @param path Binding path + * @return A {@link BindingDataObjectCodecTreeNode} + * @throws NullPointerException if {@code path} is {@code null} + * @throws IllegalArgumentException if the codec cannot be resolved or refers to an Augmentation + */ + @NonNull BindingDataObjectCodecTreeNode getDataObjectCodec(InstanceIdentifier path); + /** * Look up the codec for specified path, constructing the {@link YangInstanceIdentifier} corresponding to it. * diff --git a/binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/ForwardingBindingDOMCodecServices.java b/binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/ForwardingBindingDOMCodecServices.java index ac225ac44b..f3a4c3f273 100644 --- a/binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/ForwardingBindingDOMCodecServices.java +++ b/binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/ForwardingBindingDOMCodecServices.java @@ -12,7 +12,9 @@ import com.google.common.collect.ForwardingObject; import java.time.Instant; import java.util.Map.Entry; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingAugmentationCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.api.BindingIdentityCodec; import org.opendaylight.mdsal.binding.dom.codec.api.BindingInstanceIdentifierCodec; import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode; @@ -20,6 +22,7 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter; import org.opendaylight.mdsal.binding.dom.codec.api.CommonDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext; import org.opendaylight.yangtools.yang.binding.Action; +import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BaseNotification; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -168,6 +171,18 @@ public abstract class ForwardingBindingDOMCodecServices extends ForwardingObject return delegate().getSubtreeCodecWithPath(path); } + @Override + public > BindingAugmentationCodecTreeNode getAugmentationCodec( + final InstanceIdentifier path) { + return delegate().getAugmentationCodec(path); + } + + @Override + public BindingDataObjectCodecTreeNode getDataObjectCodec( + final InstanceIdentifier path) { + return delegate().getDataObjectCodec(path); + } + @Override public CommonDataObjectCodecTreeNode getSubtreeCodec(final InstanceIdentifier path) { return delegate().getSubtreeCodec(path); diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java index e985940d3f..9842c0f0dd 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java @@ -58,6 +58,7 @@ import org.opendaylight.yangtools.concepts.Delegator; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.util.ClassLoaderUtils; import org.opendaylight.yangtools.yang.binding.Action; +import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BaseIdentity; import org.opendaylight.yangtools.yang.binding.BaseNotification; import org.opendaylight.yangtools.yang.binding.DataContainer; @@ -508,6 +509,28 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri return root.streamChild(childClass); } + @Override + @SuppressWarnings("unchecked") + public > BindingAugmentationCodecTreeNode getAugmentationCodec( + final InstanceIdentifier path) { + final var codecContext = getCodecContextNode(path, null); + if (codecContext instanceof BindingAugmentationCodecTreeNode) { + return (BindingAugmentationCodecTreeNode) codecContext; + } + throw new IllegalArgumentException(path + " does not refer to an Augmentation"); + } + + @Override + @SuppressWarnings("unchecked") + public BindingDataObjectCodecTreeNode getDataObjectCodec( + final InstanceIdentifier path) { + final var codecContext = getCodecContextNode(path, null); + if (codecContext instanceof BindingDataObjectCodecTreeNode) { + return (BindingDataObjectCodecTreeNode) codecContext; + } + throw new IllegalArgumentException(path + " does not refer to a plain DataObject"); + } + @Override @SuppressWarnings("unchecked") public CodecWithPath getSubtreeCodecWithPath(final InstanceIdentifier path) { diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5524augmentUses.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5524augmentUses.java index 37792e83e6..4f0d6cceff 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5524augmentUses.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5524augmentUses.java @@ -11,7 +11,6 @@ import static org.junit.Assert.assertNotNull; import java.util.List; import org.junit.Test; -import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.ListModule11Builder; import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.list.module1._1.ListModule12Builder; import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.list.module1._1.list.module1._2.ContainerModule1Builder; @@ -28,7 +27,6 @@ import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev1 import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev160101.module4.main.ContainerModule4Builder; import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev160101.module4.main.container.module._4.ManualContainerModule11Builder; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; public class Bug5524augmentUses extends AbstractBindingCodecTest { @Test @@ -69,11 +67,10 @@ public class Bug5524augmentUses extends AbstractBindingCodecTest { .build()) .build(); - final var subtreeCodec = (BindingDataObjectCodecTreeNode) codecContext.getSubtreeCodec( - InstanceIdentifier.create(Module4Main.class)); - final NormalizedNode serialized = subtreeCodec.serialize(module4Main); - final NormalizedNode manualSerialized = subtreeCodec.serialize(manualModule4Main); - final NormalizedNode containerManualSerialized = subtreeCodec.serialize(contManualModule4Main); + final var subtreeCodec = codecContext.getDataObjectCodec(InstanceIdentifier.create(Module4Main.class)); + final var serialized = subtreeCodec.serialize(module4Main); + final var manualSerialized = subtreeCodec.serialize(manualModule4Main); + final var containerManualSerialized = subtreeCodec.serialize(contManualModule4Main); assertNotNull(serialized); assertNotNull(manualSerialized); assertNotNull(containerManualSerialized); diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5845booleanKeyTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5845booleanKeyTest.java index 6fe7a53f27..8a67255eb5 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5845booleanKeyTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5845booleanKeyTest.java @@ -11,7 +11,6 @@ import static org.junit.Assert.assertNotNull; import java.util.Collections; import org.junit.Test; -import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101.BooleanContainer; import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101.BooleanContainerBuilder; import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListBuilder; @@ -19,7 +18,6 @@ import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.Bo import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListIntKey; import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; public class Bug5845booleanKeyTest extends AbstractBindingCodecTest { @Test @@ -41,11 +39,10 @@ public class Bug5845booleanKeyTest extends AbstractBindingCodecTest { .build())) .build(); - final var subtreeCodec = (BindingDataObjectCodecTreeNode) codecContext.getSubtreeCodec( - InstanceIdentifier.create(BooleanContainer.class)); - final NormalizedNode serializedInt = subtreeCodec.serialize(booleanContainerInt); + final var subtreeCodec = codecContext.getDataObjectCodec(InstanceIdentifier.create(BooleanContainer.class)); + final var serializedInt = subtreeCodec.serialize(booleanContainerInt); assertNotNull(serializedInt); - final NormalizedNode serialized = subtreeCodec.serialize(booleanContainer); + final var serialized = subtreeCodec.serialize(booleanContainer); assertNotNull(serialized); } } diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingCodecTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingCodecTest.java index 3563522967..d5043d4979 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingCodecTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingCodecTest.java @@ -72,8 +72,8 @@ public class CachingCodecTest extends AbstractBindingCodecTest { @Before public void before() { super.before(); - topNode = (BindingDataObjectCodecTreeNode) codecContext.getSubtreeCodec(TOP_PATH); - contNode = (BindingDataObjectCodecTreeNode) codecContext.getSubtreeCodec(CONT_PATH); + topNode = codecContext.getDataObjectCodec(TOP_PATH); + contNode = codecContext.getDataObjectCodec(CONT_PATH); } private static Map createList(final int num) { diff --git a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyContentBuilder.java b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyContentBuilder.java index f2bc6d2dec..8416f6a774 100644 --- a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyContentBuilder.java +++ b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyContentBuilder.java @@ -7,7 +7,6 @@ */ package org.opendaylight.mdsal.yanglib.rfc8525; -import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; import com.google.common.annotations.VisibleForTesting; @@ -41,8 +40,7 @@ final class LegacyContentBuilder implements YangLibraryContentBuilderWithLegacy LegacyContentBuilder(final YangLibraryContentBuilderImpl delegate, final BindingCodecTree codecTree) { this.delegate = requireNonNull(delegate); - legacyCodec = (BindingDataObjectCodecTreeNode) - verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(ModulesState.class))); + legacyCodec = codecTree.getDataObjectCodec(InstanceIdentifier.create(ModulesState.class)); } @Override diff --git a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibraryContentBuilderImpl.java b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibraryContentBuilderImpl.java index a78455442f..2f21db2fa1 100644 --- a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibraryContentBuilderImpl.java +++ b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibraryContentBuilderImpl.java @@ -8,7 +8,6 @@ package org.opendaylight.mdsal.yanglib.rfc8525; import static com.google.common.base.Preconditions.checkState; -import static com.google.common.base.Verify.verifyNotNull; import java.util.HashMap; import java.util.Map; @@ -49,8 +48,7 @@ final class YangLibraryContentBuilderImpl implements YangLibraryContentBuilder { YangLibraryContentBuilderImpl(final BindingCodecTree codecTree) { this.codecTree = Objects.requireNonNull(codecTree); - codec = (BindingDataObjectCodecTreeNode) - verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(YangLibrary.class))); + codec = codecTree.getDataObjectCodec(InstanceIdentifier.create(YangLibrary.class)); } @Override diff --git a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java index f06f963acb..b62f1f95f4 100644 --- a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java +++ b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java @@ -7,8 +7,6 @@ */ package org.opendaylight.mdsal.yanglib.rfc8525; -import static com.google.common.base.Verify.verifyNotNull; - import com.google.common.annotations.Beta; import javax.inject.Inject; import javax.inject.Singleton; @@ -67,10 +65,8 @@ public final class YangLibrarySupport implements YangLibSupport { generator.generateTypeMapping(context), snapshot)); identityCodec = codecTree.getIdentityCodec(); - codec = (BindingDataObjectCodecTreeNode) - verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(YangLibrary.class))); - legacyCodec = (BindingDataObjectCodecTreeNode) - verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(ModulesState.class))); + codec = codecTree.getDataObjectCodec(InstanceIdentifier.create(YangLibrary.class)); + legacyCodec = codecTree.getDataObjectCodec(InstanceIdentifier.create(ModulesState.class)); } @Override diff --git a/yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyYangLibraryFormatTest.java b/yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyYangLibraryFormatTest.java index e56460a03d..8ce1e350de 100644 --- a/yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyYangLibraryFormatTest.java +++ b/yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyYangLibraryFormatTest.java @@ -14,7 +14,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import org.junit.Test; -import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.RevisionIdentifier; @@ -31,8 +30,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; public class LegacyYangLibraryFormatTest extends AbstractYangLibraryTest { @Test public void testLegacyFormat() { - final var legacyCodec = (BindingDataObjectCodecTreeNode) - codecTree.getSubtreeCodec(InstanceIdentifier.create(ModulesState.class)); + final var legacyCodec = codecTree.getDataObjectCodec(InstanceIdentifier.create(ModulesState.class)); final Optional legacyContent = yangLib.newContentBuilder() .defaultContext(runtimeContext.getEffectiveModelContext()) diff --git a/yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportTest.java b/yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportTest.java index fce3e08d65..147acdacbb 100644 --- a/yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportTest.java +++ b/yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportTest.java @@ -12,7 +12,6 @@ import static org.junit.Assert.assertEquals; import java.util.Map; import java.util.Set; import org.junit.Test; -import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.RevisionIdentifier; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibrary; @@ -29,8 +28,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; public class YangLibrarySupportTest extends AbstractYangLibraryTest { @Test public void testFormatSchema() { - final var codec = (BindingDataObjectCodecTreeNode) - codecTree.getSubtreeCodec(InstanceIdentifier.create(YangLibrary.class)); + final var codec = codecTree.getDataObjectCodec(InstanceIdentifier.create(YangLibrary.class)); final ContainerNode nonLegacyContent = yangLib.newContentBuilder() .defaultContext(runtimeContext.getEffectiveModelContext()).formatYangLibraryContent();