Improve BindingCodecTree interface 93/106193/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 28 May 2023 13:50:41 +0000 (15:50 +0200)
committerRobert Varga <nite@hq.sk>
Sun, 28 May 2023 15:00:36 +0000 (15:00 +0000)
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 <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTree.java
binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/ForwardingBindingDOMCodecServices.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5524augmentUses.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5845booleanKeyTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingCodecTest.java
yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyContentBuilder.java
yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibraryContentBuilderImpl.java
yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java
yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/LegacyYangLibraryFormatTest.java
yanglib/mdsal-yanglib-rfc8525/src/test/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportTest.java

index b1f3a38cf36c8a643badc215e73c6b2630039727..5986c2a652c5160ce409475dc0f2ef9a1aea7595 100644 (file)
@@ -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<Empty
         }
     }
 
+    /**
+     * Look up the codec for specified augmentation path.
+     *
+     * @param <A> 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
+     */
+    <A extends Augmentation<?>> @NonNull BindingAugmentationCodecTreeNode<A> getAugmentationCodec(
+        InstanceIdentifier<A> path);
+
+    /**
+     * Look up the codec for specified ordinary DataObject path.
+     *
+     * @param <T> 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
+     */
+    <T extends DataObject> @NonNull BindingDataObjectCodecTreeNode<T> getDataObjectCodec(InstanceIdentifier<T> path);
+
     /**
      * Look up the codec for specified path, constructing the {@link YangInstanceIdentifier} corresponding to it.
      *
index ac225ac44ba1885b5e8860090127dce4657ec0f1..f3a4c3f273378a287679b0bd73e27216be426a1d 100644 (file)
@@ -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 <A extends Augmentation<?>> BindingAugmentationCodecTreeNode<A> getAugmentationCodec(
+            final InstanceIdentifier<A> path) {
+        return delegate().getAugmentationCodec(path);
+    }
+
+    @Override
+    public <T extends DataObject> BindingDataObjectCodecTreeNode<T> getDataObjectCodec(
+            final InstanceIdentifier<T> path) {
+        return delegate().getDataObjectCodec(path);
+    }
+
     @Override
     public <T extends DataObject> CommonDataObjectCodecTreeNode<T> getSubtreeCodec(final InstanceIdentifier<T> path) {
         return delegate().getSubtreeCodec(path);
index e985940d3f02b9e7eecff92180da9ca2ee9dcea2..9842c0f0dde47c106fe2939cb7e6f9e0cff797ac 100644 (file)
@@ -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 <A extends Augmentation<?>> BindingAugmentationCodecTreeNode<A> getAugmentationCodec(
+            final InstanceIdentifier<A> path) {
+        final var codecContext = getCodecContextNode(path, null);
+        if (codecContext instanceof BindingAugmentationCodecTreeNode) {
+            return (BindingAugmentationCodecTreeNode<A>) codecContext;
+        }
+        throw new IllegalArgumentException(path + " does not refer to an Augmentation");
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T extends DataObject> BindingDataObjectCodecTreeNode<T> getDataObjectCodec(
+            final InstanceIdentifier<T> path) {
+        final var codecContext = getCodecContextNode(path, null);
+        if (codecContext instanceof BindingDataObjectCodecTreeNode) {
+            return (BindingDataObjectCodecTreeNode<T>) codecContext;
+        }
+        throw new IllegalArgumentException(path + " does not refer to a plain DataObject");
+    }
+
     @Override
     @SuppressWarnings("unchecked")
     public <T extends DataObject> CodecWithPath<T> getSubtreeCodecWithPath(final InstanceIdentifier<T> path) {
index 37792e83e67f38a3ab4307bb2cbbe97cdae1bd14..4f0d6cceff4effb3d51cf744327628306f6ada29 100644 (file)
@@ -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<Module4Main>) 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);
index 6fe7a53f27e27fc52953f49ed2b44de3fae0fd31..8a67255eb54e65153341247a756d8127a41dcf9f 100644 (file)
@@ -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<BooleanContainer>) 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);
     }
 }
index 3563522967936ec5f4358ea4a91dc4fa8fdd14ba..d5043d4979724379c06dfdedde501c8e45be17dc 100644 (file)
@@ -72,8 +72,8 @@ public class CachingCodecTest extends AbstractBindingCodecTest {
     @Before
     public void before() {
         super.before();
-        topNode = (BindingDataObjectCodecTreeNode<Top>) codecContext.getSubtreeCodec(TOP_PATH);
-        contNode = (BindingDataObjectCodecTreeNode<Cont>) codecContext.getSubtreeCodec(CONT_PATH);
+        topNode = codecContext.getDataObjectCodec(TOP_PATH);
+        contNode = codecContext.getDataObjectCodec(CONT_PATH);
     }
 
     private static Map<TopLevelListKey, TopLevelList> createList(final int num) {
index f2bc6d2dec80cd6c246ae271ae247cbd9207aedd..8416f6a77442910070891e55a8374fdee2d11b7c 100644 (file)
@@ -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<ModulesState>)
-            verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(ModulesState.class)));
+        legacyCodec = codecTree.getDataObjectCodec(InstanceIdentifier.create(ModulesState.class));
     }
 
     @Override
index a78455442f3955f92462293179bd63375f906e36..2f21db2fa182f03b92c1985f65c0f8f794bffc8c 100644 (file)
@@ -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<YangLibrary>)
-            verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(YangLibrary.class)));
+        codec = codecTree.getDataObjectCodec(InstanceIdentifier.create(YangLibrary.class));
     }
 
     @Override
index f06f963acbb200d52360a73692ff339f145d39cc..b62f1f95f4e7dfd71a912edc9794caaec6a7763d 100644 (file)
@@ -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<YangLibrary>)
-            verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(YangLibrary.class)));
-        legacyCodec = (BindingDataObjectCodecTreeNode<ModulesState>)
-            verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(ModulesState.class)));
+        codec = codecTree.getDataObjectCodec(InstanceIdentifier.create(YangLibrary.class));
+        legacyCodec = codecTree.getDataObjectCodec(InstanceIdentifier.create(ModulesState.class));
     }
 
     @Override
index e56460a03d152dcb3ef87a5c03e431737f8e4c2a..8ce1e350de571065d869622e14c63b4b744c1cb7 100644 (file)
@@ -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<ModulesState>)
-            codecTree.getSubtreeCodec(InstanceIdentifier.create(ModulesState.class));
+        final var legacyCodec = codecTree.getDataObjectCodec(InstanceIdentifier.create(ModulesState.class));
 
         final Optional<ContainerNode> legacyContent = yangLib.newContentBuilder()
             .defaultContext(runtimeContext.getEffectiveModelContext())
index fce3e08d65d534ccb0c95e9690a3f272ada38eb3..147acdacbbeb54446471923955b0a76cef62ffb3 100644 (file)
@@ -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<YangLibrary>)
-            codecTree.getSubtreeCodec(InstanceIdentifier.create(YangLibrary.class));
+        final var codec = codecTree.getDataObjectCodec(InstanceIdentifier.create(YangLibrary.class));
 
         final ContainerNode nonLegacyContent = yangLib.newContentBuilder()
                 .defaultContext(runtimeContext.getEffectiveModelContext()).formatYangLibraryContent();