Add interfaces for (Normalized)YangData codec 56/106756/1
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 29 Jun 2023 19:01:03 +0000 (21:01 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 29 Jun 2023 19:06:08 +0000 (21:06 +0200)
We are lacking the ability to transcode yang.binding.YangData to
NormalizedYangData. This patch adds the baseline interfaces required
along with disabled tests.

JIRA: MDSAL-805
Change-Id: I026240e553ffe3415466f94cb1e3f206eb5a3a0c
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-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingYangDataCodec.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingYangDataCodecTreeNode.java [new file with mode: 0644]
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/Mdsal805Test.java [new file with mode: 0644]

index 9f82888c2fdc05a5514389959e501889631d62ab..8bb6c0c74f54156e3bcdc9cd372db065f3001f78 100644 (file)
@@ -14,7 +14,9 @@ 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.binding.YangData;
 import org.opendaylight.yangtools.yang.common.Empty;
+import org.opendaylight.yangtools.yang.common.YangDataName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
@@ -105,4 +107,25 @@ public interface BindingCodecTree extends BindingDataObjectCodecTreeParent<Empty
      * @return A BindingInstanceIdentifierCodec instance.
      */
     @NonNull BindingInstanceIdentifierCodec getInstanceIdentifierCodec();
+
+    /**
+     * Get the {@link BindingYangDataCodecTreeNode} corresponding to a particular generated {@link YangData} type.
+     *
+     * @param <T> {@link YangData} type
+     * @param yangDataClass Class object of {@link YangData} type
+     * @return A {@link BindingYangDataCodecTreeNode}
+     * @throws NullPointerException if {@code yangDataClass} is {@code null}
+     * @throws IllegalArgumentException if the specified type is not known
+     */
+    <T extends YangData<T>> @NonNull BindingYangDataCodecTreeNode<T> getYangDataCodec(Class<T> yangDataClass);
+
+    /**
+     * Get the {@link BindingYangDataCodecTreeNode} corresponding to a particular {@link YangDataName}.
+     *
+     * @param yangDataName a {@link YangDataName}
+     * @return A {@link BindingYangDataCodecTreeNode}
+     * @throws NullPointerException if {@code yangDataName} is {@code null}
+     * @throws IllegalArgumentException if the specified name is not known
+     */
+    @NonNull BindingYangDataCodecTreeNode<?> getYangDataCodec(YangDataName yangDataName);
 }
diff --git a/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingYangDataCodec.java b/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingYangDataCodec.java
new file mode 100644 (file)
index 0000000..4f080f8
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.dom.codec.api;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.binding.YangData;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedYangData;
+
+/**
+ * A codec capable of translating RFC8040 {@code yang-data} values between their {@link NormalizedYangData} and
+ * {@link YangData} representation.
+ */
+public interface BindingYangDataCodec<T extends YangData<T>> extends Immutable {
+
+    @NonNull T toBinding(@NonNull NormalizedYangData dom);
+
+    @NonNull NormalizedYangData fromBinding(@NonNull T binding);
+}
diff --git a/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingYangDataCodecTreeNode.java b/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingYangDataCodecTreeNode.java
new file mode 100644 (file)
index 0000000..f7a26bd
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.dom.codec.api;
+
+import org.opendaylight.yangtools.yang.binding.YangData;
+
+/**
+ * A {@link BindingDataContainerCodecTreeNode} corresponding to a RFC8040 {@code yang-data}
+ * {@link BindingYangDataCodec}.
+ *
+ * @param <T> {@link YangData} type
+ */
+public interface BindingYangDataCodecTreeNode<T extends YangData<T>>
+        extends BindingDataContainerCodecTreeNode<T>, BindingYangDataCodec<T> {
+    // Just a combination of thwo interfaces
+}
index c434bef546850395c9a7b6aa3773b1a945544d58..f24235daec0adad7e265c249d0aa4cc6da4d5004 100644 (file)
@@ -19,6 +19,7 @@ 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;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingYangDataCodecTreeNode;
 import org.opendaylight.mdsal.binding.dom.codec.api.CommonDataObjectCodecTreeNode;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.yangtools.yang.binding.Action;
@@ -30,6 +31,8 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.Notification;
 import org.opendaylight.yangtools.yang.binding.RpcInput;
 import org.opendaylight.yangtools.yang.binding.RpcOutput;
+import org.opendaylight.yangtools.yang.binding.YangData;
+import org.opendaylight.yangtools.yang.common.YangDataName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
@@ -232,6 +235,16 @@ public abstract class ForwardingBindingDOMCodecServices extends ForwardingObject
         return delegate().getInstanceIdentifierCodec();
     }
 
+    @Override
+    public <T extends YangData<T>> BindingYangDataCodecTreeNode<T> getYangDataCodec(final Class<T> yangDataClass) {
+        return delegate().getYangDataCodec(yangDataClass);
+    }
+
+    @Override
+    public BindingYangDataCodecTreeNode<?> getYangDataCodec(final YangDataName yangDataName) {
+        return delegate().getYangDataCodec(yangDataName);
+    }
+
     @Override
     public BindingRuntimeContext getRuntimeContext() {
         return delegate().getRuntimeContext();
index af1a6d84dc0d99174b2799ec0ad3fec7c6d25f4c..67c2033c094f37ab8943e29e729c386884dffdd4 100644 (file)
@@ -45,6 +45,7 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNo
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingInstanceIdentifierCodec;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeWriterFactory;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingYangDataCodecTreeNode;
 import org.opendaylight.mdsal.binding.dom.codec.api.CommonDataObjectCodecTreeNode;
 import org.opendaylight.mdsal.binding.dom.codec.spi.AbstractBindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
@@ -69,7 +70,9 @@ import org.opendaylight.yangtools.yang.binding.Notification;
 import org.opendaylight.yangtools.yang.binding.OpaqueObject;
 import org.opendaylight.yangtools.yang.binding.RpcInput;
 import org.opendaylight.yangtools.yang.binding.RpcOutput;
+import org.opendaylight.yangtools.yang.binding.YangData;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.YangDataName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
@@ -169,6 +172,16 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
         return instanceIdentifierCodec;
     }
 
+    @Override
+    public <T extends YangData<T>> BindingYangDataCodecTreeNode<T> getYangDataCodec(final Class<T> yangDataClass) {
+        throw new UnsupportedOperationException("Not implemented yet");
+    }
+
+    @Override
+    public BindingYangDataCodecTreeNode<?> getYangDataCodec(final YangDataName yangDataName) {
+        throw new UnsupportedOperationException("Not implemented yet");
+    }
+
     @Override
     public DataContainerSerializer getEventStreamSerializer(final Class<?> type) {
         return serializers.getUnchecked(type);
diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Mdsal805Test.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Mdsal805Test.java
new file mode 100644 (file)
index 0000000..62d6056
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.dom.codec.impl;
+
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.mock;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.yang.gen.v1.urn.test.yang.data.demo.rev220222.YangDataWithContainer;
+import org.opendaylight.yang.gen.v1.urn.test.yang.data.demo.rev220222.YangDataWithContainerBuilder;
+import org.opendaylight.yang.gen.v1.urn.test.yang.data.demo.rev220222.yang.data.with.container.ContainerFromYangDataBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedYangData;
+
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
+public class Mdsal805Test extends AbstractBindingCodecTest {
+    @Ignore
+    @Test
+    public void testFromBinding() {
+        final var binding = new YangDataWithContainerBuilder()
+            .setContainerFromYangData(new ContainerFromYangDataBuilder().setStr("str").build())
+            .build();
+
+        final var dom = codecContext.getYangDataCodec(binding.implementedInterface()).fromBinding(binding);
+        assertNotNull(dom);
+    }
+
+    @Ignore
+    @Test
+    public void testToBinding() {
+        final var dom = mock(NormalizedYangData.class);
+
+        final var binding = codecContext.getYangDataCodec(YangDataWithContainer.NAME).toBinding(dom);
+        assertNotNull(binding);
+    }
+}